quil_rs/
reserved.rs

1//! This module contains enums for reserved tokens in [quil](https://quil-lang.github.io)
2
3use std::{fmt::Display, str::FromStr};
4
5use strum;
6
7pub use crate::parser::{Command, DataType, KeywordToken, Modifier};
8
9/// An enum that can represent any reserved token in quil.
10#[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/// Every reserved Gate identifier
59#[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/// Every reserved constant
90#[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}