ocpi 0.3.5

Unofficial, in progress, OCPI implementation
Documentation
use std::{fmt, str::FromStr};

#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum InterfaceRole {
    Sender,
    Receiver,
}

impl fmt::Display for InterfaceRole {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        match self {
            Self::Sender => f.write_str("SENDER"),
            Self::Receiver => f.write_str("RECEIVER"),
        }
    }
}

impl FromStr for InterfaceRole {
    type Err = String;

    fn from_str(s: &str) -> Result<Self, Self::Err> {
        match s {
            "SENDER" => Ok(Self::Sender),
            "RECEIVER" => Ok(Self::Receiver),
            s => Err(format!(
                "Invalid InterfaceRole `{}`. Must be one of `RECEIVER`, `SENDER`",
                s
            )),
        }
    }
}

impl serde::Serialize for InterfaceRole {
    fn serialize<S>(&self, s: S) -> Result<S::Ok, S::Error>
    where
        S: serde::Serializer,
    {
        match self {
            Self::Sender => s.serialize_str("SENDER"),
            Self::Receiver => s.serialize_str("RECEIVER"),
        }
    }
}

impl<'de> serde::Deserialize<'de> for InterfaceRole {
    fn deserialize<D>(deserializer: D) -> Result<InterfaceRole, D::Error>
    where
        D: serde::Deserializer<'de>,
    {
        deserializer.deserialize_str(crate::common::FromStrVisitor::expecting(
            "a valid Interface Role, one of [`RECEIVER`, `SENDER`]",
        ))
    }
}

#[cfg(test)]
mod tests {
    use super::InterfaceRole;

    #[test]
    fn test_serialize() {
        assert_eq!(
            serde_json::to_string(&InterfaceRole::Sender).expect("Serializing"),
            r#""SENDER""#
        );
        assert_eq!(
            serde_json::to_string(&InterfaceRole::Receiver).expect("Serializing"),
            r#""RECEIVER""#
        );
    }

    #[test]
    fn test_deserialize() {
        assert_eq!(
            InterfaceRole::Sender,
            serde_json::from_str(r#""SENDER""#).expect("Deserializing"),
        );
        assert_eq!(
            InterfaceRole::Receiver,
            serde_json::from_str(r#""RECEIVER""#).expect("Deserializing"),
        );
    }
}