use std::str::FromStr; use crate::{error::InputError, utils::Time}; #[derive(Debug, PartialEq, Eq, Clone, Copy)] pub enum CitizenshipType { Citizen, NonCitizen, } impl PartialOrd for CitizenshipType { fn partial_cmp(&self, other: &Self) -> Option { Some(self.cmp(other)) } } impl Ord for CitizenshipType { fn cmp(&self, other: &Self) -> std::cmp::Ordering { match (self, other) { (CitizenshipType::Citizen, CitizenshipType::NonCitizen) => std::cmp::Ordering::Less, (CitizenshipType::NonCitizen, CitizenshipType::Citizen) => std::cmp::Ordering::Greater, _ => std::cmp::Ordering::Equal, } } } impl FromStr for CitizenshipType { type Err = InputError; fn from_str(s: &str) -> Result { match s.trim() { "P" => Ok(Self::Citizen), "N" => Ok(Self::NonCitizen), _ => Err(InputError::InvalidType("citizenship type".into())), } } } #[derive(Debug)] pub struct Citizenship { pub arrival_time: Time, pub type_: CitizenshipType, } impl Citizenship { pub fn new(arrival_time: Time, type_: CitizenshipType) -> Self { Self { arrival_time, type_, } } } impl FromStr for Citizenship { type Err = InputError; fn from_str(s: &str) -> Result { let mut iter = s.split_whitespace(); match (iter.next(), iter.next()) { (Some(citizenship), Some(id)) => { let id = id.parse::