class EacRubyUtils::CustomFormat::String
def initialize(format, string)
def initialize(format, string) @format = format @string = string end
def mapping
def mapping @mapping ||= format.mapping.select do |k, _v| sequences.include?(k) end end
def sequences
def sequences @sequences ||= string.scan(SEQUENCE_PATTERN).map(&:first).uniq.map(&:to_sym) end
def source_object_value(object, method)
def source_object_value(object, method) return object.send(method) if object.respond_to?(method) return object[method] if object.respond_to?('[]') raise ::ArgumentError, "Methods \"#{method}\" or \"[]\" not found for #{object}" end
def with(source_object)
def with(source_object) r = string mapping.each do |key, method| r = r.gsub(/%#{::Regexp.quote(key)}/, source_object_value(source_object, method).to_s) end r.gsub('%%', '%') end