snarkvm_console_program/data_types/finalize_type/
parse.rs1use super::*;
17
18impl<N: Network> Parser for FinalizeType<N> {
19 #[inline]
21 fn parse(string: &str) -> ParserResult<Self> {
22 alt((
24 map(pair(Locator::parse, tag(".future")), |(locator, _)| Self::Future(locator)),
25 map(pair(PlaintextType::parse, tag(".public")), |(plaintext_type, _)| Self::Plaintext(plaintext_type)),
26 ))(string)
27 }
28}
29
30impl<N: Network> FromStr for FinalizeType<N> {
31 type Err = Error;
32
33 fn from_str(string: &str) -> Result<Self> {
35 match Self::parse(string) {
36 Ok((remainder, object)) => {
37 ensure!(remainder.is_empty(), "Failed to parse string. Found invalid character in: \"{remainder}\"");
39 Ok(object)
41 }
42 Err(error) => bail!("Failed to parse string. {error}"),
43 }
44 }
45}
46
47impl<N: Network> Debug for FinalizeType<N> {
48 fn fmt(&self, f: &mut Formatter) -> fmt::Result {
50 Display::fmt(self, f)
51 }
52}
53
54impl<N: Network> Display for FinalizeType<N> {
55 fn fmt(&self, f: &mut Formatter) -> fmt::Result {
57 match self {
58 Self::Plaintext(plaintext_type) => write!(f, "{plaintext_type}.public"),
60 Self::Future(locator) => write!(f, "{locator}.future"),
62 }
63 }
64}
65
66#[cfg(test)]
67mod tests {
68 use super::*;
69 use snarkvm_console_network::MainnetV0;
70
71 type CurrentNetwork = MainnetV0;
72
73 #[test]
74 fn test_parse() -> Result<()> {
75 assert_eq!(
77 Ok(("", FinalizeType::<CurrentNetwork>::Plaintext(PlaintextType::from_str("field")?))),
78 FinalizeType::<CurrentNetwork>::parse("field.public")
79 );
80
81 assert_eq!(
83 Ok(("", FinalizeType::<CurrentNetwork>::Plaintext(PlaintextType::from_str("signature")?))),
84 FinalizeType::<CurrentNetwork>::parse("signature.public")
85 );
86
87 assert_eq!(
89 Ok(("", FinalizeType::<CurrentNetwork>::Future(Locator::from_str("credits.aleo/mint_public")?))),
90 FinalizeType::<CurrentNetwork>::parse("credits.aleo/mint_public.future")
91 );
92
93 Ok(())
94 }
95
96 #[test]
97 fn test_parse_fails() -> Result<()> {
98 assert!(FinalizeType::<CurrentNetwork>::parse("").is_err());
100
101 assert!(FinalizeType::<CurrentNetwork>::parse("{}").is_err());
103 assert!(FinalizeType::<CurrentNetwork>::parse("_").is_err());
104 assert!(FinalizeType::<CurrentNetwork>::parse("__").is_err());
105 assert!(FinalizeType::<CurrentNetwork>::parse("___").is_err());
106 assert!(FinalizeType::<CurrentNetwork>::parse("-").is_err());
107 assert!(FinalizeType::<CurrentNetwork>::parse("--").is_err());
108 assert!(FinalizeType::<CurrentNetwork>::parse("---").is_err());
109 assert!(FinalizeType::<CurrentNetwork>::parse("*").is_err());
110 assert!(FinalizeType::<CurrentNetwork>::parse("**").is_err());
111 assert!(FinalizeType::<CurrentNetwork>::parse("***").is_err());
112
113 assert!(FinalizeType::<CurrentNetwork>::parse("1").is_err());
115 assert!(FinalizeType::<CurrentNetwork>::parse("2").is_err());
116 assert!(FinalizeType::<CurrentNetwork>::parse("3").is_err());
117 assert!(FinalizeType::<CurrentNetwork>::parse("1foo").is_err());
118 assert!(FinalizeType::<CurrentNetwork>::parse("12").is_err());
119 assert!(FinalizeType::<CurrentNetwork>::parse("111").is_err());
120
121 let struct_ = FinalizeType::<CurrentNetwork>::parse(
123 "foo_bar_baz_qux_quux_quuz_corge_grault_garply_waldo_fred_plugh_xyzzy.private",
124 );
125 assert!(struct_.is_err());
126
127 Ok(())
128 }
129
130 #[test]
131 fn test_display() -> Result<()> {
132 assert_eq!(FinalizeType::<CurrentNetwork>::from_str("field.public")?.to_string(), "field.public");
133 assert_eq!(FinalizeType::<CurrentNetwork>::from_str("signature.public")?.to_string(), "signature.public");
134 assert_eq!(
135 FinalizeType::<CurrentNetwork>::from_str("credits.aleo/mint_public.future")?.to_string(),
136 "credits.aleo/mint_public.future"
137 );
138
139 Ok(())
140 }
141}