use std::borrow::Cow;
use crate::span::Span;
pub type Comment<'s> = &'s str;
#[derive(Debug)]
pub struct TokenTree<'s> {
pub span: Option<Span>,
pub prefix_comments: Vec<Comment<'s>>,
pub value: TokenValue<'s>,
pub suffix_comment: Option<Comment<'s>>,
}
#[derive(Debug)]
pub struct TokenKeyValue<'s> {
pub key: TokenTree<'s>,
pub value: TokenTree<'s>,
}
#[derive(Debug)]
pub struct TokenMap<'s> {
pub key_values: Vec<TokenKeyValue<'s>>,
pub closing_comments: Vec<Comment<'s>>,
}
#[derive(Debug)]
pub struct TokenList<'s> {
pub values: Vec<TokenTree<'s>>,
pub closing_comments: Vec<Comment<'s>>,
}
#[derive(Debug)]
pub struct TokenVariant<'s> {
pub name_span: Option<Span>,
pub quoted_name: Cow<'s, str>,
pub values: Vec<TokenTree<'s>>,
pub closing_comments: Vec<Comment<'s>>,
}
#[derive(Debug)]
pub enum TokenValue<'s> {
Identifier(Cow<'s, str>),
Number(Cow<'s, str>),
QuotedString(Cow<'s, str>),
List(TokenList<'s>),
Map(TokenMap<'s>),
Variant(TokenVariant<'s>),
}
impl TokenValue<'_> {
pub fn is_number(&self) -> bool {
matches!(self, Self::Number(_))
}
}
impl<'s> From<TokenValue<'s>> for TokenTree<'s> {
fn from(value: TokenValue<'s>) -> Self {
TokenTree {
span: None,
prefix_comments: vec![],
value,
suffix_comment: None,
}
}
}