1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
use nom::{alt, named, tag, IResult}; use std::fmt; use crate::parse::{Parse, ParseError}; #[derive(Debug, PartialEq, Clone)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub enum Kind { Individual, Group, Organization, Location, } impl fmt::Display for Kind { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { match self { Kind::Individual => write!(f, "individual"), Kind::Group => write!(f, "group"), Kind::Organization => write!(f, "org"), Kind::Location => write!(f, "location"), } } } impl<'a> Parse<'a> for Kind { fn parse(input: &str) -> IResult<&str, Kind, ParseError> { parse_kind(input).map_err(|c| match c { nom::Err::Error(err) => nom::Err::Error(crate::parse::to_parse_error(input, err)), nom::Err::Failure(err) => nom::Err::Failure(crate::parse::to_parse_error(input, err)), nom::Err::Incomplete(n) => nom::Err::Incomplete(n), }) } } named!(parse_kind<&str, Kind>, alt!( tag!("individual") => { |_| Kind::Individual } | tag!("group") => { |_| Kind::Group } | tag!("org") => { |_| Kind::Organization } | tag!("location") => { |_| Kind::Location } ));