Sha256: 9e372d8754f2b24f4ff7c1c9b93e2a4b8f1bc8cd3b5d04fccf99806b58100dd1

Contents?: true

Size: 1.07 KB

Versions: 8

Compression:

Stored size: 1.07 KB

Contents

# frozen_string_literal: true

class Code
  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) { ::Code::Parser.parse(@input).to_raw }
    @io = io
    @timeout = timeout || DEFAULT_TIMEOUT
    @ruby = ::Code::Ruby.to_code(ruby || {}).code_to_context
  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
          Object::Context.new
        else
          Code.evaluate(context, timeout:, io:, ruby:).code_to_context
        end

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

      context = context.merge(ruby)

      Node::Code.new(parsed).evaluate(context:, io:)
    end
  end

  private

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

Version data entries

8 entries across 8 versions & 1 rubygems

Version Path
code-ruby-0.6.7 lib/code.rb
code-ruby-0.6.6 lib/code.rb
code-ruby-0.6.5 lib/code.rb
code-ruby-0.6.4 lib/code.rb
code-ruby-0.6.3 lib/code.rb
code-ruby-0.6.2 lib/code.rb
code-ruby-0.6.1 lib/code.rb
code-ruby-0.6.0 lib/code.rb