snarkvm_console_program/data/access/
parse.rs1use super::*;
17
18impl<N: Network> Parser for Access<N> {
19 fn parse(string: &str) -> ParserResult<Self> {
20 alt((
21 map(pair(tag("["), pair(U32::parse, tag("]"))), |(_, (index, _))| Self::Index(index)),
22 map(pair(tag("."), Identifier::parse), |(_, identifier)| Self::Member(identifier)),
23 ))(string)
24 }
25}
26
27impl<N: Network> FromStr for Access<N> {
28 type Err = Error;
29
30 #[inline]
32 fn from_str(string: &str) -> Result<Self> {
33 match Self::parse(string) {
34 Ok((remainder, object)) => {
35 ensure!(remainder.is_empty(), "Failed to parse string. Found invalid character in: \"{remainder}\"");
37 Ok(object)
39 }
40 Err(error) => bail!("Failed to parse string. {error}"),
41 }
42 }
43}
44
45impl<N: Network> Debug for Access<N> {
46 fn fmt(&self, f: &mut Formatter) -> fmt::Result {
48 Display::fmt(self, f)
49 }
50}
51
52impl<N: Network> Display for Access<N> {
53 fn fmt(&self, f: &mut Formatter) -> fmt::Result {
55 match self {
56 Self::Member(identifier) => write!(f, ".{}", identifier),
58 Self::Index(index) => write!(f, "[{}]", index),
60 }
61 }
62}
63
64#[cfg(test)]
65mod tests {
66 use super::*;
67 use snarkvm_console_network::MainnetV0;
68
69 type CurrentNetwork = MainnetV0;
70
71 #[test]
72 fn test_parse() -> Result<()> {
73 assert_eq!(Access::parse(".data"), Ok(("", Access::<CurrentNetwork>::Member(Identifier::from_str("data")?))));
74 assert_eq!(Access::parse("[0u32]"), Ok(("", Access::<CurrentNetwork>::Index(U32::new(0)))));
75 Ok(())
76 }
77
78 #[test]
79 fn test_parse_fails() -> Result<()> {
80 assert!(Access::<CurrentNetwork>::parse("").is_err());
82 assert!(Access::<CurrentNetwork>::parse(".").is_err());
83 assert!(Access::<CurrentNetwork>::parse("[]").is_err());
84
85 assert!(Access::<CurrentNetwork>::parse(".0").is_err());
87 assert!(Access::<CurrentNetwork>::parse("[index]").is_err());
88 assert!(Access::<CurrentNetwork>::parse("[0.0]").is_err());
89 assert!(Access::<CurrentNetwork>::parse("[999999999999]").is_err());
90
91 let access =
93 Access::<CurrentNetwork>::parse(".foo_bar_baz_qux_quux_quuz_corge_grault_garply_waldo_fred_plugh_xyzzy");
94 assert!(access.is_err());
95
96 Ok(())
97 }
98
99 #[test]
100 fn test_display() -> Result<()> {
101 assert_eq!(Access::<CurrentNetwork>::Member(Identifier::from_str("foo")?).to_string(), ".foo");
102 assert_eq!(Access::<CurrentNetwork>::Index(U32::new(0)).to_string(), "[0u32]");
103 Ok(())
104 }
105}