git.delta.rocks / fleet / refs/commits / d70668683ed2

difftreelog

source

crates/nix-eval/src/macros.rs2.5 KiBsourcehistory
1#[macro_export]2macro_rules! nix_expr_inner {3	//(@munch_object FIXME: value should be arbitrary nix_expr_inner input... Time to write proc-macro?4	(@obj($o:ident) $field:ident$(, $($tt:tt)*)?) => {{5		$o.insert(6			stringify!($field),7			$crate::Value::from($field),8		);9		$(nix_expr_inner!(@obj($o) $($tt)*);)?10	}};11	(@obj($o:ident) $field:ident: $v:expr$(, $($tt:tt)*)?) => {{12		$o.insert(13			stringify!($field),14			$crate::Value::from($v),15		);16		$(nix_expr_inner!(@obj($o) $($tt)*);)?17	}};18	(@obj($o:ident)) => {{}};19	(Obj { $($tt:tt)* }) => {{20		use $crate::{nix_expr_inner};21		let mut out = std::collections::hash_map::HashMap::new();22		nix_expr_inner!(@obj(out) $($tt)*);23		Value::new_attrs(out)24	}};25	(@field($o:ident) . $var:ident $($tt:tt)*) => {{26		$o.index_attr(stringify!($var));27		nix_expr_inner!(@field($o) $($tt)*);28	}};29	(@field($o:ident) [{ $v:expr }] $($tt:tt)*) => {{30		$o.push(Index::attr(&$v));31		nix_expr_inner!(@o($o) $($tt)*);32	}};33	(@field($o:ident) [ $($var:tt)+ ] $($tt:tt)*) => {{34		$o.push(Index::Expr($crate::nix_expr_inner!($($var)+)));35		nix_expr_inner!(@o($o) $($tt)*);36	}};37	(@field($o:ident) ($($var:tt)*) $($tt:tt)*) => {38		$o.push(Index::ExprApply($crate::nix_expr_inner!($($var)+)));39		nix_expr_inner!(@o($o) $($tt)*);40	};41	(@field($o:ident)) => {};42	($field:ident $($tt:tt)*) => {{43		use $crate::{nix_expr_inner};44		// might be used if indexed45		#[allow(unused_mut)]46		let mut out = $field.clone();47		nix_expr_inner!(@field(out) $($tt)*);48		out49	}};50	($v:expr) => {{51		$crate::Value::serialized(&$v)?52	}}53}54#[macro_export]55macro_rules! nix_expr {56	($($tt:tt)+) => {{57		use $crate::{macros::{NixExprBuilder}, Value, nix_expr_inner};58		let expr = nix_expr_inner!($($tt)+);59		Field::new(expr.session(), expr.out)60	}};61}6263#[macro_export]64macro_rules! nix_go {65	(@o($o:expr, $path:expr) . $var:ident $($tt:tt)*) => {{66		nix_go!(@o($o.get_field(stringify!($var)).context(concat!("getting nested ", $path))?, $path) $($tt)*)67	}};68	(@o($o:expr, $path:expr) [ $v:expr ] $($tt:tt)*) => {{69		nix_go!(@o($o.get_field($v).context(concat!("getting nested ", $path))?, $path) $($tt)*)70	}};71	(@o($o:expr, $path:expr) ($($var:tt)*) $($tt:tt)*) => {72		nix_go!(@o($o.call($crate::nix_expr_inner!($($var)+)).context(concat!("getting nested ", $path))?, $path) $($tt)*)73	};74	(@o($o:expr, $path:expr)) => {$o};75	($field:ident $($tt:tt)+) => {{76		use $crate::nix_go;77		use ::anyhow::Context;78		let out = $field.clone();79		nix_go!(@o(out, ::std::stringify!($($tt)*)) $($tt)*)80	}}81}82#[macro_export]83macro_rules! nix_go_json {84	($($tt:tt)*) => {{85		$crate::nix_go!($($tt)*).as_json()?86	}};87}