#![allow(dead_code)] pub const A: &str = "z.literal(\"A\")"; pub const B: &str = "z.literal(\"B\")"; pub const NULL: &str = "z.null()"; pub fn discriminated_union(t: impl AsRef, items: &[impl AsRef]) -> String { format!( "z.discriminatedUnion(\"{}\", [{}])", t.as_ref(), items .iter() .map(|i| i.as_ref()) .collect::>() .join(", ") ) } pub fn zod_union(items: &[impl AsRef]) -> String { format!( "z.union([{}])", items .iter() .map(|i| i.as_ref()) .collect::>() .join(", ") ) } #[macro_export] macro_rules! object { ($($k: tt: $v:expr),*) => { zod_obj(&[$((stringify!($k), $v)),*]) }; } pub fn zod_obj(fields: &[(impl AsRef, impl AsRef)]) -> String { let inner = fields .iter() .map(|(k, v)| format!("{}: {}", k.as_ref(), v.as_ref())) .collect::>(); format!("z.object({{ {} }})", inner.join(", ")) } pub fn tuple(fields: &[impl AsRef]) -> String { let inner = fields.iter().map(|f| f.as_ref()).collect::>(); format!("z.tuple([{}])", inner.join(", ")) } pub fn adj_tagged(variant: &str, inner: impl AsRef) -> String { zod_obj(&[ ("type", format!("z.literal(\"{variant}\")")), ("content", inner.as_ref().to_string()), ]) } pub fn optional(inner: impl AsRef) -> String { format!("{}.optional()", inner.as_ref()) } #[macro_export] macro_rules! test_case { ($($decl: tt)+) => { #[derive(zod::Namespace)] #[namespace(name = "Ns")] struct Ns {} #[derive(zod::Zod, serde::Serialize)] #[zod(namespace = "Ns")] #[allow(dead_code)] $($decl)+ }; }