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

difftreelog

refactor nix-eval macro-support

loprwqwnYaroslav Bolyukin2026-03-12parent: #493bea4.patch.diff
in: trunk

3 files changed

modifiedcmds/repl-plugin-unstable/src/lib.rsdiffbeforeafterboth
--- a/cmds/repl-plugin-unstable/src/lib.rs
+++ b/cmds/repl-plugin-unstable/src/lib.rs
@@ -1,5 +1,6 @@
 use fleet_base::primops::init_primops;
 
+/// SAFETY: expected plugin dynamic library entry point
 #[unsafe(no_mangle)]
 fn nix_plugin_entry() {
 	init_primops();
modifiedcrates/nix-eval/src/lib.rsdiffbeforeafterboth
--- a/crates/nix-eval/src/lib.rs
+++ b/crates/nix-eval/src/lib.rs
@@ -46,6 +46,14 @@
 pub mod logging;
 #[doc(hidden)]
 pub mod macros;
+
+#[doc(hidden)]
+pub mod __macro_support {
+	pub use std::collections::hash_map::HashMap;
+
+	pub use anyhow::Context;
+	pub use tokio::task::block_in_place;
+}
 pub mod util;
 
 #[allow(
modifiedcrates/nix-eval/src/macros.rsdiffbeforeafterboth
before · crates/nix-eval/src/macros.rs
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 { }) => {{20		use $crate::{nix_expr_inner};21		let out = std::collections::hash_map::HashMap::new();22		Value::new_attrs(out)23	}};24	(Obj { $($tt:tt)+ }) => {{25		use $crate::{nix_expr_inner};26		let mut out = std::collections::hash_map::HashMap::new();27		nix_expr_inner!(@obj(out) $($tt)*);28		Value::new_attrs(out)29	}};30	(@field($o:ident) . $var:ident $($tt:tt)*) => {{31		$o.index_attr(stringify!($var));32		nix_expr_inner!(@field($o) $($tt)*);33	}};34	(@field($o:ident) [{ $v:expr }] $($tt:tt)*) => {{35		$o.push(Index::attr(&$v));36		nix_expr_inner!(@o($o) $($tt)*);37	}};38	(@field($o:ident) [ $($var:tt)+ ] $($tt:tt)*) => {{39		$o.push(Index::Expr($crate::nix_expr_inner!($($var)+)));40		nix_expr_inner!(@o($o) $($tt)*);41	}};42	(@field($o:ident) ($($var:tt)*) $($tt:tt)*) => {43		$o.push(Index::ExprApply($crate::nix_expr_inner!($($var)+)));44		nix_expr_inner!(@o($o) $($tt)*);45	};46	(@field($o:ident)) => {};47	($field:ident $($tt:tt)*) => {{48		use $crate::{nix_expr_inner};49		// might be used if indexed50		#[allow(unused_mut)]51		let mut out = $field.clone();52		nix_expr_inner!(@field(out) $($tt)*);53		out54	}};55	($v:expr) => {{56		$crate::Value::serialized(&$v)?57	}}58}59#[macro_export]60macro_rules! nix_expr {61	($($tt:tt)+) => {{62		use $crate::{macros::{NixExprBuilder}, Value, nix_expr_inner};63		let expr = nix_expr_inner!($($tt)+);64		Field::new(expr.session(), expr.out)65	}};66}6768#[macro_export]69macro_rules! nix_go {70	(@o($o:expr, $path:expr) . $var:ident $($tt:tt)*) => {{71		nix_go!(@o(tokio::task::block_in_place(|| $o.get_field(stringify!($var))).context(concat!("getting nested ", $path))?, $path) $($tt)*)72	}};73	(@o($o:expr, $path:expr) [ $v:expr ] $($tt:tt)*) => {{74		nix_go!(@o(tokio::task::block_in_place(|| $o.get_field($v)).context(concat!("getting nested ", $path))?, $path) $($tt)*)75	}};76	(@o($o:expr, $path:expr) ($($var:tt)*) $($tt:tt)*) => {77		nix_go!(@o(tokio::task::block_in_place(|| $o.call($crate::nix_expr_inner!($($var)+))).context(concat!("getting nested ", $path))?, $path) $($tt)*)78	};79	(@o($o:expr, $path:expr)) => {$o};80	($field:ident $($tt:tt)+) => {{81		use $crate::nix_go;82		use ::anyhow::Context;83		let out = $field.clone();84		nix_go!(@o(out, ::std::stringify!($($tt)*)) $($tt)*)85	}}86}87#[macro_export]88macro_rules! nix_go_json {89	($($tt:tt)*) => {{90		tokio::task::block_in_place(|| $crate::nix_go!($($tt)*).as_json())?91	}};92}