    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50

    #[cfg(not(no_serde_derive))]
    pub mod de;
    #[cfg(not(no_serde_derive))]
    pub mod ser;

    pub mod size_hint;

    // FIXME: #[cfg(doctest)] once https://github.com/rust-lang/rust/issues/67295 is fixed.
    pub mod doc;

    pub use lib::clone::Clone;
    pub use lib::convert::{From, Into};
    pub use lib::default::Default;
    pub use lib::fmt::{self, Formatter};
    pub use lib::marker::PhantomData;
    pub use lib::option::Option::{self, None, Some};
    pub use lib::ptr;
    pub use lib::result::Result::{self, Err, Ok};

    pub use self::string::from_utf8_lossy;

    #[cfg(any(feature = "alloc", feature = "std"))]
    pub use lib::{ToString, Vec};

    #[cfg(not(no_core_try_from))]
    pub use lib::convert::TryFrom;

    mod string {
        use lib::*;

        #[cfg(any(feature = "std", feature = "alloc"))]
        pub fn from_utf8_lossy(bytes: &[u8]) -> Cow<str> {
            String::from_utf8_lossy(bytes)
        }

        // The generated code calls this like:
        //
        //     let value = &_serde::__private::from_utf8_lossy(bytes);
        //     Err(_serde::de::Error::unknown_variant(value, VARIANTS))
        //
        // so it is okay for the return type to be different from the std case as long
        // as the above works.
        #[cfg(not(any(feature = "std", feature = "alloc")))]
        pub fn from_utf8_lossy(bytes: &[u8]) -> &str {
            // Three unicode replacement characters if it fails. They look like a
            // white-on-black question mark. The user will recognize it as invalid
            // UTF-8.
            str::from_utf8(bytes).unwrap_or("\u{fffd}\u{fffd}\u{fffd}")
        }
    }