git.delta.rocks / jrsonnet / refs/commits / a682d0e384a2

difftreelog

feat unwrap_type macro

Yaroslav Bolyukin2021-01-25parent: #cebe933.patch.diff
in: master

4 files changed

modifiedCargo.lockdiffbeforeafterboth
205[[package]]205[[package]]
206name = "jrsonnet-types"206name = "jrsonnet-types"
207version = "0.3.3"207version = "0.3.3"
208dependencies = [
209 "peg",
210]
208211
209[[package]]212[[package]]
210name = "jsonnet"213name = "jsonnet"
modifiedcrates/jrsonnet-evaluator/src/builtin/mod.rsdiffbeforeafterboth
--- 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};
modifiedcrates/jrsonnet-evaluator/src/function.rsdiffbeforeafterboth
--- 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));
modifiedcrates/jrsonnet-evaluator/src/typed.rsdiffbeforeafterboth
--- 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}")]