Skip to main content

vicis_core/ir/module/name/
mod.rs

1pub mod parser;
2
3use crate::ir::util::escape;
4pub use parser::parse;
5
6use std::fmt;
7
8#[derive(Clone, Eq, PartialEq, Hash)]
9pub enum Name {
10    Name(String),
11    Number(usize),
12}
13
14impl Name {
15    pub fn as_string(&self) -> &String {
16        match self {
17            Self::Name(name) => name,
18            _ => panic!(),
19        }
20    }
21
22    pub fn as_number(&self) -> &usize {
23        match self {
24            Self::Number(n) => n,
25            _ => panic!(),
26        }
27    }
28
29    pub fn to_string(&self) -> Option<&String> {
30        match self {
31            Self::Name(name) => Some(name),
32            _ => None,
33        }
34    }
35}
36
37impl fmt::Debug for Name {
38    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
39        match self {
40            Self::Name(name) => to_escaped(f, name),
41            Self::Number(num) => write!(f, "{}", num),
42        }
43    }
44}
45
46impl fmt::Display for Name {
47    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
48        match self {
49            Self::Name(name) => to_escaped(f, name),
50            Self::Number(num) => write!(f, "{}", num),
51        }
52    }
53}
54
55fn to_escaped(f: &mut fmt::Formatter<'_>, s: &str) -> fmt::Result {
56    if s.find(|c: char| !(c.is_ascii_alphanumeric() || c == '.' || c == '_'))
57        .is_some()
58    {
59        write!(f, r#""{}""#, escape(s))
60    } else {
61        write!(f, "{}", escape(s))
62    }
63}