/ synthesizer / program / src / mapping / parse.rs
parse.rs
  1  // Copyright (c) 2019-2025 Alpha-Delta Network Inc.
  2  // This file is part of the deltavm library.
  3  
  4  // Licensed under the Apache License, Version 2.0 (the "License");
  5  // you may not use this file except in compliance with the License.
  6  // You may obtain a copy of the License at:
  7  
  8  // http://www.apache.org/licenses/LICENSE-2.0
  9  
 10  // Unless required by applicable law or agreed to in writing, software
 11  // distributed under the License is distributed on an "AS IS" BASIS,
 12  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 13  // See the License for the specific language governing permissions and
 14  // limitations under the License.
 15  
 16  use super::*;
 17  
 18  impl<N: Network> Parser for Mapping<N> {
 19      /// Parses a string into a mapping.
 20      #[inline]
 21      fn parse(string: &str) -> ParserResult<Self> {
 22          // Parse the whitespace and comments from the string.
 23          let (string, _) = Sanitizer::parse(string)?;
 24          // Parse the 'mapping' keyword from the string.
 25          let (string, _) = tag(Self::type_name())(string)?;
 26          // Parse the whitespace from the string.
 27          let (string, _) = Sanitizer::parse_whitespaces(string)?;
 28          // Parse the mapping name from the string.
 29          let (string, name) = Identifier::<N>::parse(string)?;
 30          // Parse the whitespace from the string.
 31          let (string, _) = Sanitizer::parse_whitespaces(string)?;
 32          // Parse the colon ':' keyword from the string.
 33          let (string, _) = tag(":")(string)?;
 34  
 35          // Parse the key statement from the string.
 36          let (string, key) = MapKey::parse(string)?;
 37          // Parse the value statement from the string.
 38          let (string, value) = MapValue::parse(string)?;
 39  
 40          // Return the mapping.
 41          Ok((string, Self::new(name, key, value)))
 42      }
 43  }
 44  
 45  impl<N: Network> FromStr for Mapping<N> {
 46      type Err = Error;
 47  
 48      /// Returns a mapping from a string literal.
 49      fn from_str(string: &str) -> Result<Self> {
 50          match Self::parse(string) {
 51              Ok((remainder, object)) => {
 52                  // Ensure the remainder is empty.
 53                  ensure!(remainder.is_empty(), "Failed to parse string. Found invalid character in: \"{remainder}\"");
 54                  // Return the object.
 55                  Ok(object)
 56              }
 57              Err(error) => bail!("Failed to parse string. {error}"),
 58          }
 59      }
 60  }
 61  
 62  impl<N: Network> Debug for Mapping<N> {
 63      /// Prints the mapping as a string.
 64      fn fmt(&self, f: &mut Formatter) -> fmt::Result {
 65          Display::fmt(self, f)
 66      }
 67  }
 68  
 69  impl<N: Network> Display for Mapping<N> {
 70      /// Prints the mapping as a string.
 71      fn fmt(&self, f: &mut Formatter) -> fmt::Result {
 72          // Write the mapping to a string.
 73          write!(f, "{} {}:", Self::type_name(), self.name)?;
 74          write!(f, "\n    {}", self.key)?;
 75          write!(f, "\n    {}", self.value)
 76      }
 77  }
 78  
 79  #[cfg(test)]
 80  mod tests {
 81      use super::*;
 82      use console::network::MainnetV0;
 83  
 84      type CurrentNetwork = MainnetV0;
 85  
 86      #[test]
 87      fn test_mapping_parse() {
 88          let mapping = Mapping::<CurrentNetwork>::parse(
 89              r"
 90  mapping foo:
 91      key as field.public;
 92      value as field.public;",
 93          )
 94          .unwrap()
 95          .1;
 96          assert_eq!("foo", mapping.name().to_string());
 97          assert_eq!("field", mapping.key.plaintext_type().to_string());
 98          assert_eq!("field", mapping.value.plaintext_type().to_string());
 99      }
100  
101      #[test]
102      fn test_mapping_display() {
103          let expected = r"mapping foo:
104      key as field.public;
105      value as field.public;";
106          let mapping = Mapping::<CurrentNetwork>::parse(expected).unwrap().1;
107          assert_eq!(expected, format!("{mapping}"),);
108      }
109  }