class Patm::Pattern::Struct::Builder

Public Class Methods

new(klass) click to toggle source
# File lib/patm.rb, line 393
def initialize(klass)
  raise ArgumentError, "#{klass} is not Struct" unless klass.ancestors.include?(::Struct)
  @klass = klass
end

Public Instance Methods

call(*args) click to toggle source

member_1_pat -> member_2_pat -> … -> Pattern {member:Symbol => pattern} -> Pattern

# File lib/patm.rb, line 400
def call(*args)
  if args.size == 1 && args.first.is_a?(::Hash)
    hash = args.first
    hash.keys.each do|k|
      raise ArgumentError, "#{k.inspect} is not member of #{@klass}" unless @klass.members.include?(k)
    end
    Struct.new(@klass, hash.each_with_object({}){|(k, plain), h|
      h[k] = Pattern.build_from(plain)
    })
  else
    raise ArgumentError, "Member size not match: expected #{@klass.members.size} but #{args.size}" unless args.size == @klass.members.size
    Struct.new(@klass, ::Hash[*@klass.members.zip(args.map{|a| Pattern.build_from(a) }).flatten(1)])
  end
end