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

difftreelog

fix primop registration

ynqztwqxYaroslav Bolyukin2026-01-06parent: #98314cf.patch.diff
in: trunk

5 files changed

modifiedcrates/fleet-base/src/opts.rsdiffbeforeafterboth
--- a/crates/fleet-base/src/opts.rs
+++ b/crates/fleet-base/src/opts.rs
@@ -22,7 +22,7 @@
 
 use crate::{
 	fleetdata::FleetData,
-	host::{Config, ConfigHost, FleetConfigInternals},
+	host::{Config, ConfigHost, FleetConfigInternals}, primops::init_primops,
 };
 
 #[derive(Clone)]
@@ -213,6 +213,8 @@
 			std::fs::read_to_string(&fleet_data_path).context("reading fleet state (fleet.nix)")?;
 		let data = Arc::new(Mutex::new(FleetData::from_str(&bytes)?));
 
+		init_primops(data.clone());
+
 		let mut fetch_settings = FetchSettings::new();
 		fetch_settings.set(c"warn-dirty", c"false");
 
modifiedcrates/fleet-base/src/primops.rsdiffbeforeafterboth
--- a/crates/fleet-base/src/primops.rs
+++ b/crates/fleet-base/src/primops.rs
@@ -2,6 +2,7 @@
 use std::sync::{Arc, Mutex};
 
 use nix_eval::{NativeFn, Value};
+use tracing::info;
 
 use crate::fleetdata::{FleetData, FleetSecrets};
 
@@ -23,21 +24,9 @@
 struct FsSecretsBackend {}
 
 pub fn init_primops(secrets: Arc<Mutex<FleetData>>) {
-	NativeFn::new(
-		c"fleet_ensure_host_secret",
-		c"Ensure secret existence for a host, regenerating it in case of some mismatch",
-		[c"host", c"secret", c"generator"],
-		|[host, secret, generator]| {
-			todo!("ensure secret");
-			Ok(Value::new_attrs(HashMap::from_iter([(
-				"raw",
-				Value::new_str("rawData"),
-			)])))
-		},
-	)
-	.register();
+	info!("initializing primops");
 	NativeFn::new(
-		c"fleet_ensure_host_secret",
+		c"__fleetEnsureHostSecret",
 		c"Ensure secret existence for a host, regenerating it in case of some mismatch",
 		[c"host", c"secret", c"generator"],
 		|[host, secret, generator]| {
modifiedcrates/nix-eval/src/lib.rsdiffbeforeafterboth
--- a/crates/nix-eval/src/lib.rs
+++ b/crates/nix-eval/src/lib.rs
@@ -966,9 +966,9 @@
 		let mut args = args.into_iter().map(|v| v.as_ptr()).collect_vec();
 		args.push(null());
 		let args = args.as_mut_ptr();
-		let primop = with_default_context(|c, _| unsafe {
+		let primop = unsafe {
 			alloc_primop(
-				c,
+				null_mut(),
 				f,
 				N as i32,
 				name.as_ptr(),
@@ -976,14 +976,14 @@
 				doc.as_ptr(),
 				Box::into_raw(closure).cast(),
 			)
-		})
-		.expect("primop allocation should not fail");
+		};
+
+		assert!(!primop.is_null(), "primop allocation should not fail");
 
 		Self(primop)
 	}
 	pub fn register(self) {
-		with_default_context(|c, _| unsafe { register_primop(c, self.0) })
-			.expect("primop registration should not fail");
+		unsafe { register_primop(null_mut(), self.0) };
 	}
 }
 
@@ -999,6 +999,17 @@
 #[test_log::test]
 fn test_native() -> Result<()> {
 	init_libraries();
+	NativeFn::new(
+		c"__uppercaseSuffix2",
+		c"make string uppercase and add suffix",
+		[c"str", c"suffix"],
+		|[str, suffix]: [&Value; 2]| {
+			let str = str.to_string()?;
+			let suffix = suffix.to_string()?;
+			Ok(Value::new_str(&format!("{}{suffix}", str.to_uppercase())))
+		},
+	)
+	.register();
 
 	let mut fetch_settings = FetchSettings::new();
 	fetch_settings.set(c"warn-dirty", c"false");
@@ -1036,6 +1047,8 @@
 
 	let test_result: String = nix_go_json!(test_data.testPrimop(uppercase_suffix));
 	assert_eq!(test_result, "PREFIX_BODY_SUFFIX");
+	let test_result: String = nix_go_json!(builtins.uppercaseSuffix2("test")("suffix"));
+	assert_eq!(test_result, "TESTsuffix");
 
 	let nix_ctx = NixContext::new();
 	let store = GLOBAL_STATE.store.parse_path(s.as_c_str())?;
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 { $($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:literal) => {{51		use $crate::macros::NixExprBuilder;52		NixExprBuilder::string($v)53	}};54	({$v:expr}) => {{55		$crate::Value::serialized(&$v)?56	}}57}58#[macro_export]59macro_rules! nix_expr {60	($($tt:tt)+) => {{61		use $crate::{macros::{NixExprBuilder}, Value, nix_expr_inner};62		let expr = nix_expr_inner!($($tt)+);63		Field::new(expr.session(), expr.out)64	}};65}6667#[macro_export]68macro_rules! nix_go {69	(@o($o:expr, $path:expr) . $var:ident $($tt:tt)*) => {{70		nix_go!(@o($o.get_field(stringify!($var)).context(concat!("getting nested ", $path))?, $path) $($tt)*)71	}};72	(@o($o:expr, $path:expr) [ $v:expr ] $($tt:tt)*) => {{73		nix_go!(@o($o.get_field($v).context(concat!("getting nested ", $path))?, $path) $($tt)*)74	}};75	(@o($o:expr, $path:expr) ($($var:tt)*) $($tt:tt)*) => {76		nix_go!(@o($o.call($crate::nix_expr_inner!($($var)+)).context(concat!("getting nested ", $path))?, $path) $($tt)*)77	};78	(@o($o:expr, $path:expr)) => {$o};79	($field:ident $($tt:tt)+) => {{80		use $crate::nix_go;81		use ::anyhow::Context;82		let out = $field.clone();83		nix_go!(@o(out, ::std::stringify!($($tt)*)) $($tt)*)84	}}85}86#[macro_export]87macro_rules! nix_go_json {88	($($tt:tt)*) => {{89		$crate::nix_go!($($tt)*).as_json()?90	}};91}
after · 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 { $($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}
modifiedmodules/nixos/secrets.nixdiffbeforeafterboth
--- a/modules/nixos/secrets.nix
+++ b/modules/nixos/secrets.nix
@@ -103,7 +103,7 @@
         };
       };
       config = {
-        parts = builtins.fleet_ensure_host_secret sysConfig.networking.hostName secretName config.generator;
+        parts = builtins.fleetEnsureHostSecret sysConfig.networking.hostName secretName config.generator;
       };
     }
   );