difftreelog
feat make type descriptions look more js-like
in: master
2 files changed
crates/jrsonnet-evaluator/src/builtin/mod.rsdiffbeforeafterboth797980fn builtin_length(context: Context, _loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {80fn builtin_length(context: Context, _loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {81 parse_args!(context, "length", args, 1, [81 parse_args!(context, "length", args, 1, [82 0, x: ty!((str | obj | [any]));82 0, x: ty!((string | object | array));83 ], {83 ], {84 Ok(match x {84 Ok(match x {85 Val::Str(n) => Val::Num(n.chars().count() as f64),85 Val::Str(n) => Val::Num(n.chars().count() as f64),109 args: &ArgsDesc,109 args: &ArgsDesc,110) -> Result<Val> {110) -> Result<Val> {111 parse_args!(context, "makeArray", args, 2, [111 parse_args!(context, "makeArray", args, 2, [112 0, sz: ty!(number((Some(0.0))..(None))) => Val::Num;112 0, sz: ty!(BoundedNumber<(Some(0.0)), (None)>) => Val::Num;113 1, func: ty!(fn.any) => Val::Func;113 1, func: ty!(function) => Val::Func;114 ], {114 ], {115 let mut out = Vec::with_capacity(sz as usize);115 let mut out = Vec::with_capacity(sz as usize);116 for i in 0..sz as usize {116 for i in 0..sz as usize {141 args: &ArgsDesc,141 args: &ArgsDesc,142) -> Result<Val> {142) -> Result<Val> {143 parse_args!(context, "objectFieldsEx", args, 2, [143 parse_args!(context, "objectFieldsEx", args, 2, [144 0, obj: ty!(obj) => Val::Obj;144 0, obj: ty!(object) => Val::Obj;145 1, inc_hidden: ty!(bool) => Val::Bool;145 1, inc_hidden: ty!(boolean) => Val::Bool;146 ], {146 ], {147 let mut out = obj.fields_visibility()147 let mut out = obj.fields_visibility()148 .into_iter()148 .into_iter()160 args: &ArgsDesc,160 args: &ArgsDesc,161) -> Result<Val> {161) -> Result<Val> {162 parse_args!(context, "objectHasEx", args, 3, [162 parse_args!(context, "objectHasEx", args, 3, [163 0, obj: ty!(obj) => Val::Obj;163 0, obj: ty!(object) => Val::Obj;164 1, f: ty!(str) => Val::Str;164 1, f: ty!(string) => Val::Str;165 2, inc_hidden: ty!(bool) => Val::Bool;165 2, inc_hidden: ty!(boolean) => Val::Bool;166 ], {166 ], {167 Ok(Val::Bool(167 Ok(Val::Bool(168 obj.fields_visibility()168 obj.fields_visibility()176// faster176// faster177fn builtin_slice(context: Context, _loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {177fn builtin_slice(context: Context, _loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {178 parse_args!(context, "slice", args, 4, [178 parse_args!(context, "slice", args, 4, [179 0, indexable: ty!((str | [any]));179 0, indexable: ty!((string | array));180 1, index: ty!((num | null));180 1, index: ty!((number | null));181 2, end: ty!((num | null));181 2, end: ty!((number | null));182 3, step: ty!((num | null));182 3, step: ty!((number | null));183 ], {183 ], {184 let index = match index {184 let index = match index {185 Val::Num(v) => v as usize,185 Val::Num(v) => v as usize,238238239fn builtin_modulo(context: Context, _loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {239fn builtin_modulo(context: Context, _loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {240 parse_args!(context, "modulo", args, 2, [240 parse_args!(context, "modulo", args, 2, [241 0, a: ty!(num) => Val::Num;241 0, a: ty!(number) => Val::Num;242 1, b: ty!(num) => Val::Num;242 1, b: ty!(number) => Val::Num;243 ], {243 ], {244 Ok(Val::Num(a % b))244 Ok(Val::Num(a % b))245 })245 })246}246}247247248fn builtin_mod(context: Context, _loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {248fn builtin_mod(context: Context, _loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {249 parse_args!(context, "mod", args, 2, [249 parse_args!(context, "mod", args, 2, [250 0, a: ty!((num | str));250 0, a: ty!((number | string));251 1, b: ty!(any);251 1, b: ty!(any);252 ], {252 ], {253 match (a, b) {253 match (a, b) {260260261fn builtin_floor(context: Context, _loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {261fn builtin_floor(context: Context, _loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {262 parse_args!(context, "floor", args, 1, [262 parse_args!(context, "floor", args, 1, [263 0, x: ty!(num) => Val::Num;263 0, x: ty!(number) => Val::Num;264 ], {264 ], {265 Ok(Val::Num(x.floor()))265 Ok(Val::Num(x.floor()))266 })266 })267}267}268268269fn builtin_log(context: Context, _loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {269fn builtin_log(context: Context, _loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {270 parse_args!(context, "log", args, 1, [270 parse_args!(context, "log", args, 1, [271 0, n: ty!(num) => Val::Num;271 0, n: ty!(number) => Val::Num;272 ], {272 ], {273 Ok(Val::Num(n.ln()))273 Ok(Val::Num(n.ln()))274 })274 })275}275}276276277fn builtin_pow(context: Context, _loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {277fn builtin_pow(context: Context, _loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {278 parse_args!(context, "pow", args, 2, [278 parse_args!(context, "pow", args, 2, [279 0, x: ty!(num) => Val::Num;279 0, x: ty!(number) => Val::Num;280 1, n: ty!(num) => Val::Num;280 1, n: ty!(number) => Val::Num;281 ], {281 ], {282 Ok(Val::Num(x.powf(n)))282 Ok(Val::Num(x.powf(n)))283 })283 })284}284}285285286fn builtin_ext_var(context: Context, _loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {286fn builtin_ext_var(context: Context, _loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {287 parse_args!(context, "extVar", args, 1, [287 parse_args!(context, "extVar", args, 1, [288 0, x: ty!(str) => Val::Str;288 0, x: ty!(string) => Val::Str;289 ], {289 ], {290 Ok(with_state(|s| s.settings().ext_vars.get(&x).cloned()).ok_or(UndefinedExternalVariable(x))?)290 Ok(with_state(|s| s.settings().ext_vars.get(&x).cloned()).ok_or(UndefinedExternalVariable(x))?)291 })291 })292}292}293293294fn builtin_native(context: Context, _loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {294fn builtin_native(context: Context, _loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {295 parse_args!(context, "native", args, 1, [295 parse_args!(context, "native", args, 1, [296 0, x: ty!(str) => Val::Str;296 0, x: ty!(string) => Val::Str;297 ], {297 ], {298 Ok(with_state(|s| s.settings().ext_natives.get(&x).cloned()).map(|v| Val::Func(Rc::new(FuncVal::NativeExt(x.clone(), v)))).ok_or(UndefinedExternalFunction(x))?)298 Ok(with_state(|s| s.settings().ext_natives.get(&x).cloned()).map(|v| Val::Func(Rc::new(FuncVal::NativeExt(x.clone(), v)))).ok_or(UndefinedExternalFunction(x))?)299 })299 })300}300}301301302fn builtin_filter(context: Context, _loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {302fn builtin_filter(context: Context, _loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {303 parse_args!(context, "filter", args, 2, [303 parse_args!(context, "filter", args, 2, [304 0, func: ty!(fn.any) => Val::Func;304 0, func: ty!(function) => Val::Func;305 1, arr: ty!([any]) => Val::Arr;305 1, arr: ty!(array) => Val::Arr;306 ], {306 ], {307 let mut out = Vec::new();307 let mut out = Vec::new();308 for item in arr.iter() {308 for item in arr.iter() {319319320fn builtin_foldl(context: Context, _loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {320fn builtin_foldl(context: Context, _loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {321 parse_args!(context, "foldl", args, 3, [321 parse_args!(context, "foldl", args, 3, [322 0, func: ty!(fn.any) => Val::Func;322 0, func: ty!(function) => Val::Func;323 1, arr: ty!([any]) => Val::Arr;323 1, arr: ty!(array) => Val::Arr;324 2, init: ty!(any);324 2, init: ty!(any);325 ], {325 ], {326 let mut acc = init;326 let mut acc = init;333333334fn builtin_foldr(context: Context, _loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {334fn builtin_foldr(context: Context, _loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {335 parse_args!(context, "foldr", args, 3, [335 parse_args!(context, "foldr", args, 3, [336 0, func: ty!(fn.any) => Val::Func;336 0, func: ty!(function) => Val::Func;337 1, arr: ty!([any]) => Val::Arr;337 1, arr: ty!(array) => Val::Arr;338 2, init: ty!(any);338 2, init: ty!(any);339 ], {339 ], {340 let mut acc = init;340 let mut acc = init;352 args: &ArgsDesc,352 args: &ArgsDesc,353) -> Result<Val> {353) -> Result<Val> {354 parse_args!(context, "sort", args, 2, [354 parse_args!(context, "sort", args, 2, [355 0, arr: ty!([any]) => Val::Arr;355 0, arr: ty!(array) => Val::Arr;356 1, keyF: ty!(fn.any) => Val::Func;356 1, keyF: ty!(function) => Val::Func;357 ], {357 ], {358 if arr.len() <= 1 {358 if arr.len() <= 1 {359 return Ok(Val::Arr(arr))359 return Ok(Val::Arr(arr))365// faster365// faster366fn builtin_format(context: Context, _loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {366fn builtin_format(context: Context, _loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {367 parse_args!(context, "format", args, 2, [367 parse_args!(context, "format", args, 2, [368 0, str: ty!(str) => Val::Str;368 0, str: ty!(string) => Val::Str;369 1, vals: ty!(any)369 1, vals: ty!(any)370 ], {370 ], {371 std_format(str, vals)371 std_format(str, vals)374374375fn builtin_range(context: Context, _loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {375fn builtin_range(context: Context, _loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {376 parse_args!(context, "range", args, 2, [376 parse_args!(context, "range", args, 2, [377 0, from: ty!(num) => Val::Num;377 0, from: ty!(number) => Val::Num;378 1, to: ty!(num) => Val::Num;378 1, to: ty!(number) => Val::Num;379 ], {379 ], {380 let mut out = Vec::with_capacity((1+to as usize-from as usize).max(0));380 let mut out = Vec::with_capacity((1+to as usize-from as usize).max(0));381 for i in from as usize..=to as usize {381 for i in from as usize..=to as usize {387387388fn builtin_char(context: Context, _loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {388fn builtin_char(context: Context, _loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {389 parse_args!(context, "char", args, 1, [389 parse_args!(context, "char", args, 1, [390 0, n: ty!(num) => Val::Num;390 0, n: ty!(number) => Val::Num;391 ], {391 ], {392 let mut out = String::new();392 let mut out = String::new();393 out.push(std::char::from_u32(n as u32).ok_or_else(||393 out.push(std::char::from_u32(n as u32).ok_or_else(||403 args: &ArgsDesc,403 args: &ArgsDesc,404) -> Result<Val> {404) -> Result<Val> {405 parse_args!(context, "encodeUTF8", args, 1, [405 parse_args!(context, "encodeUTF8", args, 1, [406 0, str: ty!(str) => Val::Str;406 0, str: ty!(string) => Val::Str;407 ], {407 ], {408 Ok(Val::Arr((str.bytes().map(|b| Val::Num(b as f64)).collect::<Vec<Val>>()).into()))408 Ok(Val::Arr((str.bytes().map(|b| Val::Num(b as f64)).collect::<Vec<Val>>()).into()))409 })409 })410}410}411411412fn builtin_md5(context: Context, _loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {412fn builtin_md5(context: Context, _loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {413 parse_args!(context, "md5", args, 1, [413 parse_args!(context, "md5", args, 1, [414 0, str: ty!(str) => Val::Str;414 0, str: ty!(string) => Val::Str;415 ], {415 ], {416 Ok(Val::Str(format!("{:x}", md5::compute(&str.as_bytes())).into()))416 Ok(Val::Str(format!("{:x}", md5::compute(&str.as_bytes())).into()))417 })417 })418}418}419419420fn builtin_trace(context: Context, loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {420fn builtin_trace(context: Context, loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {421 parse_args!(context, "trace", args, 2, [421 parse_args!(context, "trace", args, 2, [422 0, str: ty!(str) => Val::Str;422 0, str: ty!(string) => Val::Str;423 1, rest: ty!(any);423 1, rest: ty!(any);424 ], {424 ], {425 eprint!("TRACE:");425 eprint!("TRACE:");436436437fn builtin_base64(context: Context, _loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {437fn builtin_base64(context: Context, _loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {438 parse_args!(context, "base64", args, 1, [438 parse_args!(context, "base64", args, 1, [439 0, input: ty!((str | [num]));439 0, input: ty!((string | (Array<number>)));440 ], {440 ], {441 Ok(Val::Str(match input {441 Ok(Val::Str(match input {442 Val::Str(s) => {442 Val::Str(s) => {454455455fn builtin_join(context: Context, _loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {456fn builtin_join(context: Context, _loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {456 parse_args!(context, "join", args, 2, [457 parse_args!(context, "join", args, 2, [457 0, sep: ty!((str | [any]));458 0, sep: ty!((string | array));458 1, arr: ty!([any]) => Val::Arr;459 1, arr: ty!(array) => Val::Arr;459 ], {460 ], {460 Ok(match sep {461 Ok(match sep {461 Val::Arr(joiner_items) => {462 Val::Arr(joiner_items) => {516 args: &ArgsDesc,517 args: &ArgsDesc,517) -> Result<Val> {518) -> Result<Val> {518 parse_args!(context, "escapeStringJson", args, 1, [519 parse_args!(context, "escapeStringJson", args, 1, [519 0, str_: ty!(str) => Val::Str;520 0, str_: ty!(string) => Val::Str;520 ], {521 ], {521 Ok(Val::Str(escape_string_json(&str_).into()))522 Ok(Val::Str(escape_string_json(&str_).into()))522 })523 })530) -> Result<Val> {531) -> Result<Val> {531 parse_args!(context, "manifestJsonEx", args, 2, [532 parse_args!(context, "manifestJsonEx", args, 2, [532 0, value: ty!(any);533 0, value: ty!(any);533 1, indent: ty!(str) => Val::Str;534 1, indent: ty!(string) => Val::Str;534 ], {535 ], {535 Ok(Val::Str(manifest_json_ex(&value, &ManifestJsonOptions {536 Ok(Val::Str(manifest_json_ex(&value, &ManifestJsonOptions {536 padding: &indent,537 padding: &indent,542// faster543// faster543fn builtin_reverse(context: Context, _loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {544fn builtin_reverse(context: Context, _loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {544 parse_args!(context, "reverse", args, 1, [545 parse_args!(context, "reverse", args, 1, [545 0, value: ty!([any]) => Val::Arr;546 0, value: ty!(array) => Val::Arr;546 ], {547 ], {547 Ok(Val::Arr(value.reversed()))548 Ok(Val::Arr(value.reversed()))548 })549 })crates/jrsonnet-types/src/lib.rsdiffbeforeafterboth--- a/crates/jrsonnet-types/src/lib.rs
+++ b/crates/jrsonnet-types/src/lib.rs
@@ -2,39 +2,37 @@
#[macro_export]
macro_rules! ty {
- ([$inner:tt]) => {{
- use $crate::{ComplexValType, ValType, ty};
- static VAL: &'static ComplexValType = &ty!($inner);
- match VAL {
- ComplexValType::Any => ComplexValType::Simple(ValType::Arr),
- _ => ComplexValType::ArrayRef(&VAL),
- }
+ ((Array<number>)) => {{
+ $crate::ComplexValType::ArrayRef(&$crate::ComplexValType::Simple($crate::ValType::Num))
}};
- (bool) => {
+ (array) => {
+ $crate::ComplexValType::Simple($crate::ValType::Arr)
+ };
+ (boolean) => {
$crate::ComplexValType::Simple($crate::ValType::Bool)
};
(null) => {
$crate::ComplexValType::Simple($crate::ValType::Null)
};
- (str) => {
+ (string) => {
$crate::ComplexValType::Simple($crate::ValType::Str)
};
(char) => {
$crate::ComplexValType::Char
};
- (num) => {
+ (number) => {
$crate::ComplexValType::Simple($crate::ValType::Num)
};
- (number(($min:expr)..($max:expr))) => {{
+ (BoundedNumber<($min:expr), ($max:expr)>) => {{
$crate::ComplexValType::BoundedNumber($min, $max)
}};
- (obj) => {
+ (object) => {
$crate::ComplexValType::Simple($crate::ValType::Obj)
};
(any) => {
$crate::ComplexValType::Any
};
- (fn.any) => {
+ (function) => {
$crate::ComplexValType::Simple($crate::ValType::Func)
};
(($($a:tt) |+)) => {{
@@ -54,24 +52,24 @@
#[test]
fn test() {
assert_eq!(
- ty!([num]),
+ ty!((Array<number>)),
ComplexValType::ArrayRef(&ComplexValType::Simple(ValType::Num))
);
- assert_eq!(ty!([any]), ComplexValType::Simple(ValType::Arr));
+ assert_eq!(ty!(array), ComplexValType::Simple(ValType::Arr));
assert_eq!(ty!(any), ComplexValType::Any);
assert_eq!(
- ty!((str | num)),
+ ty!((string | number)),
ComplexValType::UnionRef(&[
ComplexValType::Simple(ValType::Str),
ComplexValType::Simple(ValType::Num)
])
);
assert_eq!(
- format!("{}", ty!(((str & num) | (obj & null)))),
+ format!("{}", ty!(((string & number) | (object & null)))),
"string & number | object & null"
);
- assert_eq!(format!("{}", ty!((str | [any]))), "string | array");
- assert_eq!(format!("{}", ty!(((str & num) | [any]))), "string & number | array");
+ assert_eq!(format!("{}", ty!((string | array))), "string | array");
+ assert_eq!(format!("{}", ty!(((string & number) | array))), "string & number | array");
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]