df_ls_syntax_analysis 0.3.0-rc.1

A language server for Dwarf Fortress RAW files
Documentation
use serde::{Deserialize, Serialize};
use std::fmt::Display;

#[allow(clippy::upper_case_acronyms)]
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)]
#[non_exhaustive]
pub enum TokenArgument {
    TVInteger(i64),
    TVCharacter(char),
    TVArgN(u8),
    TVBangArgN(u16),
    TVReference(String),
    TVString(String),
    TVPipeArguments(Vec<Self>),
    TVBangArgNSequence(Vec<Self>),
    TVEmpty,
}

impl TokenArgument {
    pub fn argument_to_token_type_name(&self) -> String {
        match self {
            TokenArgument::TVInteger(_) => "Integer".to_string(),
            TokenArgument::TVCharacter(_) => "char".to_string(),
            TokenArgument::TVArgN(_) => "ArgN".to_string(),
            TokenArgument::TVBangArgN(_) => "BangArgN".to_string(),
            TokenArgument::TVReference(_) => "Reference".to_string(),
            TokenArgument::TVString(_) => "String".to_string(),
            TokenArgument::TVPipeArguments(_) => "PipeArguments".to_string(),
            TokenArgument::TVBangArgNSequence(_) => "BangArgNSequence".to_string(),
            TokenArgument::TVEmpty => "Empty".to_string(),
        }
    }
}

impl Default for TokenArgument {
    fn default() -> Self {
        TokenArgument::TVEmpty
    }
}

impl Display for TokenArgument {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        write!(
            f,
            "`{}`",
            match self {
                TokenArgument::TVInteger(v) => v.to_string(),
                TokenArgument::TVCharacter(v) => v.to_string(),
                TokenArgument::TVArgN(v) => v.to_string(),
                TokenArgument::TVBangArgN(v) => v.to_string(),
                TokenArgument::TVReference(v) => v.to_owned(),
                TokenArgument::TVString(v) => v.to_owned(),
                TokenArgument::TVPipeArguments(v) => {
                    v.iter()
                        .map(|v| v.to_string())
                        .collect::<Vec<_>>()
                        .join(",")
                }
                TokenArgument::TVBangArgNSequence(v) => {
                    v.iter()
                        .map(|v| v.to_string())
                        .collect::<Vec<_>>()
                        .join(",")
                }
                TokenArgument::TVEmpty => "".to_owned(),
            }
        )
    }
}