--- a/crates/jrsonnet-evaluator/src/builtin/mod.rs +++ b/crates/jrsonnet-evaluator/src/builtin/mod.rs @@ -453,7 +453,6 @@ }) } - fn builtin_join(context: Context, _loc: &Option, args: &ArgsDesc) -> Result { parse_args!(context, "join", args, 2, [ 0, sep: ty!((string | array)); @@ -559,7 +558,11 @@ } // faster -fn builtin_str_replace(context: Context, _loc: &Option, args: &ArgsDesc) -> Result { +fn builtin_str_replace( + context: Context, + _loc: &Option, + args: &ArgsDesc, +) -> Result { parse_args!(context, "strReplace", args, 3, [ 0, str: ty!(string) => Val::Str; 1, from: ty!(string) => Val::Str; --- a/crates/jrsonnet-evaluator/src/typed.rs +++ b/crates/jrsonnet-evaluator/src/typed.rs @@ -143,7 +143,7 @@ ComplexValType::Any => Ok(()), ComplexValType::Simple(s) => s.check(value), ComplexValType::Char => match value { - Val::Str(s) if s.chars().count() == 1 => Ok(()), + Val::Str(s) if s.len() == 1 || s.chars().count() == 1 => Ok(()), v => Err(TypeError::ExpectedGot(self.clone(), v.value_type()).into()), }, ComplexValType::BoundedNumber(from, to) => { --- a/crates/jrsonnet-types/src/lib.rs +++ b/crates/jrsonnet-types/src/lib.rs @@ -69,7 +69,10 @@ "string & number | object & null" ); assert_eq!(format!("{}", ty!((string | array))), "string | array"); - assert_eq!(format!("{}", ty!(((string & number) | array))), "string & number | array"); + assert_eq!( + format!("{}", ty!(((string & number) | array))), + "string & number | array" + ); } #[derive(Debug, Clone, Copy, PartialEq, Eq)] @@ -190,7 +193,7 @@ } } -peg::parser!{ +peg::parser! { pub grammar parser() for str { rule number() -> f64 = n:$(['0'..='9']+) { n.parse().unwrap() } @@ -204,7 +207,7 @@ rule simple_array_ty() -> ComplexValType = "array" { ComplexValType::Simple(ValType::Arr) } rule simple_object_ty() -> ComplexValType = "object" { ComplexValType::Simple(ValType::Obj) } rule simple_function_ty() -> ComplexValType = "function" { ComplexValType::Simple(ValType::Func) } - + rule array_ty() -> ComplexValType = "Array<" t:ty() ">" { ComplexValType::Array(Box::new(t)) } @@ -258,16 +261,27 @@ #[test] fn precedence() { - assert_eq!(parser::ty("(any & any) | (any | any) & any").unwrap().to_string(), "any & any | (any | any) & any"); + assert_eq!( + parser::ty("(any & any) | (any | any) & any") + .unwrap() + .to_string(), + "any & any | (any | any) & any" + ); } #[test] fn array() { assert_eq!(parser::ty("Array").unwrap().to_string(), "array"); - assert_eq!(parser::ty("Array").unwrap().to_string(), "Array"); + assert_eq!( + parser::ty("Array").unwrap().to_string(), + "Array" + ); } #[test] fn bounded_number() { - assert_eq!(parser::ty("BoundedNumber<1, 2>").unwrap().to_string(), "BoundedNumber<1, 2>"); + assert_eq!( + parser::ty("BoundedNumber<1, 2>").unwrap().to_string(), + "BoundedNumber<1, 2>" + ); } -} \ No newline at end of file +}