use super::*;
impl<N: Network> Parser for FinalizeType<N> {
#[inline]
fn parse(string: &str) -> ParserResult<Self> {
alt((
map(pair(PlaintextType::parse, tag(".public")), |(plaintext_type, _)| Self::Public(plaintext_type)),
map(pair(Identifier::parse, tag(".record")), |(identifier, _)| Self::Record(identifier)),
map(pair(Locator::parse, tag(".record")), |(locator, _)| Self::ExternalRecord(locator)),
))(string)
}
}
impl<N: Network> FromStr for FinalizeType<N> {
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> Debug for FinalizeType<N> {
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
Display::fmt(self, f)
}
}
impl<N: Network> Display for FinalizeType<N> {
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
match self {
Self::Public(plaintext_type) => write!(f, "{plaintext_type}.public"),
Self::Record(identifier) => write!(f, "{identifier}.record"),
Self::ExternalRecord(locator) => write!(f, "{locator}.record"),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use snarkvm_console_network::Testnet3;
type CurrentNetwork = Testnet3;
#[test]
fn test_parse() -> Result<()> {
assert_eq!(
Ok(("", FinalizeType::<CurrentNetwork>::from_str("field.public")?)),
FinalizeType::<CurrentNetwork>::parse("field.public")
);
assert_eq!(
Ok(("", FinalizeType::<CurrentNetwork>::from_str("signature.public")?)),
FinalizeType::<CurrentNetwork>::parse("signature.public")
);
assert_eq!(
Ok(("", FinalizeType::<CurrentNetwork>::from_str("token.record")?)),
FinalizeType::<CurrentNetwork>::parse("token.record")
);
assert_eq!(
FinalizeType::<CurrentNetwork>::Record(Identifier::from_str("message")?),
FinalizeType::<CurrentNetwork>::parse("message.record")?.1
);
assert_eq!(
Ok(("", FinalizeType::<CurrentNetwork>::from_str("howard.aleo/message.record")?)),
FinalizeType::<CurrentNetwork>::parse("howard.aleo/message.record")
);
assert_eq!(
FinalizeType::<CurrentNetwork>::ExternalRecord(Locator::from_str("howard.aleo/message")?),
FinalizeType::<CurrentNetwork>::parse("howard.aleo/message.record")?.1
);
Ok(())
}
#[test]
fn test_parse_fails() -> Result<()> {
assert!(FinalizeType::<CurrentNetwork>::parse("field").is_err());
assert!(FinalizeType::<CurrentNetwork>::parse("signature").is_err());
assert!(FinalizeType::<CurrentNetwork>::parse("token").is_err());
assert!(FinalizeType::<CurrentNetwork>::parse("").is_err());
assert!(FinalizeType::<CurrentNetwork>::parse("{}").is_err());
assert!(FinalizeType::<CurrentNetwork>::parse("_").is_err());
assert!(FinalizeType::<CurrentNetwork>::parse("__").is_err());
assert!(FinalizeType::<CurrentNetwork>::parse("___").is_err());
assert!(FinalizeType::<CurrentNetwork>::parse("-").is_err());
assert!(FinalizeType::<CurrentNetwork>::parse("--").is_err());
assert!(FinalizeType::<CurrentNetwork>::parse("---").is_err());
assert!(FinalizeType::<CurrentNetwork>::parse("*").is_err());
assert!(FinalizeType::<CurrentNetwork>::parse("**").is_err());
assert!(FinalizeType::<CurrentNetwork>::parse("***").is_err());
assert!(FinalizeType::<CurrentNetwork>::parse("1").is_err());
assert!(FinalizeType::<CurrentNetwork>::parse("2").is_err());
assert!(FinalizeType::<CurrentNetwork>::parse("3").is_err());
assert!(FinalizeType::<CurrentNetwork>::parse("1foo").is_err());
assert!(FinalizeType::<CurrentNetwork>::parse("12").is_err());
assert!(FinalizeType::<CurrentNetwork>::parse("111").is_err());
let struct_ = FinalizeType::<CurrentNetwork>::parse(
"foo_bar_baz_qux_quux_quuz_corge_grault_garply_waldo_fred_plugh_xyzzy.private",
);
assert!(struct_.is_err());
Ok(())
}
#[test]
fn test_display() -> Result<()> {
assert_eq!(FinalizeType::<CurrentNetwork>::from_str("field.public")?.to_string(), "field.public");
assert_eq!(FinalizeType::<CurrentNetwork>::from_str("signature.public")?.to_string(), "signature.public");
assert_eq!(FinalizeType::<CurrentNetwork>::from_str("token.record")?.to_string(), "token.record");
assert_eq!(
FinalizeType::<CurrentNetwork>::from_str("howard.aleo/message.record")?.to_string(),
"howard.aleo/message.record"
);
Ok(())
}
}