Sha256: c049930e60c80a0920bf69e05bf8d19dd7668481acfdf1cb4c7486f517ea5c1f

Contents?: true

Size: 1.93 KB

Versions: 4

Compression:

Stored size: 1.93 KB

Contents

# frozen_string_literal: true

require 'logger'

require_relative './compile'
require_relative './protocol'
require_relative './token'

# initialize raka
class Raka
  Pattern = Pattern
  attr_reader :logger

  def create_logger(level)
    @env.define_singleton_method :logger do
      logger = Logger.new(STDOUT)
      logger.level = level
      logger
    end
  end

  def define_token_creator(ext, ext_alias = nil)
    # closures
    env = @env
    options = @options
    scopes = @scopes
    @env.define_singleton_method(ext_alias || ext) do |*args|
      # Here the compiler are bound with @options so that when we change @options
      # using methods like scope in Rakefile, the subsequent rules defined will honor
      # the new settings
      # clone to fix the scopes when defining rule
      inline_scope_pattern = !args.empty? ? args[0] : nil
      Token.new(
        DSLCompiler.new(env, options), Context.new(ext, scopes.clone),
        [], inline_scope_pattern
      )
    end
  end

  def initialize(env, options)
    @env = env
    defaults = {
      output_types: [:csv], input_types: [],
      type_aliases: {},
      scopes: [],
      lang: ['lang/shell'],
      user_lang: []
    }
    @options = options = OpenStruct.new(defaults.merge(options))

    create_logger options.log_level || (ENV['LOG_LEVEL'] || Logger::INFO).to_i

    @options.input_types |= @options.output_types # any output can be used as intermediate
    # specify root of scopes in options, scopes will append to each root
    @scopes = options.scopes.empty? ? [] : [options.scopes]
    @options.lang.each { |path| load File::join(File::dirname(__FILE__), "#{path}/impl.rb") }
    @options.user_lang.each { |path| load path.to_s + '.rb' }

    # These are where the dsl starts
    @options.output_types.each do |ext|
      define_token_creator(ext, @options.type_aliases[ext])
    end
  end

  def scope(*names, &block)
    @scopes.push(names)
    block.call
    @scopes.pop
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
raka-0.3.3 lib/raka.rb
raka-0.3.2 lib/raka.rb
raka-0.3.1 lib/raka.rb
raka-0.2.3 lib/raka.rb