vicis_core/ir/module/name/
mod.rs1pub 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}