module SassC::Script::ValueConversion

def self.from_native(value, options)

def self.from_native(value, options)
  case value
  when ::Sass::Value::Null::NULL
    nil
  when ::Sass::Value::Boolean
    ::SassC::Script::Value::Bool.new(value.to_bool)
  when ::Sass::Value::Color
    case value.space
    when 'hsl', 'hwb'
      value = value.to_space('hsl')
      ::SassC::Script::Value::Color.new(
        hue: value.channel('hue'),
        saturation: value.channel('saturation'),
        lightness: value.channel('lightness'),
        alpha: value.alpha
      )
    else
      value = value.to_space('rgb')
      ::SassC::Script::Value::Color.new(
        red: value.channel('red'),
        green: value.channel('green'),
        blue: value.channel('blue'),
        alpha: value.alpha
      )
    end
  when ::Sass::Value::List
    ::SassC::Script::Value::List.new(
      value.to_a.map { |element| from_native(element, options) },
      separator: case value.separator
                 when ','
                   :comma
                 when ' '
                   :space
                 else
                   raise UnsupportedValue, "Sass list separator #{value.separator} unsupported"
                 end,
      bracketed: value.bracketed?
    )
  when ::Sass::Value::Map
    ::SassC::Script::Value::Map.new(
      value.contents.each_with_object({}) { |(k, v), h| h[from_native(k, options)] = from_native(v, options) }
    )
  when ::Sass::Value::Number
    ::SassC::Script::Value::Number.new(
      value.value,
      value.numerator_units,
      value.denominator_units
    )
  when ::Sass::Value::String
    ::SassC::Script::Value::String.new(
      value.text,
      value.quoted? ? :string : :identifier
    )
  else
    raise UnsupportedValue, "Sass argument of type #{value.class.name.split('::').last} unsupported"
  end
end

def self.to_native(value)

def self.to_native(value)
  case value
  when nil
    ::Sass::Value::Null::NULL
  when ::SassC::Script::Value::Bool
    ::Sass::Value::Boolean.new(value.to_bool)
  when ::SassC::Script::Value::Color
    if value.rgba?
      ::Sass::Value::Color.new(
        red: value.red,
        green: value.green,
        blue: value.blue,
        alpha: value.alpha,
        space: 'rgb'
      )
    elsif value.hlsa?
      ::Sass::Value::Color.new(
        hue: value.hue,
        saturation: value.saturation,
        lightness: value.lightness,
        alpha: value.alpha,
        space: 'hsl'
      )
    else
      raise UnsupportedValue, "Sass color mode #{value.instance_eval { @mode }} unsupported"
    end
  when ::SassC::Script::Value::List
    ::Sass::Value::List.new(
      value.to_a.map { |element| to_native(element) },
      separator: case value.separator
                 when :comma
                   ','
                 when :space
                   ' '
                 else
                   raise UnsupportedValue, "Sass list separator #{value.separator} unsupported"
                 end,
      bracketed: value.bracketed
    )
  when ::SassC::Script::Value::Map
    ::Sass::Value::Map.new(
      value.value.each_with_object({}) { |(k, v), h| h[to_native(k)] = to_native(v) }
    )
  when ::SassC::Script::Value::Number
    ::Sass::Value::Number.new(
      value.value, {
        numerator_units: value.numerator_units,
        denominator_units: value.denominator_units
      }
    )
  when ::SassC::Script::Value::String
    ::Sass::Value::String.new(
      value.value,
      quoted: value.type != :identifier
    )
  else
    raise UnsupportedValue, "Sass return type #{value.class.name.split('::').last} unsupported"
  end
end