1#[macro_export]2macro_rules! nix_expr_inner {3 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 45 #[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}