snarkvm_synthesizer_program/logic/command/
await_.rs1use crate::Opcode;
17use console::{network::prelude::*, program::Register};
18
19#[derive(Clone, PartialEq, Eq, Hash)]
23pub struct Await<N: Network> {
24 register: Register<N>,
26}
27
28impl<N: Network> Await<N> {
29 #[inline]
31 pub const fn opcode() -> Opcode {
32 Opcode::Command("await")
33 }
34
35 #[inline]
37 pub const fn register(&self) -> &Register<N> {
38 &self.register
39 }
40}
41
42impl<N: Network> Parser for Await<N> {
43 #[inline]
45 fn parse(string: &str) -> ParserResult<Self> {
46 let (string, _) = Sanitizer::parse(string)?;
48 let (string, _) = tag(*Self::opcode())(string)?;
50 let (string, _) = Sanitizer::parse_whitespaces(string)?;
52 let (string, register) = Register::parse(string)?;
54 let (string, _) = Sanitizer::parse_whitespaces(string)?;
56 let (string, _) = tag(";")(string)?;
58
59 Ok((string, Self { register }))
60 }
61}
62
63impl<N: Network> FromStr for Await<N> {
64 type Err = Error;
65
66 #[inline]
68 fn from_str(string: &str) -> Result<Self> {
69 match Self::parse(string) {
70 Ok((remainder, object)) => {
71 ensure!(remainder.is_empty(), "Failed to parse string. Found invalid character in: \"{remainder}\"");
73 Ok(object)
75 }
76 Err(error) => bail!("Failed to parse string. {error}"),
77 }
78 }
79}
80
81impl<N: Network> Debug for Await<N> {
82 fn fmt(&self, f: &mut Formatter) -> fmt::Result {
84 Display::fmt(self, f)
85 }
86}
87
88impl<N: Network> Display for Await<N> {
89 fn fmt(&self, f: &mut Formatter) -> fmt::Result {
91 write!(f, "await {};", self.register)
93 }
94}
95
96impl<N: Network> FromBytes for Await<N> {
97 fn read_le<R: Read>(mut reader: R) -> IoResult<Self> {
99 let register = Register::read_le(&mut reader)?;
101
102 Ok(Self { register })
103 }
104}
105
106impl<N: Network> ToBytes for Await<N> {
107 fn write_le<W: Write>(&self, mut writer: W) -> IoResult<()> {
109 self.register.write_le(&mut writer)?;
111 Ok(())
112 }
113}
114
115#[cfg(test)]
116mod tests {
117 use super::*;
118 use console::{network::MainnetV0, program::Register};
119
120 type CurrentNetwork = MainnetV0;
121
122 #[test]
123 fn test_parse() {
124 let (string, await_) = Await::<CurrentNetwork>::parse("await r1;").unwrap();
125 assert!(string.is_empty(), "Parser did not consume all of the string: '{string}'");
126 assert_eq!(await_.register(), &Register::Locator(1));
127 }
128}