1
use std::fmt::Display;
2

            
3
use serde::{Deserialize, Serialize};
4

            
5
/// A reference to an object stored in the [`SymbolTable`].
6
#[derive(Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
7
pub enum Name {
8
    /// A name given in the input model.
9
    UserName(String),
10
    /// A name generated by Conjure-Oxide.
11
    MachineName(i32),
12
}
13

            
14
uniplate::derive_unplateable!(Name);
15

            
16
impl Display for Name {
17
1057878
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
18
1057878
        match self {
19
734796
            Name::UserName(s) => write!(f, "{}", s),
20
323082
            Name::MachineName(i) => write!(f, "__{}", i),
21
        }
22
1057878
    }
23
}
24

            
25
impl From<String> for Name {
26
    fn from(s: String) -> Self {
27
        Name::UserName(s)
28
    }
29
}
30

            
31
impl From<&str> for Name {
32
    fn from(s: &str) -> Self {
33
        Name::UserName(s.to_string())
34
    }
35
}
36

            
37
impl From<i32> for Name {
38
    fn from(i: i32) -> Self {
39
        Name::MachineName(i)
40
    }
41
}