use bumpalo::Bump;
use datavalue::OwnedDataValue;
use crate::Result;
use crate::arena::DataValue;
mod sealed {
pub trait Sealed {}
}
pub trait EvalInput<'a>: sealed::Sealed {
fn into_arena_value(self, arena: &'a Bump) -> Result<&'a DataValue<'a>>;
}
impl<'a> sealed::Sealed for &'a DataValue<'a> {}
impl<'a> EvalInput<'a> for &'a DataValue<'a> {
#[inline]
fn into_arena_value(self, _arena: &'a Bump) -> Result<&'a DataValue<'a>> {
Ok(self)
}
}
impl<'a> sealed::Sealed for DataValue<'a> {}
impl<'a> EvalInput<'a> for DataValue<'a> {
#[inline]
fn into_arena_value(self, arena: &'a Bump) -> Result<&'a DataValue<'a>> {
Ok(arena.alloc(self))
}
}
impl sealed::Sealed for &str {}
impl<'a> EvalInput<'a> for &'a str {
#[inline]
fn into_arena_value(self, arena: &'a Bump) -> Result<&'a DataValue<'a>> {
let av = DataValue::from_str(self, arena)?;
Ok(arena.alloc(av))
}
}
impl sealed::Sealed for &String {}
impl<'a> EvalInput<'a> for &'a String {
#[inline]
fn into_arena_value(self, arena: &'a Bump) -> Result<&'a DataValue<'a>> {
<&'a str as EvalInput<'a>>::into_arena_value(self.as_str(), arena)
}
}
impl sealed::Sealed for &OwnedDataValue {}
impl<'a> EvalInput<'a> for &'a OwnedDataValue {
#[inline]
fn into_arena_value(self, arena: &'a Bump) -> Result<&'a DataValue<'a>> {
Ok(arena.alloc(self.to_arena(arena)))
}
}
#[cfg(feature = "serde_json")]
impl sealed::Sealed for &serde_json::Value {}
#[cfg(feature = "serde_json")]
impl<'a> EvalInput<'a> for &'a serde_json::Value {
#[inline]
fn into_arena_value(self, arena: &'a Bump) -> Result<&'a DataValue<'a>> {
let av = crate::arena::value_to_data(self, arena);
Ok(arena.alloc(av))
}
}
#[cfg_attr(
feature = "serde_json",
doc = "/ [`crate::Engine::eval_into`] and the module-level `datalogic::eval*`"
)]
#[cfg_attr(
not(feature = "serde_json"),
doc = "(plus `Engine::eval_into` with the `serde_json` feature) and the module-level `datalogic::eval*`"
)]
pub trait OwnedInput: sealed::Sealed {
fn into_owned_input(self) -> Result<OwnedDataValue>;
}
impl OwnedInput for &str {
#[inline]
fn into_owned_input(self) -> Result<OwnedDataValue> {
Ok(OwnedDataValue::from_json(self)?)
}
}
impl OwnedInput for &String {
#[inline]
fn into_owned_input(self) -> Result<OwnedDataValue> {
Ok(OwnedDataValue::from_json(self.as_str())?)
}
}
impl OwnedInput for &OwnedDataValue {
#[inline]
fn into_owned_input(self) -> Result<OwnedDataValue> {
Ok(self.clone())
}
}
impl sealed::Sealed for OwnedDataValue {}
impl OwnedInput for OwnedDataValue {
#[inline]
fn into_owned_input(self) -> Result<OwnedDataValue> {
Ok(self)
}
}
#[cfg(feature = "serde_json")]
impl OwnedInput for &serde_json::Value {
#[inline]
fn into_owned_input(self) -> Result<OwnedDataValue> {
Ok(crate::serde_bridge::owned_from_serde(self))
}
}