use std::fmt;
use std::str::FromStr;
use crate::errors::ParamParseError;
use crate::tl::{Flag, Type};
#[derive(Debug, PartialEq, Eq, Hash)]
pub enum ParameterType {
Flags,
Normal {
ty: Type,
flag: Option<Flag>,
},
}
impl fmt::Display for ParameterType {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Flags => write!(f, "#"),
Self::Normal { ty, flag } => {
if let Some(flag) = flag {
write!(f, "{flag}?")?;
}
write!(f, "{ty}")
}
}
}
}
impl FromStr for ParameterType {
type Err = ParamParseError;
fn from_str(ty: &str) -> Result<Self, Self::Err> {
let ty = match ty {
"" => return Err(ParamParseError::Empty),
"#" => return Ok(ParameterType::Flags),
ty => ty,
};
let (flag, ty) = match ty.split_once('?') {
Some((flag, ty)) => (Some(flag.parse()?), ty),
None => (None, ty),
};
let ty = ty.parse()?;
Ok(ParameterType::Normal { ty, flag })
}
}