difftreelog
refactor nix-eval macro-support
in: trunk
3 files changed
cmds/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();
crates/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(
crates/nix-eval/src/macros.rsdiffbeforeafterboth1#[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 = $crate::__macro_support::HashMap::new();22 Value::new_attrs(out)23 }};24 (Obj { $($tt:tt)+ }) => {{25 use $crate::{nix_expr_inner};26 let mut out = $crate::__macro_support::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($crate::__macro_support::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($crate::__macro_support::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($crate::__macro_support::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 $crate::__macro_support::Context;83 let out = $field.clone();84 nix_go!(@o(out, stringify!($($tt)*)) $($tt)*)85 }}86}87#[macro_export]88macro_rules! nix_go_json {89 ($($tt:tt)*) => {{90 $crate::__macro_support::block_in_place(|| $crate::nix_go!($($tt)*).as_json())?91 }};92}