--- a/Cargo.lock +++ b/Cargo.lock @@ -205,6 +205,9 @@ [[package]] name = "jrsonnet-types" version = "0.3.3" +dependencies = [ + "peg", +] [[package]] name = "jsonnet" --- a/crates/jrsonnet-evaluator/src/builtin/mod.rs +++ b/crates/jrsonnet-evaluator/src/builtin/mod.rs @@ -1,8 +1,7 @@ use crate::{ equals, error::{Error::*, Result}, - evaluate, parse_args, primitive_equals, push, throw, - typed::CheckType, + parse_args, primitive_equals, push, throw, with_state, ArrValue, Context, FuncVal, LazyVal, Val, }; use format::{format_arr, format_obj}; --- a/crates/jrsonnet-evaluator/src/function.rs +++ b/crates/jrsonnet-evaluator/src/function.rs @@ -146,6 +146,8 @@ ($ctx: expr, $fn_name: expr, $args: expr, $total_args: expr, [ $($id: expr, $name: ident: $ty: expr $(=>$match: path)?);+ $(;)? ], $handler:block) => {{ + use $crate::{error::Error::*, throw, evaluate, push, typed::CheckType}; + let args = $args; if args.len() > $total_args { throw!(TooManyArgsFunctionHas($total_args)); --- a/crates/jrsonnet-evaluator/src/typed.rs +++ b/crates/jrsonnet-evaluator/src/typed.rs @@ -8,6 +8,18 @@ use jrsonnet_types::{ComplexValType, ValType}; use thiserror::Error; +#[macro_export] +macro_rules! unwrap_type { + ($desc: expr, $value: expr, $typ: expr => $match: path) => {{ + use $crate::{push, typed::CheckType}; + push(None, $desc, || Ok($typ.check(&$value)?))?; + match $value { + $match(v) => v, + _ => unreachable!(), + } + }} +} + #[derive(Debug, Error, Clone)] pub enum TypeError { #[error("expected {0}, got {1}")]