trey 0.2.0

Writing V3000 CTfiles.
Documentation
use std::{convert, fmt};

use super::Error;

#[derive(Debug, PartialEq, Default)]
pub struct Name(String);

impl convert::TryFrom<&str> for Name {
    type Error = Error;

    fn try_from(value: &str) -> Result<Self, Self::Error> {
        if value.len() > 80 {
            return Err(Error::StringTooLong);
        } else if value.contains("$RXN") || value.contains("$MDL") || value.contains("$$$$") {
            return Err(Error::ReservedTag);
        } else {
            Ok(Self(value.to_owned()))
        }
    }
}

impl fmt::Display for Name {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        self.0.fmt(f)
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    use pretty_assertions::assert_eq;

    #[test]
    fn too_long() {
        let string = (0..82).map(|_| "X").collect::<String>();

        assert_eq!(Name::try_from(string.as_str()), Err(Error::StringTooLong))
    }

    #[test]
    fn rxn() {
        assert_eq!(Name::try_from("$RXN"), Err(Error::ReservedTag))
    }

    #[test]
    fn mdl() {
        assert_eq!(Name::try_from("$MDL"), Err(Error::ReservedTag))
    }

    #[test]
    fn sdf_separator() {
        assert_eq!(Name::try_from("$$$$"), Err(Error::ReservedTag))
    }

    #[test]
    fn valid() {
        assert_eq!(Name::try_from("foo").unwrap().to_string(), "foo")
    }
}