1use std::{fmt::Display, str::FromStr};
4
5use strum;
6
7pub use crate::parser::{Command, DataType, KeywordToken, Modifier};
8
9#[derive(Clone, Debug, PartialEq, Eq)]
11pub enum ReservedToken {
12 Command(Command),
13 DataType(DataType),
14 Modifier(Modifier),
15 OtherKeyword(KeywordToken),
16 Gate(ReservedGate),
17 Constant(ReservedConstant),
18}
19
20#[derive(Clone, Debug, thiserror::Error)]
21#[error("{0} is not a reserved token")]
22pub struct NotReservedToken(String);
23
24impl FromStr for ReservedToken {
25 type Err = NotReservedToken;
26
27 fn from_str(s: &str) -> Result<Self, Self::Err> {
28 fn parse<T: FromStr>(
29 reserved: impl Fn(T) -> ReservedToken,
30 s: &str,
31 ) -> Result<ReservedToken, T::Err> {
32 T::from_str(s).map(reserved)
33 }
34
35 parse(Self::Command, s)
36 .or_else(|_| parse(Self::DataType, s))
37 .or_else(|_| parse(Self::Modifier, s))
38 .or_else(|_| parse(Self::OtherKeyword, s))
39 .or_else(|_| parse(Self::Gate, s))
40 .or_else(|_| parse(Self::Constant, s))
41 .map_err(|_| NotReservedToken(s.to_string()))
42 }
43}
44
45impl Display for ReservedToken {
46 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
47 match self {
48 Self::Command(command) => write!(f, "{command}"),
49 Self::DataType(data_type) => write!(f, "{data_type}"),
50 Self::Modifier(modifier) => write!(f, "{modifier}"),
51 Self::OtherKeyword(keyword_token) => write!(f, "{keyword_token}"),
52 Self::Gate(gate) => write!(f, "{gate}"),
53 Self::Constant(constant) => write!(f, "{constant}"),
54 }
55 }
56}
57
58#[derive(Clone, Copy, Debug, PartialEq, Eq, strum::Display, strum::EnumString)]
60#[strum(serialize_all = "UPPERCASE")]
61pub enum ReservedGate {
62 CAN,
63 CCNOT,
64 CNOT,
65 CPHASE,
66 CPHASE00,
67 CPHASE01,
68 CPHASE10,
69 CSWAP,
70 CZ,
71 H,
72 I,
73 ISWAP,
74 PHASE,
75 PISWAP,
76 PSWAP,
77 RX,
78 RY,
79 RZ,
80 S,
81 SWAP,
82 T,
83 X,
84 XY,
85 Y,
86 Z,
87}
88
89#[derive(Clone, Copy, Debug, PartialEq, Eq, strum::Display, strum::EnumString)]
91#[strum(serialize_all = "lowercase")]
92pub enum ReservedConstant {
93 #[strum(serialize = "i")]
94 Imaginary,
95 Pi,
96}