galvan-ast 0.0.1

AST for the Galvan programming language
Documentation
use derive_more::{Display, From};

use crate::{AstNode, Span};

#[derive(Clone, Debug, PartialEq, Eq, Hash, Display, From)]
pub struct Ident(String);

impl Ident {
    pub fn new(name: impl Into<String>) -> Ident {
        Ident(name.into())
    }

    pub fn as_str(&self) -> &str {
        &self.0
    }
}

impl AstNode for Ident {
    fn span(&self) -> Span {
        // TODO  Save a meaningful span in this struct
        Span::default()
    }

    fn print(&self, indent: usize) -> String {
        format!("{}{}", " ".repeat(indent), self.0)
    }
}

#[derive(Clone, Debug, PartialEq, Eq, Hash, Display)]
pub struct TypeIdent(String);

impl TypeIdent {
    pub fn new(name: impl Into<String>) -> TypeIdent {
        let name: String = name.into();
        TypeIdent(name.trim().to_owned())
    }

    pub fn as_str(&self) -> &str {
        &self.0
    }

    pub fn is_intrinsic(&self) -> bool {
        self.0.starts_with("__")
    }
}

impl From<TypeIdent> for String {
    fn from(value: TypeIdent) -> Self {
        value.0
    }
}

impl AstNode for TypeIdent {
    fn span(&self) -> Span {
        // TODO  Save a meaningful span in this struct
        Span::default()

    }

    fn print(&self, _indent: usize) -> String {
        self.0.clone()
    }
}

impl AsRef<str> for TypeIdent {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}