1use derive_more::{Display, From};
2
3use crate::{AstNode, Span};
4
5#[derive(Clone, Debug, PartialEq, Eq, Hash, Display, From)]
6pub struct Ident(String);
7
8impl Ident {
9 pub fn new(name: impl Into<String>) -> Ident {
10 Ident(name.into())
11 }
12
13 pub fn as_str(&self) -> &str {
14 &self.0
15 }
16}
17
18impl AstNode for Ident {
19 fn span(&self) -> Span {
20 Span::default()
22 }
23
24 fn print(&self, indent: usize) -> String {
25 format!("{}{}", " ".repeat(indent), self.0)
26 }
27}
28
29#[derive(Clone, Debug, PartialEq, Eq, Hash, Display)]
30pub struct TypeIdent(String);
31
32impl TypeIdent {
33 pub fn new(name: impl Into<String>) -> TypeIdent {
34 let name: String = name.into();
35 TypeIdent(name.trim().to_owned())
36 }
37
38 pub fn as_str(&self) -> &str {
39 &self.0
40 }
41
42 pub fn is_intrinsic(&self) -> bool {
43 self.0.starts_with("__")
44 }
45}
46
47impl From<TypeIdent> for String {
48 fn from(value: TypeIdent) -> Self {
49 value.0
50 }
51}
52
53impl AstNode for TypeIdent {
54 fn span(&self) -> Span {
55 Span::default()
57
58 }
59
60 fn print(&self, _indent: usize) -> String {
61 self.0.clone()
62 }
63}
64
65impl AsRef<str> for TypeIdent {
66 fn as_ref(&self) -> &str {
67 self.as_str()
68 }
69}