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