snarkvm_synthesizer_program/closure/output/
parse.rs1use super::*;
17
18impl<N: Network> Parser for Output<N> {
19 #[inline]
22 fn parse(string: &str) -> ParserResult<Self> {
23 let (string, _) = Sanitizer::parse(string)?;
25 let (string, _) = tag(Self::type_name())(string)?;
27 let (string, _) = Sanitizer::parse_whitespaces(string)?;
29 let (string, operand) = Operand::parse(string)?;
31 let (string, _) = Sanitizer::parse_whitespaces(string)?;
33 let (string, _) = tag("as")(string)?;
35 let (string, _) = Sanitizer::parse_whitespaces(string)?;
37 let (string, register_type) = RegisterType::parse(string)?;
39 let (string, _) = Sanitizer::parse_whitespaces(string)?;
41 let (string, _) = tag(";")(string)?;
43 Ok((string, Self { operand, register_type }))
45 }
46}
47
48impl<N: Network> FromStr for Output<N> {
49 type Err = Error;
50
51 #[inline]
53 fn from_str(string: &str) -> Result<Self> {
54 match Self::parse(string) {
55 Ok((remainder, object)) => {
56 ensure!(remainder.is_empty(), "Failed to parse string. Found invalid character in: \"{remainder}\"");
58 Ok(object)
60 }
61 Err(error) => bail!("Failed to parse string. {error}"),
62 }
63 }
64}
65
66impl<N: Network> Debug for Output<N> {
67 fn fmt(&self, f: &mut Formatter) -> fmt::Result {
69 Display::fmt(self, f)
70 }
71}
72
73impl<N: Network> Display for Output<N> {
74 fn fmt(&self, f: &mut Formatter) -> fmt::Result {
76 write!(
77 f,
78 "{type_} {operand} as {register_type};",
79 type_ = Self::type_name(),
80 operand = self.operand,
81 register_type = self.register_type
82 )
83 }
84}
85
86#[cfg(test)]
87mod tests {
88 use super::*;
89 use console::{
90 network::MainnetV0,
91 program::{Literal, Register, U8},
92 };
93
94 type CurrentNetwork = MainnetV0;
95
96 #[test]
97 fn test_output_parse() -> Result<()> {
98 let output = Output::<CurrentNetwork>::parse("output r0 as field;").unwrap().1;
100 assert_eq!(output.operand(), &Operand::Register(Register::<CurrentNetwork>::Locator(0)));
101 assert_eq!(output.register_type(), &RegisterType::<CurrentNetwork>::from_str("field")?);
102
103 let output = Output::<CurrentNetwork>::parse("output 0u8 as u8;").unwrap().1;
104 assert_eq!(output.operand(), &Operand::Literal(Literal::<CurrentNetwork>::U8(U8::new(0))));
105 assert_eq!(output.register_type(), &RegisterType::<CurrentNetwork>::from_str("u8")?);
106
107 let output = Output::<CurrentNetwork>::parse("output r1 as signature;").unwrap().1;
109 assert_eq!(output.operand(), &Operand::Register(Register::<CurrentNetwork>::Locator(1)));
110 assert_eq!(output.register_type(), &RegisterType::<CurrentNetwork>::from_str("signature")?);
111
112 let output = Output::<CurrentNetwork>::parse("output r2 as token.record;").unwrap().1;
114 assert_eq!(output.operand(), &Operand::Register(Register::<CurrentNetwork>::Locator(2)));
115 assert_eq!(output.register_type(), &RegisterType::<CurrentNetwork>::from_str("token.record")?);
116
117 Ok(())
118 }
119
120 #[test]
121 fn test_output_display() {
122 let output = Output::<CurrentNetwork>::parse("output r0 as field;").unwrap().1;
124 assert_eq!(format!("{output}"), "output r0 as field;");
125
126 let output = Output::<CurrentNetwork>::parse("output 0u8 as u8;").unwrap().1;
128 assert_eq!(format!("{output}"), "output 0u8 as u8;");
129
130 let output = Output::<CurrentNetwork>::parse("output r1 as signature;").unwrap().1;
132 assert_eq!(format!("{output}"), "output r1 as signature;");
133
134 let output = Output::<CurrentNetwork>::parse("output r2 as token.record;").unwrap().1;
136 assert_eq!(format!("{output}"), "output r2 as token.record;");
137 }
138}