use crate::{ast::ContainedSpan, tokenizer::TokenReference};
use derive_more::Display;
use full_moon_derive::{Node, Visit};
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Display, PartialEq, Eq, Node, Visit)]
#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
#[display(fmt = "{}{}{}", "brackets.tokens().0", "name", "brackets.tokens().1")]
pub struct Attribute {
#[node(full_range)]
#[visit(contains = "name")]
pub(crate) brackets: ContainedSpan,
pub(crate) name: TokenReference,
}
impl Attribute {
pub fn new(name: TokenReference) -> Self {
Self {
brackets: ContainedSpan::new(
TokenReference::symbol("<").unwrap(),
TokenReference::symbol(">").unwrap(),
),
name,
}
}
pub fn name(&self) -> &TokenReference {
&self.name
}
pub fn brackets(&self) -> &ContainedSpan {
&self.brackets
}
pub fn with_name(self, name: TokenReference) -> Self {
Self { name, ..self }
}
pub fn with_brackets(self, brackets: ContainedSpan) -> Self {
Self { brackets, ..self }
}
}