Sha256: 36b0c14c561561c8be6c9d7cd1ab4c23b3216fd1be37cc02d9413f8dc9d9e9b1

Contents?: true

Size: 1.23 KB

Versions: 3

Compression:

Stored size: 1.23 KB

Contents

# frozen_string_literal: true

class Template
  EMPTY_STRING = ""
  GLOBALS = %i[io context object].freeze
  DEFAULT_TIMEOUT = 0

  def initialize(input, io: ::StringIO.new, timeout: DEFAULT_TIMEOUT, ruby: {})
    @input = input
    @parsed =
      Timeout.timeout(timeout) { ::Template::Parser.parse(@input).to_raw }
    @io = io
    @timeout = timeout || DEFAULT_TIMEOUT
    @ruby =
      Timeout.timeout(timeout) do
        ::Code::Ruby.to_code(ruby || {}).code_to_context
      end
  end

  def self.evaluate(
    input,
    context = "",
    io: ::StringIO.new,
    timeout: DEFAULT_TIMEOUT,
    ruby: {}
  )
    new(input, io:, timeout:, ruby:).evaluate(context)
  end

  def evaluate(context = "")
    Timeout.timeout(timeout) do
      context =
        if context == EMPTY_STRING
          ::Code::Object::Context.new
        else
          ::Code.evaluate(context, timeout:, io:, ruby:).code_to_context
        end

      unless context.is_a?(::Code::Object::Context)
        raise(Error::IncompatibleContext)
      end

      context = context.merge(ruby)

      ::Template::Node::Template.new(parsed).evaluate(context:, io:)

      io.is_a?(::StringIO) ? io.string : nil
    end
  end

  private

  attr_reader :input, :parsed, :timeout, :io, :ruby
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
template-ruby-0.6.6 lib/template.rb
template-ruby-0.6.5 lib/template.rb
template-ruby-0.6.4 lib/template.rb