diff --git a/src/parse/args.rs b/src/parse/args.rs index a10cc4e..da5b0c7 100644 --- a/src/parse/args.rs +++ b/src/parse/args.rs @@ -231,8 +231,24 @@ impl<'a> Parser<'a> { } } Value::Map(v) => { - for (name, arg) in v.entries() { - let name = name.to_css_string(val.span)?.to_string(); + // NOTE: we clone the map here because it is used + // later for error reporting. perhaps there is + // some way around this? + for (name, arg) in v.clone().entries() { + let name = match name { + Value::String(s, ..) => s, + _ => { + return Err(( + format!( + "{} is not a string in {}.", + name.inspect(val.span)?, + Value::Map(v).inspect(val.span)? + ), + val.span, + ) + .into()) + } + }; args.insert(CallArg::Named(name.into()), Ok(arg.span(val.span))); } } diff --git a/tests/splat.rs b/tests/splat.rs index e36e664..c5b3166 100644 --- a/tests/splat.rs +++ b/tests/splat.rs @@ -33,6 +33,13 @@ test!( }", "a {\n color: 1;\n}\n" ); +test!( + splat_map_quoted_string_as_key, + "a { + color: red((\"color\": red)...); + }", + "a {\n color: 255;\n}\n" +); error!( splat_missing_last_period, "@function foo($a) { @@ -53,3 +60,17 @@ error!( }", "Error: expected \")\"." ); +error!( + splat_map_with_non_string_key_map, + "a { + color: red(((a: b): red)...); + }", + "Error: (a: b) is not a string in ((a: b): red)." +); +error!( + splat_map_with_non_string_key_number, + "a { + color: red((1: red)...); + }", + "Error: 1 is not a string in (1: red)." +);