use std::borrow::Cow;
use datavalue::OwnedDataValue;
use crate::Result;
pub(crate) mod sealed {
use std::borrow::Cow;
use datavalue::OwnedDataValue;
pub trait Sealed {
fn logic_source<'s>(self) -> crate::Result<Cow<'s, OwnedDataValue>>
where
Self: 's;
}
}
pub trait IntoLogic: sealed::Sealed {
fn into_owned_logic(self) -> Result<OwnedDataValue>;
}
impl sealed::Sealed for &str {
#[inline]
fn logic_source<'s>(self) -> Result<Cow<'s, OwnedDataValue>>
where
Self: 's,
{
self.into_owned_logic().map(Cow::Owned)
}
}
impl IntoLogic for &str {
#[inline]
fn into_owned_logic(self) -> Result<OwnedDataValue> {
Ok(OwnedDataValue::from_json(self)?)
}
}
impl sealed::Sealed for &String {
#[inline]
fn logic_source<'s>(self) -> Result<Cow<'s, OwnedDataValue>>
where
Self: 's,
{
self.into_owned_logic().map(Cow::Owned)
}
}
impl IntoLogic for &String {
#[inline]
fn into_owned_logic(self) -> Result<OwnedDataValue> {
Ok(OwnedDataValue::from_json(self.as_str())?)
}
}
impl sealed::Sealed for &OwnedDataValue {
#[inline]
fn logic_source<'s>(self) -> Result<Cow<'s, OwnedDataValue>>
where
Self: 's,
{
Ok(Cow::Borrowed(self))
}
}
impl IntoLogic for &OwnedDataValue {
#[inline]
fn into_owned_logic(self) -> Result<OwnedDataValue> {
Ok(self.clone())
}
}
impl sealed::Sealed for OwnedDataValue {
#[inline]
fn logic_source<'s>(self) -> Result<Cow<'s, OwnedDataValue>>
where
Self: 's,
{
Ok(Cow::Owned(self))
}
}
impl IntoLogic for OwnedDataValue {
#[inline]
fn into_owned_logic(self) -> Result<OwnedDataValue> {
Ok(self)
}
}
#[cfg(feature = "serde_json")]
impl sealed::Sealed for &serde_json::Value {
#[inline]
fn logic_source<'s>(self) -> Result<Cow<'s, OwnedDataValue>>
where
Self: 's,
{
self.into_owned_logic().map(Cow::Owned)
}
}
#[cfg(feature = "serde_json")]
impl IntoLogic for &serde_json::Value {
#[inline]
fn into_owned_logic(self) -> Result<OwnedDataValue> {
Ok(crate::serde_bridge::owned_from_serde(self))
}
}