snarkvm_synthesizer_program/finalize/
parse.rsuse super::*;
impl<N: Network, Command: CommandTrait<N>> Parser for FinalizeCore<N, Command> {
#[inline]
fn parse(string: &str) -> ParserResult<Self> {
let (string, _) = Sanitizer::parse(string)?;
let (string, _) = tag(Self::type_name())(string)?;
let (string, _) = Sanitizer::parse_whitespaces(string)?;
let (string, name) = Identifier::<N>::parse(string)?;
let (string, _) = Sanitizer::parse_whitespaces(string)?;
let (string, _) = tag(":")(string)?;
let (string, inputs) = many0(Input::parse)(string)?;
let (string, commands) = many1(Command::parse)(string)?;
map_res(take(0usize), move |_| {
let mut finalize = Self::new(name);
if let Err(error) = inputs.iter().cloned().try_for_each(|input| finalize.add_input(input)) {
eprintln!("{error}");
return Err(error);
}
if let Err(error) = commands.iter().cloned().try_for_each(|command| finalize.add_command(command)) {
eprintln!("{error}");
return Err(error);
}
Ok::<_, Error>(finalize)
})(string)
}
}
impl<N: Network, Command: CommandTrait<N>> FromStr for FinalizeCore<N, Command> {
type Err = Error;
fn from_str(string: &str) -> Result<Self> {
match Self::parse(string) {
Ok((remainder, object)) => {
ensure!(remainder.is_empty(), "Failed to parse string. Found invalid character in: \"{remainder}\"");
Ok(object)
}
Err(error) => bail!("Failed to parse string. {error}"),
}
}
}
impl<N: Network, Command: CommandTrait<N>> Debug for FinalizeCore<N, Command> {
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
Display::fmt(self, f)
}
}
impl<N: Network, Command: CommandTrait<N>> Display for FinalizeCore<N, Command> {
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
write!(f, "{} {}:", Self::type_name(), self.name)?;
self.inputs.iter().try_for_each(|input| write!(f, "\n {input}"))?;
self.commands.iter().try_for_each(|command| write!(f, "\n {command}"))
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::Finalize;
use console::network::MainnetV0;
type CurrentNetwork = MainnetV0;
#[test]
fn test_finalize_parse() {
let finalize = Finalize::<CurrentNetwork>::parse(
r"
finalize foo:
input r0 as field.public;
input r1 as field.public;
add r0 r1 into r2;",
)
.unwrap()
.1;
assert_eq!("foo", finalize.name().to_string());
assert_eq!(2, finalize.inputs().len());
assert_eq!(1, finalize.commands().len());
let finalize = Finalize::<CurrentNetwork>::parse(
r"
finalize foo:
add 1u32 2u32 into r0;",
)
.unwrap()
.1;
assert_eq!("foo", finalize.name().to_string());
assert_eq!(0, finalize.inputs().len());
assert_eq!(1, finalize.commands().len());
}
#[test]
fn test_finalize_parse_cast() {
let finalize = Finalize::<CurrentNetwork>::parse(
r"
finalize foo:
input r0 as token.public;
cast r0.owner r0.token_amount into r1 as token;",
)
.unwrap()
.1;
assert_eq!("foo", finalize.name().to_string());
assert_eq!(1, finalize.inputs().len());
assert_eq!(1, finalize.commands().len());
}
#[test]
fn test_finalize_display() {
let expected = r"finalize foo:
input r0 as field.public;
input r1 as field.public;
add r0 r1 into r2;";
let finalize = Finalize::<CurrentNetwork>::parse(expected).unwrap().1;
assert_eq!(expected, format!("{finalize}"),);
}
}