LCOV - code coverage report
Current view: top level - libs/utils/src - serde_regex.rs (source / functions) Coverage Total Hit
Test: 050dd70dd490b28fffe527eae9fb8a1222b5c59c.info Lines: 86.7 % 30 26
Test Date: 2024-06-25 21:28:46 Functions: 45.5 % 11 5

            Line data    Source code
       1              : //! A `serde::{Deserialize,Serialize}` type for regexes.
       2              : 
       3              : use std::ops::Deref;
       4              : 
       5            2 : #[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
       6              : #[serde(transparent)]
       7              : pub struct Regex(
       8              :     #[serde(
       9              :         deserialize_with = "deserialize_regex",
      10              :         serialize_with = "serialize_regex"
      11              :     )]
      12              :     regex::Regex,
      13              : );
      14              : 
      15            2 : fn deserialize_regex<'de, D>(deserializer: D) -> Result<regex::Regex, D::Error>
      16            2 : where
      17            2 :     D: serde::de::Deserializer<'de>,
      18            2 : {
      19            2 :     let s: String = serde::de::Deserialize::deserialize(deserializer)?;
      20            2 :     let re = regex::Regex::new(&s).map_err(serde::de::Error::custom)?;
      21            2 :     Ok(re)
      22            2 : }
      23              : 
      24            2 : fn serialize_regex<S>(re: &regex::Regex, serializer: S) -> Result<S::Ok, S::Error>
      25            2 : where
      26            2 :     S: serde::ser::Serializer,
      27            2 : {
      28            2 :     serializer.collect_str(re.as_str())
      29            2 : }
      30              : 
      31              : impl Deref for Regex {
      32              :     type Target = regex::Regex;
      33              : 
      34            4 :     fn deref(&self) -> &regex::Regex {
      35            4 :         &self.0
      36            4 :     }
      37              : }
      38              : 
      39              : impl PartialEq for Regex {
      40            0 :     fn eq(&self, other: &Regex) -> bool {
      41            0 :         // comparing the automatons would be quite complicated
      42            0 :         self.as_str() == other.as_str()
      43            0 :     }
      44              : }
      45              : 
      46              : impl Eq for Regex {}
      47              : 
      48              : #[cfg(test)]
      49              : mod tests {
      50              : 
      51              :     #[test]
      52            2 :     fn roundtrip() {
      53            2 :         let input = r#""foo.*bar""#;
      54            2 :         let re: super::Regex = serde_json::from_str(input).unwrap();
      55            2 :         assert!(re.is_match("foo123bar"));
      56            2 :         assert!(!re.is_match("foo"));
      57            2 :         let output = serde_json::to_string(&re).unwrap();
      58            2 :         assert_eq!(output, input);
      59            2 :     }
      60              : }
        

Generated by: LCOV version 2.1-beta