villain 0.0.1

A webframework that utilizes Vue templates to generate HTML. Aimed to replace the need for JavaScript in web development.
Documentation
use std::fmt::{Display, Formatter};

#[derive(Debug, PartialEq, Clone)]
pub(crate) enum TokenType {
    Colon,
    Attribute,
    AttributeValue,
    Interpolation,
    TagOpen,
    TagClose,
    TextNode,
}

#[derive(Debug, Clone, PartialEq)]
pub(crate) struct Token {
    pub(crate) token_type: TokenType,
    pub(crate) position: usize,
    pub(crate) value: Option<String>,
}

impl Token {
    pub(crate) fn new_with_value(token_type: TokenType, position: usize, value: &str) -> Self {
        Self {
            token_type,
            position,
            value: Some(value.to_string()),
        }
    }

    pub(crate) fn new(token_type: TokenType, position: usize) -> Self {
        Self {
            token_type,
            position,
            value: None,
        }
    }
}

impl Display for Token {
    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
        let position = format!("@ {}", self.position);
        let value = self.value.clone().unwrap_or(String::new());

        match self.token_type {
            TokenType::Colon => write!(f, ":"),
            TokenType::Attribute => write!(f, "{value}{position}"),
            TokenType::AttributeValue => {
                write!(f, r#""{value}"{position}"#)
            }
            TokenType::Interpolation => {
                write!(f, r#"{{ {value} }}{position}"#)
            }
            TokenType::TagOpen => write!(f, "<{value}>{position}"),
            TokenType::TagClose => write!(f, "</{value}>{position}"),
            TokenType::TextNode => write!(f, "{value}{position}"),
        }
    }
}