use std::fmt::{Debug, Formatter, Result as FmtResult};
use crate::pipeline::renderer::ValueRenderer;
use super::{Context, Error};
pub type ValueGeneratorBox = Box<dyn ValueGenerator>;
impl Debug for ValueGeneratorBox {
fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
f.debug_struct("ValueGeneratorBox").finish()
}
}
pub trait ValueGenerator: Send + Sync + 'static {
fn exec(
&self,
ctx: &Context<'_, '_>,
value: &str,
mode: ValueGeneratorMode,
) -> Result<Box<dyn ValueRenderer>, Error>;
fn clone(&self) -> Box<dyn ValueGenerator>;
}
#[derive(Debug, Clone, Copy, Eq, PartialEq)]
pub enum ValueGeneratorMode {
Literal,
Constant,
Value,
}
impl<X> ValueGenerator for X
where
X: Fn(&Context<'_, '_>, &str, ValueGeneratorMode) -> Result<Box<dyn ValueRenderer>, Error>
+ Clone
+ Send
+ Sync
+ 'static,
{
fn exec(
&self,
ctx: &Context<'_, '_>,
value: &str,
mode: ValueGeneratorMode,
) -> Result<Box<dyn ValueRenderer>, Error> {
(*self)(ctx, value, mode)
}
fn clone(&self) -> Box<dyn ValueGenerator> {
Box::new(self.clone())
}
}