trey 0.2.0

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

use super::Error;

#[derive(Debug, PartialEq, Default, Clone)]
pub struct Charge(i8);

impl Charge {
    pub fn is_zero(&self) -> bool {
        self.0 == 0
    }
}

impl TryFrom<i8> for Charge {
    type Error = Error;

    fn try_from(value: i8) -> Result<Self, Self::Error> {
        if value > -16 && value < 16 {
            Ok(Charge(value))
        } else {
            Err(Error::InvalidCharge)
        }
    }
}

impl From<&Charge> for i8 {
    fn from(value: &Charge) -> Self {
        value.0.clone()
    }
}

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

#[cfg(test)]
mod try_from {
    use super::*;

    #[test]
    fn inside_range() {
        assert_eq!(Charge::try_from(2), Ok(Charge(2)))
    }

    #[test]
    fn outside_range() {
        assert_eq!(Charge::try_from(16), Err(Error::InvalidCharge))
    }
}