use serde::Deserializer;
use crate::serde_support::RiScope;
use crate::{
AnyStr, Bin, NewSStr, NewStr, ReIntegrationStrVisitor, SBin, SStr, Str, StrFactory,
StrReIntegrator,
};
pub fn ri_deserialize_str<'de, D>(deserialize: D) -> Result<Str, D::Error>
where
D: Deserializer<'de>,
{
deserialize.deserialize_str(ReIntegrationStrVisitor::<NonSyncStrReIntegrator>::new())
}
pub fn ri_deserialize_sstr<'de, D>(deserialize: D) -> Result<SStr, D::Error>
where
D: Deserializer<'de>,
{
deserialize.deserialize_str(ReIntegrationStrVisitor::<SyncStrReIntegrator>::new())
}
struct NonSyncStrReIntegrator {}
impl StrReIntegrator for NonSyncStrReIntegrator {
type TBin = Bin;
fn re_integrate_str(str: &str) -> AnyStr<Self::TBin> {
if let Some(bin) = RiScope::try_re_integrate(str.as_bytes()) {
unsafe { Str::from_utf8_unchecked(bin) }
} else {
NewStr::copy_from_str(str)
}
}
fn re_integrate_string(string: String) -> AnyStr<Self::TBin> {
NewStr::from_given_string(string)
}
}
struct SyncStrReIntegrator {}
impl StrReIntegrator for SyncStrReIntegrator {
type TBin = SBin;
fn re_integrate_str(str: &str) -> AnyStr<Self::TBin> {
if let Some(bin) = RiScope::try_re_integrate_sync(str.as_bytes()) {
unsafe { SStr::from_utf8_unchecked(bin) }
} else {
NewSStr::copy_from_str(str)
}
}
fn re_integrate_string(string: String) -> AnyStr<Self::TBin> {
NewSStr::from_given_string(string)
}
}