mtracker 0.5.0

cli movie tracker - keep track of watched movies and series
Documentation
use regex::Regex;
use std::convert::Into;

pub struct Handle {
    pub name: String,
    pub year: Option<u16>,
}

impl Handle {
    #[allow(clippy::missing_panics_doc)]
    pub fn from_user_input(input: impl Into<String> + Copy) -> Self {
        match Regex::new(r"^(.+)\s\((\d{4})\)$")
            .unwrap()
            .captures(&input.into())
        {
            Some(caps) => Handle {
                name: caps.get(1).unwrap().as_str().into(),
                year: caps.get(2).unwrap().as_str().parse::<u16>().ok(),
            },
            None => Handle {
                name: input.into(),
                year: None,
            },
        }
    }
}

impl std::fmt::Display for Handle {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        match &self.year {
            Some(y) => write!(f, "{} ({})", self.name, y),
            None => write!(f, "{}", self.name),
        }
    }
}

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

    #[test]
    fn parses_from_user_input() {
        let handle = Handle::from_user_input("Alien (1979)");
        assert_eq!(handle.name, "Alien");
        assert_eq!(handle.year, Some(1979));

        let handle = Handle::from_user_input("Alien");
        assert_eq!(handle.name, "Alien");
        assert_eq!(handle.year, None);
    }
}