use serde_json::Value;
use std::sync::OnceLock;
use crate::error::VldError;
use crate::schema::VldSchema;
pub struct ZLazy<T, F>
where
F: Fn() -> T,
T: VldSchema,
{
factory: F,
schema: OnceLock<T>,
}
impl<T, F> ZLazy<T, F>
where
F: Fn() -> T,
T: VldSchema,
{
pub fn new(factory: F) -> Self {
Self {
factory,
schema: OnceLock::new(),
}
}
pub fn schema(&self) -> &T {
self.schema.get_or_init(|| (self.factory)())
}
}
impl<T, F> VldSchema for ZLazy<T, F>
where
F: Fn() -> T,
T: VldSchema,
{
type Output = T::Output;
fn parse_value(&self, value: &Value) -> Result<T::Output, VldError> {
self.schema().parse_value(value)
}
}