ohkami_lib 0.24.9

internal library for Ohkami - A performant, declarative, and runtime-flexible web framework for Rust
Documentation
mod de;
mod ser;

#[cfg(test)]
mod _test;

#[inline(always)]
pub fn to_string(value: &impl serde::Serialize) -> Result<String, Error> {
    let mut s = ser::UTF8Serializer {
        output: String::new(),
    };
    value.serialize(&mut s)?;
    Ok(s.output)
}

#[inline(always)]
pub fn from_str<'de, D: serde::Deserialize<'de>>(input: &'de str) -> Result<D, Error> {
    let mut d = de::UTF8Deserializer { input };
    let t = D::deserialize(&mut d)?;
    d.input.is_empty().then_some(t).ok_or_else(|| {
        serde::de::Error::custom(format!("Unexpected trailing charactors: `{}`", d.input))
    })
}

#[derive(Debug)]
pub struct Error(String);
const _: () = {
    impl std::fmt::Display for Error {
        fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
            f.write_str(&self.0)
        }
    }
    impl std::error::Error for Error {}

    impl serde::ser::Error for Error {
        fn custom<T>(msg: T) -> Self
        where
            T: std::fmt::Display,
        {
            Self(msg.to_string())
        }
    }
    impl serde::de::Error for Error {
        fn custom<T>(msg: T) -> Self
        where
            T: std::fmt::Display,
        {
            Self(msg.to_string())
        }
    }
};

pub(crate) enum Infallible {}
const _: () = {
    impl serde::ser::SerializeMap for Infallible {
        type Ok = ();
        type Error = Error;

        fn serialize_key<T>(&mut self, _: &T) -> Result<(), Self::Error>
        where
            T: ?Sized + serde::Serialize,
        {
            match *self {}
        }

        fn serialize_value<T>(&mut self, _: &T) -> Result<(), Self::Error>
        where
            T: ?Sized + serde::Serialize,
        {
            match *self {}
        }

        fn end(self) -> Result<Self::Ok, Self::Error> {
            match self {}
        }
    }

    impl serde::ser::SerializeSeq for Infallible {
        type Ok = ();
        type Error = Error;

        fn serialize_element<T>(&mut self, _: &T) -> Result<(), Self::Error>
        where
            T: ?Sized + serde::Serialize,
        {
            match *self {}
        }

        fn end(self) -> Result<Self::Ok, Self::Error> {
            match self {}
        }
    }

    impl serde::ser::SerializeStruct for Infallible {
        type Ok = ();
        type Error = Error;

        fn serialize_field<T>(&mut self, _: &'static str, _: &T) -> Result<(), Self::Error>
        where
            T: ?Sized + serde::Serialize,
        {
            match *self {}
        }

        fn end(self) -> Result<Self::Ok, Self::Error> {
            match self {}
        }
    }

    impl serde::ser::SerializeStructVariant for Infallible {
        type Ok = ();
        type Error = Error;

        fn serialize_field<T>(&mut self, _: &'static str, _: &T) -> Result<(), Self::Error>
        where
            T: ?Sized + serde::Serialize,
        {
            match *self {}
        }

        fn end(self) -> Result<Self::Ok, Self::Error> {
            match self {}
        }
    }

    impl serde::ser::SerializeTuple for Infallible {
        type Ok = ();
        type Error = Error;

        fn serialize_element<T>(&mut self, _: &T) -> Result<(), Self::Error>
        where
            T: ?Sized + serde::Serialize,
        {
            match *self {}
        }

        fn end(self) -> Result<Self::Ok, Self::Error> {
            match self {}
        }
    }

    impl serde::ser::SerializeTupleStruct for Infallible {
        type Ok = ();
        type Error = Error;

        fn serialize_field<T>(&mut self, _: &T) -> Result<(), Self::Error>
        where
            T: ?Sized + serde::Serialize,
        {
            match *self {}
        }

        fn end(self) -> Result<Self::Ok, Self::Error> {
            match self {}
        }
    }
};