use super::element::*;
use super::name::{Name, BuiltInName, ImportedName};
use super::statement::Statement;
#[derive(Debug, Clone)]
pub struct DecoratorSpec {
pub name: Name,
pub arguments: Vec<Statement>,
}
impl DecoratorSpec {
pub fn new<N>(name: N) -> DecoratorSpec
where N: Into<Name>
{
DecoratorSpec {
name: name.into(),
arguments: Vec::new(),
}
}
pub fn push_argument<S>(&mut self, statement: S)
where S: Into<Statement>
{
self.arguments.push(statement.into());
}
}
impl<'a, T> From<&'a T> for DecoratorSpec
where T: Into<DecoratorSpec> + Clone
{
fn from(value: &'a T) -> DecoratorSpec {
value.clone().into()
}
}
impl From<BuiltInName> for DecoratorSpec {
fn from(value: BuiltInName) -> DecoratorSpec {
DecoratorSpec::new(value)
}
}
impl From<ImportedName> for DecoratorSpec {
fn from(value: ImportedName) -> DecoratorSpec {
DecoratorSpec::new(value)
}
}
impl From<DecoratorSpec> for Element {
fn from(value: DecoratorSpec) -> Element {
let mut decl = Statement::new();
decl.push("@");
decl.push(value.name);
decl.into()
}
}