snarkvm_synthesizer_program/finalize/
parse.rs1use super::*;
17
18impl<N: Network, Command: CommandTrait<N>> Parser for FinalizeCore<N, Command> {
19 #[inline]
21 fn parse(string: &str) -> ParserResult<Self> {
22 let (string, _) = Sanitizer::parse(string)?;
24 let (string, _) = tag(Self::type_name())(string)?;
26 let (string, _) = Sanitizer::parse_whitespaces(string)?;
28 let (string, name) = Identifier::<N>::parse(string)?;
30 let (string, _) = Sanitizer::parse_whitespaces(string)?;
32 let (string, _) = tag(":")(string)?;
34
35 let (string, inputs) = many0(Input::parse)(string)?;
37 let (string, commands) = many1(Command::parse)(string)?;
39
40 map_res(take(0usize), move |_| {
41 let mut finalize = Self::new(name);
43 if let Err(error) = inputs.iter().cloned().try_for_each(|input| finalize.add_input(input)) {
44 eprintln!("{error}");
45 return Err(error);
46 }
47 if let Err(error) = commands.iter().cloned().try_for_each(|command| finalize.add_command(command)) {
48 eprintln!("{error}");
49 return Err(error);
50 }
51 Ok::<_, Error>(finalize)
52 })(string)
53 }
54}
55
56impl<N: Network, Command: CommandTrait<N>> FromStr for FinalizeCore<N, Command> {
57 type Err = Error;
58
59 fn from_str(string: &str) -> Result<Self> {
61 match Self::parse(string) {
62 Ok((remainder, object)) => {
63 ensure!(remainder.is_empty(), "Failed to parse string. Found invalid character in: \"{remainder}\"");
65 Ok(object)
67 }
68 Err(error) => bail!("Failed to parse string. {error}"),
69 }
70 }
71}
72
73impl<N: Network, Command: CommandTrait<N>> Debug for FinalizeCore<N, Command> {
74 fn fmt(&self, f: &mut Formatter) -> fmt::Result {
76 Display::fmt(self, f)
77 }
78}
79
80impl<N: Network, Command: CommandTrait<N>> Display for FinalizeCore<N, Command> {
81 fn fmt(&self, f: &mut Formatter) -> fmt::Result {
83 write!(f, "{} {}:", Self::type_name(), self.name)?;
85 self.inputs.iter().try_for_each(|input| write!(f, "\n {input}"))?;
86 self.commands.iter().try_for_each(|command| write!(f, "\n {command}"))
87 }
88}
89
90#[cfg(test)]
91mod tests {
92 use super::*;
93 use crate::Finalize;
94 use console::network::MainnetV0;
95
96 type CurrentNetwork = MainnetV0;
97
98 #[test]
99 fn test_finalize_parse() {
100 let finalize = Finalize::<CurrentNetwork>::parse(
101 r"
102finalize foo:
103 input r0 as field.public;
104 input r1 as field.public;
105 add r0 r1 into r2;",
106 )
107 .unwrap()
108 .1;
109 assert_eq!("foo", finalize.name().to_string());
110 assert_eq!(2, finalize.inputs().len());
111 assert_eq!(1, finalize.commands().len());
112
113 let finalize = Finalize::<CurrentNetwork>::parse(
115 r"
116finalize foo:
117 add 1u32 2u32 into r0;",
118 )
119 .unwrap()
120 .1;
121 assert_eq!("foo", finalize.name().to_string());
122 assert_eq!(0, finalize.inputs().len());
123 assert_eq!(1, finalize.commands().len());
124 }
125
126 #[test]
127 fn test_finalize_parse_cast() {
128 let finalize = Finalize::<CurrentNetwork>::parse(
129 r"
130finalize foo:
131 input r0 as token.public;
132 cast r0.owner r0.token_amount into r1 as token;",
133 )
134 .unwrap()
135 .1;
136 assert_eq!("foo", finalize.name().to_string());
137 assert_eq!(1, finalize.inputs().len());
138 assert_eq!(1, finalize.commands().len());
139 }
140
141 #[test]
142 fn test_finalize_display() {
143 let expected = r"finalize foo:
144 input r0 as field.public;
145 input r1 as field.public;
146 add r0 r1 into r2;";
147 let finalize = Finalize::<CurrentNetwork>::parse(expected).unwrap().1;
148 assert_eq!(expected, format!("{finalize}"),);
149 }
150}