class Addressable::Template

def transform_mapping(mapping, processor=nil)

Returns:
  • (Hash) - The transformed mapping.

Parameters:
  • processor (#validate, #transform) --
  • mapping (Hash) -- The mapping of variables to values.
def transform_mapping(mapping, processor=nil)
  return mapping.inject({}) do |accu, pair|
    name, value = pair
    value = value.to_s if Numeric === value || Symbol === value
    unless value.respond_to?(:to_ary) || value.respond_to?(:to_str)
      raise TypeError,
        "Can't convert #{value.class} into String or Array."
    end
    if Symbol === name
      name = name.to_s
    elsif name.respond_to?(:to_str)
      name = name.to_str
    else
      raise TypeError,
        "Can't convert #{name.class} into String."
    end
    value = value.respond_to?(:to_ary) ? value.to_ary : value.to_str
    # Handle unicode normalization
    if value.kind_of?(Array)
      value.map! { |val| Addressable::IDNA.unicode_normalize_kc(val) }
    else
      value = Addressable::IDNA.unicode_normalize_kc(value)
    end
    if processor == nil || !processor.respond_to?(:transform)
      # Handle percent escaping
      if value.kind_of?(Array)
        transformed_value = value.map do |val|
          Addressable::URI.encode_component(
            val, Addressable::URI::CharacterClasses::UNRESERVED)
        end
      else
        transformed_value = Addressable::URI.encode_component(
          value, Addressable::URI::CharacterClasses::UNRESERVED)
      end
    end
    # Process, if we've got a processor
    if processor != nil
      if processor.respond_to?(:validate)
        if !processor.validate(name, value)
          display_value = value.kind_of?(Array) ? value.inspect : value
          raise InvalidTemplateValueError,
            "#{name}=#{display_value} is an invalid template value."
        end
      end
      if processor.respond_to?(:transform)
        transformed_value = processor.transform(name, value)
        if transformed_value.kind_of?(Array)
          transformed_value.map! do |val|
            Addressable::IDNA.unicode_normalize_kc(val)
          end
        else
          transformed_value =
            Addressable::IDNA.unicode_normalize_kc(transformed_value)
        end
      end
    end
    accu[name] = transformed_value
    accu
  end
end