TypeDB.create_classes! works for LWES::Events too
[lwes-ruby.git] / lib / lwes / class_maker.rb
blobf73513890b4bb3febefaa96d545d90134fb73b1c
1 module LWES::ClassMaker
2   def type_db(options)
3     options[:db] || begin
4       file = options[:file] or
5         raise ArgumentError, "TypeDB :db or ESF :file missing"
6       File.readable?(file) or
7         raise ArgumentError, "file #{file.inspect} not readable"
8       LWES::TypeDB.new(file)
9     end
10   end
12   def class_for(options, dump)
13     klass = options[:class] || begin
14       # make it easier to deal with single event files
15       events = (dump.keys -  [ :MetaEventInfo ])
16       events.size > 1 and
17           raise RuntimeError,
18                 "multiple event defs available: #{events.inspect}\n" \
19                 "pick one with :class"
20       events.first
21     end
22     name = options[:name] || klass.to_s
23     event_def = dump[name.to_sym] or
24       raise RuntimeError, "#{name.inspect} not defined in #{file}"
25     [ klass, name, event_def ]
26   end
28   def set_constants(tmp, db, klass, name, options)
29     tmp.const_set :TYPE_DB, db
30     tmp.const_set :NAME, name.to_s.dup.freeze
31     defaults = options[:defaults] || {}
32     tmp.const_set :DEFAULTS, defaults.dup
33     parent = options.include?(:parent) ? options[:parent] : Object
34     parent or return
35     components = klass.to_s.split(/::/)
36     components.each_with_index do |component, i|
37       if i == (components.size - 1)
38         tmp = parent.const_set(component, tmp)
39       else
40         parent = begin
41           parent.const_get(component)
42         rescue NameError
43           parent.const_set component, Module.new
44         end
45       end
46     end
47   end
48 end