use std::fmt;
use std::str::FromStr;
use crate::errors::ParamParseError;
use crate::tl::ParameterType;
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub struct Parameter {
pub name: String,
pub ty: ParameterType,
}
impl fmt::Display for Parameter {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}:{}", self.name, self.ty)
}
}
impl FromStr for Parameter {
type Err = ParamParseError;
fn from_str(token: &str) -> Result<Self, Self::Err> {
if let Some(inner) = token.strip_prefix('{') {
return Err(match inner.strip_suffix(":Type}") {
Some(name) => ParamParseError::TypeDef { name: name.into() },
None => ParamParseError::MissingDef,
});
}
let (name, ty_str) = token
.split_once(':')
.ok_or(ParamParseError::NotImplemented)?;
if name.is_empty() || ty_str.is_empty() {
return Err(ParamParseError::Empty);
}
Ok(Self {
name: name.to_owned(),
ty: ty_str.parse()?,
})
}
}