snarkvm_console_program/data/future/
parse.rs1use super::*;
17
18impl<N: Network> Parser for Future<N> {
19 #[inline]
21 fn parse(string: &str) -> ParserResult<Self> {
22 fn parse_arguments<N: Network>(string: &str) -> ParserResult<Vec<Argument<N>>> {
24 let (string, _) = Sanitizer::parse(string)?;
26 let (string, _) = tag("[")(string)?;
28 let (string, _) = Sanitizer::parse(string)?;
30 let (string, arguments) = separated_list0(
32 pair(pair(Sanitizer::parse_whitespaces, tag(",")), Sanitizer::parse),
33 alt((map(Future::parse, Argument::Future), map(Plaintext::parse, Argument::Plaintext))),
34 )(string)?;
35 let (string, _) = Sanitizer::parse(string)?;
37 let (string, _) = tag("]")(string)?;
39 Ok((string, arguments))
41 }
42
43 let (string, _) = Sanitizer::parse(string)?;
45 let (string, _) = tag("{")(string)?;
47
48 let (string, _) = Sanitizer::parse(string)?;
50 let (string, _) = tag("program_id")(string)?;
52 let (string, _) = Sanitizer::parse_whitespaces(string)?;
54 let (string, _) = tag(":")(string)?;
56 let (string, _) = Sanitizer::parse_whitespaces(string)?;
58 let (string, program_id) = ProgramID::parse(string)?;
60 let (string, _) = Sanitizer::parse_whitespaces(string)?;
62 let (string, _) = tag(",")(string)?;
64
65 let (string, _) = Sanitizer::parse(string)?;
67 let (string, _) = tag("function_name")(string)?;
69 let (string, _) = Sanitizer::parse_whitespaces(string)?;
71 let (string, _) = tag(":")(string)?;
73 let (string, _) = Sanitizer::parse_whitespaces(string)?;
75 let (string, function_name) = Identifier::parse(string)?;
77 let (string, _) = Sanitizer::parse_whitespaces(string)?;
79 let (string, _) = tag(",")(string)?;
81
82 let (string, _) = Sanitizer::parse(string)?;
84 let (string, _) = tag("arguments")(string)?;
86 let (string, _) = Sanitizer::parse_whitespaces(string)?;
88 let (string, _) = tag(":")(string)?;
90 let (string, _) = Sanitizer::parse_whitespaces(string)?;
92 let (string, arguments) = parse_arguments(string)?;
94
95 let (string, _) = Sanitizer::parse(string)?;
97 let (string, _) = tag("}")(string)?;
99
100 Ok((string, Self::new(program_id, function_name, arguments)))
101 }
102}
103
104impl<N: Network> FromStr for Future<N> {
105 type Err = Error;
106
107 fn from_str(string: &str) -> Result<Self> {
109 match Self::parse(string) {
110 Ok((remainder, object)) => {
111 ensure!(remainder.is_empty(), "Failed to parse string. Found invalid character in: \"{remainder}\"");
113 Ok(object)
115 }
116 Err(error) => bail!("Failed to parse string. {error}"),
117 }
118 }
119}
120
121impl<N: Network> Debug for Future<N> {
122 fn fmt(&self, f: &mut Formatter) -> fmt::Result {
124 Display::fmt(self, f)
125 }
126}
127
128impl<N: Network> Display for Future<N> {
129 fn fmt(&self, f: &mut Formatter) -> fmt::Result {
131 self.fmt_internal(f, 0)
132 }
133}
134
135impl<N: Network> Future<N> {
136 fn fmt_internal(&self, f: &mut Formatter, depth: usize) -> fmt::Result {
138 const INDENT: usize = 2;
140
141 write!(f, "{{")?;
143
144 write!(
146 f,
147 "\n{:indent$}program_id: {program_id},",
148 "",
149 indent = (depth + 1) * INDENT,
150 program_id = self.program_id()
151 )?;
152 write!(
154 f,
155 "\n{:indent$}function_name: {function_name},",
156 "",
157 indent = (depth + 1) * INDENT,
158 function_name = self.function_name()
159 )?;
160 if self.arguments.is_empty() {
163 write!(f, "\n{:indent$}arguments: []", "", indent = (depth + 1) * INDENT)?;
164 } else {
165 write!(f, "\n{:indent$}arguments: [", "", indent = (depth + 1) * INDENT)?;
166 self.arguments.iter().enumerate().try_for_each(|(i, argument)| {
167 match argument {
168 Argument::Plaintext(plaintext) => match i == self.arguments.len() - 1 {
169 true => {
170 write!(
172 f,
173 "\n{:indent$}{plaintext}",
174 "",
175 indent = (depth + 2) * INDENT,
176 plaintext = plaintext
177 )
178 }
179 false => {
181 write!(
182 f,
183 "\n{:indent$}{plaintext},",
184 "",
185 indent = (depth + 2) * INDENT,
186 plaintext = plaintext
187 )
188 }
189 },
190 Argument::Future(future) => {
191 write!(f, "\n{:indent$}", "", indent = (depth + 2) * INDENT)?;
193 future.fmt_internal(f, depth + 2)?;
195 match i == self.arguments.len() - 1 {
197 true => write!(f, "\n{:indent$}", "", indent = (depth + 1) * INDENT),
199 false => write!(f, ","),
201 }
202 }
203 }
204 })?;
205 write!(f, "\n{:indent$}]", "", indent = (depth + 1) * INDENT)?;
207 }
208
209 write!(f, "\n{:indent$}}}", "", indent = depth * INDENT)
211 }
212}
213
214#[cfg(test)]
215mod tests {
216 use super::*;
217 use snarkvm_console_network::MainnetV0;
218
219 type CurrentNetwork = MainnetV0;
220
221 #[test]
222 fn test_parse_future() -> Result<()> {
223 let expected = r"{
225 program_id: credits.aleo,
226 function_name: transfer,
227 arguments: []
228}";
229 let (remainder, candidate) =
230 Future::<CurrentNetwork>::parse("{ program_id: credits.aleo, function_name: transfer, arguments: [] }")?;
231 assert!(remainder.is_empty());
232 assert_eq!(expected, candidate.to_string());
233 assert_eq!("", remainder);
234
235 let expected = r"{
237 program_id: credits.aleo,
238 function_name: transfer_public_to_private,
239 arguments: [
240 aleo1g8qul5a44vk22u9uuvaewdcjw4v6xg8wx0llru39nnjn7eu08yrscxe4e2,
241 100000000u64
242 ]
243}";
244 let (remainder, candidate) = Future::<CurrentNetwork>::parse(
245 "{ program_id: credits.aleo, function_name: transfer_public_to_private, arguments: [ aleo1g8qul5a44vk22u9uuvaewdcjw4v6xg8wx0llru39nnjn7eu08yrscxe4e2, 100000000u64 ] }",
246 )?;
247 assert!(remainder.is_empty());
248 assert_eq!(expected, candidate.to_string());
249 assert_eq!("", remainder);
250
251 Ok(())
252 }
253}