snarkvm_synthesizer_program/logic/command/
await_.rs1use crate::{Opcode, Operand};
17use console::{network::prelude::*, program::Register};
18
19#[derive(Clone, PartialEq, Eq, Hash)]
23pub struct Await<N: Network> {
24 operands: [Operand<N>; 1],
27}
28
29impl<N: Network> Await<N> {
30 #[inline]
32 pub const fn opcode() -> Opcode {
33 Opcode::Command("await")
34 }
35
36 #[inline]
38 pub fn operands(&self) -> &[Operand<N>] {
39 &self.operands
40 }
41
42 #[inline]
44 pub fn register(&self) -> &Register<N> {
45 let Operand::Register(register) = &self.operands[0] else {
47 unreachable!("The operands of an await command must be a single register.")
48 };
49 register
51 }
52
53 #[inline]
55 pub fn contains_external_struct(&self) -> bool {
56 false
57 }
58}
59
60impl<N: Network> Parser for Await<N> {
61 #[inline]
63 fn parse(string: &str) -> ParserResult<Self> {
64 let (string, _) = Sanitizer::parse(string)?;
66 let (string, _) = tag(*Self::opcode())(string)?;
68 let (string, _) = Sanitizer::parse_whitespaces(string)?;
70 let (string, register) = Register::parse(string)?;
72 let (string, _) = Sanitizer::parse_whitespaces(string)?;
74 let (string, _) = tag(";")(string)?;
76
77 Ok((string, Self { operands: [Operand::Register(register)] }))
78 }
79}
80
81impl<N: Network> FromStr for Await<N> {
82 type Err = Error;
83
84 #[inline]
86 fn from_str(string: &str) -> Result<Self> {
87 match Self::parse(string) {
88 Ok((remainder, object)) => {
89 ensure!(remainder.is_empty(), "Failed to parse string. Found invalid character in: \"{remainder}\"");
91 Ok(object)
93 }
94 Err(error) => bail!("Failed to parse string. {error}"),
95 }
96 }
97}
98
99impl<N: Network> Debug for Await<N> {
100 fn fmt(&self, f: &mut Formatter) -> fmt::Result {
102 Display::fmt(self, f)
103 }
104}
105
106impl<N: Network> Display for Await<N> {
107 fn fmt(&self, f: &mut Formatter) -> fmt::Result {
109 write!(f, "await {};", self.register())
111 }
112}
113
114impl<N: Network> FromBytes for Await<N> {
115 fn read_le<R: Read>(mut reader: R) -> IoResult<Self> {
117 let register = Register::read_le(&mut reader)?;
119
120 Ok(Self { operands: [Operand::Register(register)] })
121 }
122}
123
124impl<N: Network> ToBytes for Await<N> {
125 fn write_le<W: Write>(&self, mut writer: W) -> IoResult<()> {
127 self.register().write_le(&mut writer)?;
129 Ok(())
130 }
131}
132
133#[cfg(test)]
134mod tests {
135 use super::*;
136 use console::{network::MainnetV0, program::Register};
137
138 type CurrentNetwork = MainnetV0;
139
140 #[test]
141 fn test_parse() {
142 let (string, await_) = Await::<CurrentNetwork>::parse("await r1;").unwrap();
143 assert!(string.is_empty(), "Parser did not consume all of the string: '{string}'");
144 assert_eq!(await_.register(), &Register::Locator(1));
145 }
146}