Sha256: 0eb82317089076ecab5935fd26181319c7e83eb53ce53335534afe956740a68e

Contents?: true

Size: 1.17 KB

Versions: 2

Compression:

Stored size: 1.17 KB

Contents

module ToFactory
  module Parsing
    ParseException = Class.new ::Exception

    class Syntax
      attr_accessor :contents

      def initialize(contents)
        @contents = contents
      end

      def multiple_factories?
        factories_sexp[0] == :block
      end

      def parse
        factories.map do |x|
          Representation.new(name_from(x), parent_from(x), to_ruby(x))
        end

      rescue Racc::ParseError, StringScanner::Error => e
        raise ParseException.new("Original exception: #{e.message}\n #{e.backtrace}\nToFactory Error parsing \n#{@contents}\n o")
      end

      def factories
        if multiple_factories?
          factories_sexp[1..-1]
        else
          [factories_sexp]
        end
      end

      def factories_sexp
        header? ?  sexp[3] : sexp
      end

      def name_from(sexp)
        sexp[1][3][1]
      end

      private

      def to_ruby(sexp)
        ruby2ruby.process sexp.deep_clone
      end

      def sexp
        @sexp ||= ruby_parser.process(@contents)
      end

      def ruby2ruby
        @ruby2ruby ||= Ruby2Ruby.new
      end

      def ruby_parser
        @ruby_parseer ||= RubyParser.new
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
to_factory-0.2.1 lib/to_factory/parsing/syntax.rb
to_factory-0.2.0 lib/to_factory/parsing/syntax.rb