62 lines
1.4 KiB
Ruby
62 lines
1.4 KiB
Ruby
module Rscons
|
|
class VarSet
|
|
attr_reader :vars
|
|
|
|
def initialize(vars = {})
|
|
@vars = vars
|
|
end
|
|
|
|
def [](key, type = nil)
|
|
val = @vars[key]
|
|
if type == :array and val.is_a?(String)
|
|
[val]
|
|
elsif type == :string and val.is_a?(Array)
|
|
val.first
|
|
else
|
|
val
|
|
end
|
|
end
|
|
|
|
def []=(key, val)
|
|
@vars[key] = val
|
|
end
|
|
|
|
def append(values)
|
|
values = values.vars if values.is_a?(VarSet)
|
|
@vars.merge!(values)
|
|
self
|
|
end
|
|
|
|
def merge(other = {})
|
|
VarSet.new(Marshal.load(Marshal.dump(@vars))).append(other)
|
|
end
|
|
alias_method :clone, :merge
|
|
|
|
def expand_varref(varref)
|
|
if varref.is_a?(Array)
|
|
varref.map do |ent|
|
|
expand_varref(ent)
|
|
end.flatten
|
|
else
|
|
if varref =~ /^(.*)\$\[(\w+)\](.*)$/
|
|
# expand array with given prefix, suffix
|
|
prefix, varname, suffix = $1, $2, $3
|
|
varval = @vars[varname]
|
|
unless varval.is_a?(Array)
|
|
raise "Array expected for $#{varname}"
|
|
end
|
|
varval.map {|e| "#{prefix}#{e}#{suffix}"}
|
|
elsif varref =~ /^\$(.*)$/
|
|
# expand a single variable reference
|
|
varname = $1
|
|
varval = @vars[varname]
|
|
varval or raise "Could not find variable #{varname.inspect}"
|
|
expand_varref(varval)
|
|
else
|
|
varref
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|