1pub use cast::Cast;
17pub use cast_lossy::CastLossy;
18
19mod cast;
20mod cast_lossy;
21mod equal;
22mod from_bits;
23mod size_in_bits;
24mod to_bits;
25mod to_fields;
26mod to_type;
27mod variant;
28
29use snarkvm_circuit_account::Signature;
30use snarkvm_circuit_network::Aleo;
31use snarkvm_circuit_types::prelude::*;
32
33#[cfg(test)]
34use console::LiteralType;
35
36#[derive(Clone)]
38pub enum Literal<A: Aleo> {
39 Address(Address<A>),
41 Boolean(Boolean<A>),
43 Field(Field<A>),
45 Group(Group<A>),
47 I8(I8<A>),
49 I16(I16<A>),
51 I32(I32<A>),
53 I64(I64<A>),
55 I128(I128<A>),
57 U8(U8<A>),
59 U16(U16<A>),
61 U32(U32<A>),
63 U64(U64<A>),
65 U128(U128<A>),
67 Scalar(Scalar<A>),
69 Signature(Box<Signature<A>>),
71 String(StringType<A>),
73}
74
75macro_rules! impl_from {
76 ($($name: ident)*) => {
77 $(
78 impl<A: Aleo> From<$name<A>> for Literal<A> {
79 fn from(value: $name<A>) -> Self {
80 Literal::$name(value)
81 }
82 }
83 )*
84 };
85}
86
87impl_from! {
88 Address Boolean Field Group
89 I8 I16 I32 I64 I128
90 U8 U16 U32 U64 U128
91 Scalar
92}
93
94impl<A: Aleo> From<Signature<A>> for Literal<A> {
95 fn from(value: Signature<A>) -> Self {
96 Literal::Signature(Box::new(value))
97 }
98}
99
100impl<A: Aleo> Inject for Literal<A> {
101 type Primitive = console::Literal<A::Network>;
102
103 fn new(mode: Mode, value: Self::Primitive) -> Self {
105 match value {
106 Self::Primitive::Address(address) => Self::Address(Address::new(mode, address)),
107 Self::Primitive::Boolean(boolean) => Self::Boolean(Boolean::new(mode, *boolean)),
108 Self::Primitive::Field(field) => Self::Field(Field::new(mode, field)),
109 Self::Primitive::Group(group) => Self::Group(Group::new(mode, group)),
110 Self::Primitive::I8(i8) => Self::I8(I8::new(mode, i8)),
111 Self::Primitive::I16(i16) => Self::I16(I16::new(mode, i16)),
112 Self::Primitive::I32(i32) => Self::I32(I32::new(mode, i32)),
113 Self::Primitive::I64(i64) => Self::I64(I64::new(mode, i64)),
114 Self::Primitive::I128(i128) => Self::I128(I128::new(mode, i128)),
115 Self::Primitive::U8(u8) => Self::U8(U8::new(mode, u8)),
116 Self::Primitive::U16(u16) => Self::U16(U16::new(mode, u16)),
117 Self::Primitive::U32(u32) => Self::U32(U32::new(mode, u32)),
118 Self::Primitive::U64(u64) => Self::U64(U64::new(mode, u64)),
119 Self::Primitive::U128(u128) => Self::U128(U128::new(mode, u128)),
120 Self::Primitive::Scalar(scalar) => Self::Scalar(Scalar::new(mode, scalar)),
121 Self::Primitive::Signature(signature) => Self::Signature(Box::new(Signature::new(mode, *signature))),
122 Self::Primitive::String(string) => Self::String(StringType::new(mode, string)),
123 }
124 }
125}
126
127impl<A: Aleo> Eject for Literal<A> {
128 type Primitive = console::Literal<A::Network>;
129
130 fn eject_mode(&self) -> Mode {
132 match self {
133 Self::Address(literal) => literal.eject_mode(),
134 Self::Boolean(literal) => literal.eject_mode(),
135 Self::Field(literal) => literal.eject_mode(),
136 Self::Group(literal) => literal.eject_mode(),
137 Self::I8(literal) => literal.eject_mode(),
138 Self::I16(literal) => literal.eject_mode(),
139 Self::I32(literal) => literal.eject_mode(),
140 Self::I64(literal) => literal.eject_mode(),
141 Self::I128(literal) => literal.eject_mode(),
142 Self::U8(literal) => literal.eject_mode(),
143 Self::U16(literal) => literal.eject_mode(),
144 Self::U32(literal) => literal.eject_mode(),
145 Self::U64(literal) => literal.eject_mode(),
146 Self::U128(literal) => literal.eject_mode(),
147 Self::Scalar(literal) => literal.eject_mode(),
148 Self::Signature(literal) => literal.eject_mode(),
149 Self::String(literal) => literal.eject_mode(),
150 }
151 }
152
153 fn eject_value(&self) -> Self::Primitive {
155 match self {
156 Self::Address(literal) => Self::Primitive::Address(literal.eject_value()),
157 Self::Boolean(literal) => Self::Primitive::Boolean(console::Boolean::new(literal.eject_value())),
158 Self::Field(literal) => Self::Primitive::Field(literal.eject_value()),
159 Self::Group(literal) => Self::Primitive::Group(literal.eject_value()),
160 Self::I8(literal) => Self::Primitive::I8(literal.eject_value()),
161 Self::I16(literal) => Self::Primitive::I16(literal.eject_value()),
162 Self::I32(literal) => Self::Primitive::I32(literal.eject_value()),
163 Self::I64(literal) => Self::Primitive::I64(literal.eject_value()),
164 Self::I128(literal) => Self::Primitive::I128(literal.eject_value()),
165 Self::U8(literal) => Self::Primitive::U8(literal.eject_value()),
166 Self::U16(literal) => Self::Primitive::U16(literal.eject_value()),
167 Self::U32(literal) => Self::Primitive::U32(literal.eject_value()),
168 Self::U64(literal) => Self::Primitive::U64(literal.eject_value()),
169 Self::U128(literal) => Self::Primitive::U128(literal.eject_value()),
170 Self::Scalar(literal) => Self::Primitive::Scalar(literal.eject_value()),
171 Self::Signature(literal) => Self::Primitive::Signature(Box::new(literal.eject_value())),
172 Self::String(literal) => Self::Primitive::String(literal.eject_value()),
173 }
174 }
175}
176
177impl<A: Aleo> Parser for Literal<A> {
178 #[inline]
180 fn parse(string: &str) -> ParserResult<Self> {
181 alt((
182 map(Address::parse, |literal| Self::Address(literal)),
183 map(Boolean::parse, |literal| Self::Boolean(literal)),
184 map(Field::parse, |literal| Self::Field(literal)),
185 map(Group::parse, |literal| Self::Group(literal)),
186 map(I8::parse, |literal| Self::I8(literal)),
187 map(I16::parse, |literal| Self::I16(literal)),
188 map(I32::parse, |literal| Self::I32(literal)),
189 map(I64::parse, |literal| Self::I64(literal)),
190 map(I128::parse, |literal| Self::I128(literal)),
191 map(U8::parse, |literal| Self::U8(literal)),
192 map(U16::parse, |literal| Self::U16(literal)),
193 map(U32::parse, |literal| Self::U32(literal)),
194 map(U64::parse, |literal| Self::U64(literal)),
195 map(U128::parse, |literal| Self::U128(literal)),
196 map(Scalar::parse, |literal| Self::Scalar(literal)),
197 map(Signature::parse, |literal| Self::Signature(Box::new(literal))),
198 map(StringType::parse, |literal| Self::String(literal)),
199 ))(string)
200 }
201}
202
203impl<A: Aleo> FromStr for Literal<A> {
204 type Err = Error;
205
206 #[inline]
208 fn from_str(string: &str) -> Result<Self> {
209 match Self::parse(string) {
210 Ok((remainder, object)) => {
211 ensure!(remainder.is_empty(), "Failed to parse string. Found invalid character in: \"{remainder}\"");
213 Ok(object)
215 }
216 Err(error) => bail!("Failed to parse string. {error}"),
217 }
218 }
219}
220
221impl<A: Aleo> Literal<A> {
222 pub fn type_name(&self) -> &str {
224 match self {
225 Self::Address(..) => Address::<A>::type_name(),
226 Self::Boolean(..) => Boolean::<A>::type_name(),
227 Self::Field(..) => Field::<A>::type_name(),
228 Self::Group(..) => Group::<A>::type_name(),
229 Self::I8(..) => I8::<A>::type_name(),
230 Self::I16(..) => I16::<A>::type_name(),
231 Self::I32(..) => I32::<A>::type_name(),
232 Self::I64(..) => I64::<A>::type_name(),
233 Self::I128(..) => I128::<A>::type_name(),
234 Self::U8(..) => U8::<A>::type_name(),
235 Self::U16(..) => U16::<A>::type_name(),
236 Self::U32(..) => U32::<A>::type_name(),
237 Self::U64(..) => U64::<A>::type_name(),
238 Self::U128(..) => U128::<A>::type_name(),
239 Self::Scalar(..) => Scalar::<A>::type_name(),
240 Self::Signature(..) => Signature::<A>::type_name(),
241 Self::String(..) => StringType::<A>::type_name(),
242 }
243 }
244}
245
246impl<A: Aleo> Debug for Literal<A> {
247 fn fmt(&self, f: &mut Formatter) -> fmt::Result {
248 Display::fmt(self, f)
249 }
250}
251
252impl<A: Aleo> Display for Literal<A> {
253 fn fmt(&self, f: &mut Formatter) -> fmt::Result {
254 match self {
255 Self::Address(literal) => Display::fmt(literal, f),
256 Self::Boolean(literal) => Display::fmt(literal, f),
257 Self::Field(literal) => Display::fmt(literal, f),
258 Self::Group(literal) => Display::fmt(literal, f),
259 Self::I8(literal) => Display::fmt(literal, f),
260 Self::I16(literal) => Display::fmt(literal, f),
261 Self::I32(literal) => Display::fmt(literal, f),
262 Self::I64(literal) => Display::fmt(literal, f),
263 Self::I128(literal) => Display::fmt(literal, f),
264 Self::U8(literal) => Display::fmt(literal, f),
265 Self::U16(literal) => Display::fmt(literal, f),
266 Self::U32(literal) => Display::fmt(literal, f),
267 Self::U64(literal) => Display::fmt(literal, f),
268 Self::U128(literal) => Display::fmt(literal, f),
269 Self::Scalar(literal) => Display::fmt(literal, f),
270 Self::Signature(literal) => Display::fmt(literal, f),
271 Self::String(literal) => Display::fmt(literal, f),
272 }
273 }
274}