use std::fmt;
use flagset::FlagSet;
use crate::arguments::{ArgumentScanner, ExpectArg, FromArgs};
use crate::keyword::EntityKeyword;
use crate::node::EntityDefinition;
#[derive(Copy, Clone, Debug, Default, PartialEq, Eq)]
pub struct Var<S = String> {
pub name: S,
pub desc: Option<S>,
pub keywords: FlagSet<EntityKeyword>,
}
impl<S> Var<S> {
pub fn map_text<T, F>(self, mut f: F) -> Var<T>
where
F: FnMut(S) -> T,
{
Var {
name: f(self.name),
desc: self.desc.map(f),
keywords: self.keywords,
}
}
}
impl_into_owned!(Var);
impl<S: AsRef<str>> Var<S> {
pub fn borrow_text(&self) -> Var<&str> {
Var {
name: self.name.as_ref(),
desc: self.desc.as_ref().map(AsRef::as_ref),
keywords: self.keywords,
}
}
pub fn with_value<'a>(&'a self, value: &'a str) -> EntityDefinition<'a> {
EntityDefinition {
name: self.name.as_ref(),
desc: self.desc.as_ref().map(AsRef::as_ref),
keywords: self.keywords,
value,
}
}
}
impl_partial_eq!(Var);
impl<'a, S: AsRef<str>> FromArgs<'a, S> for Var<S> {
fn from_args<A: ArgumentScanner<'a, Decoded = S>>(scanner: A) -> crate::Result<Self> {
let mut scanner = scanner.with_keywords();
let variable = scanner.get_next()?.expect_some("Variable")?;
let desc = scanner.get_next_or("desc")?;
let keywords = scanner.into_keywords()?;
Ok(Self {
name: variable,
desc,
keywords,
})
}
}
impl<S> From<S> for Var<S> {
fn from(name: S) -> Self {
Self {
name,
desc: None,
keywords: FlagSet::empty(),
}
}
}
impl_from_str!(Var);
impl<S: AsRef<str>> fmt::Display for Var<S> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let Var {
name,
desc,
keywords,
} = self.borrow_text().map_text(crate::display::Escape);
write!(f, "<VAR {name}")?;
if let Some(desc) = desc {
write!(f, " {desc}")?;
}
for keyword in keywords {
write!(f, " {keyword}")?;
}
f.write_str(">")
}
}