g-err 0.1.0

Structured error type
Documentation
use core::fmt::{Debug, Display};

use crate::gerr::Config;

/// Type representing no id.
#[derive(Debug, PartialEq, Eq)]
pub struct NoID;

impl Display for NoID {
    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
        write!(f, "NoID")
    }
}

#[cfg(feature = "serde")]
impl ::serde::Serialize for NoID {
    fn serialize<S>(&self, serializer: S) -> core::result::Result<S::Ok, S::Error>
    where
        S: serde::Serializer,
    {
        serializer.serialize_unit()
    }
}

#[cfg(feature = "serde")]
impl<'de> ::serde::Deserialize<'de> for NoID {
    fn deserialize<D>(deserializer: D) -> core::result::Result<Self, D::Error>
    where
        D: serde::Deserializer<'de>,
    {
        <()>::deserialize(deserializer)?;
        Ok(NoID)
    }
}

/// Type for generic parameter `D` for GErr without data.
#[derive(Debug, PartialEq, Eq)]
pub struct NoData;

#[cfg(feature = "serde")]
impl ::serde::Serialize for NoData {
    fn serialize<S>(&self, serializer: S) -> core::result::Result<S::Ok, S::Error>
    where
        S: serde::Serializer,
    {
        serializer.serialize_unit()
    }
}

#[cfg(feature = "serde")]
impl<'de> ::serde::Deserialize<'de> for NoData {
    fn deserialize<D>(deserializer: D) -> core::result::Result<Self, D::Error>
    where
        D: serde::Deserializer<'de>,
    {
        <()>::deserialize(deserializer)?;
        Ok(NoData)
    }
}

/// Default [`Config`] implementation.
///
/// Config:
/// - `Id`: [`NoID`]
/// - `id()`: returns `None`
/// - `Code`: `None`
pub struct DefaultConfig;

impl Config for DefaultConfig {
    type Id = NoID;
}

impl Config for () {
    type Id = NoID;
}