conjure_core/ast/
name.rs

1use std::fmt::Display;
2
3use 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)]
7pub 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    /// A representation variable.
14    RepresentedName(
15        /// The source variable
16        Box<Name>,
17        /// The representation rule used
18        String,
19        /// Additional, rule dependent, information
20        String,
21    ),
22
23    WithRepresentation(
24        Box<Name>,
25        /// representations chosen
26        Vec<String>,
27    ),
28}
29
30uniplate::derive_unplateable!(Name);
31
32impl Display for Name {
33    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
34        match self {
35            Name::UserName(s) => write!(f, "{}", s),
36            Name::MachineName(i) => write!(f, "__{}", i),
37            Name::RepresentedName(name, rule_string, suffix) => {
38                write!(f, "{name}#{rule_string}_{suffix}")
39            }
40            Name::WithRepresentation(name, items) => {
41                // TODO: what is the correct syntax for nested reprs?
42                write!(f, "{name}#{}", items.join("#"))
43            }
44        }
45    }
46}
47
48impl From<String> for Name {
49    fn from(s: String) -> Self {
50        Name::UserName(s)
51    }
52}
53
54impl From<&str> for Name {
55    fn from(s: &str) -> Self {
56        Name::UserName(s.to_string())
57    }
58}
59
60impl From<i32> for Name {
61    fn from(i: i32) -> Self {
62        Name::MachineName(i)
63    }
64}