pub use hive_console_sdk::expressions::error::{ExpressionCompileError, ProgramResolutionError};
pub use hive_console_sdk::expressions::lib::{
CompileExpression, ExecutableProgram, FromVrlValue, ProgramHints, ToVrlValue,
};
use std::time::Duration;
pub use vrl::{compiler::Program as VrlProgram, core::Value as VrlValue};
pub use vrl::prelude::{ExpressionError as VrlExpressionError, Function as VrlFunction};
#[derive(Clone)]
pub enum ValueOrProgram<T> {
Value(T),
Program(Box<VrlProgram>, ProgramHints),
}
impl<T> ValueOrProgram<T>
where
T: FromVrlValue + Clone,
{
#[inline]
pub fn resolve<F>(&self, vrl_context_fn: F) -> Result<T, ProgramResolutionError<T::Error>>
where
F: FnOnce() -> VrlValue,
{
match self {
ValueOrProgram::Value(v) => Ok(v.clone()),
ValueOrProgram::Program(vrl_program, _) => {
let vrl_context = vrl_context_fn();
let result_value = vrl_program
.execute(vrl_context)
.map_err(ProgramResolutionError::ExecutionFailed)?;
T::from_vrl_value(result_value).map_err(ProgramResolutionError::ConversionFailed)
}
}
}
#[inline]
pub fn resolve_with_hints<F>(
&self,
vrl_context_fn: F,
) -> Result<T, ProgramResolutionError<T::Error>>
where
F: FnOnce(&ProgramHints) -> VrlValue,
{
match self {
ValueOrProgram::Value(v) => Ok(v.clone()),
ValueOrProgram::Program(vrl_program, hints) => {
let vrl_context = vrl_context_fn(hints);
let result_value = vrl_program
.execute(vrl_context)
.map_err(ProgramResolutionError::ExecutionFailed)?;
T::from_vrl_value(result_value).map_err(ProgramResolutionError::ConversionFailed)
}
}
}
}
pub type DurationOrProgram = ValueOrProgram<Duration>;
pub type BooleanOrProgram = ValueOrProgram<bool>;