proto_types/
field_mask.rs

1use crate::FieldMask;
2
3impl FieldMask {
4  pub fn new(paths: Vec<String>) -> Self {
5    FieldMask { paths }
6  }
7
8  pub fn is_empty(&self) -> bool {
9    self.paths.is_empty()
10  }
11
12  pub fn contains(&self, path: &str) -> bool {
13    self.paths.iter().any(|p| p == path)
14  }
15
16  pub fn add_path(&mut self, path: &str) {
17    self.paths.push(path.to_string());
18  }
19}
20
21#[cfg(feature = "serde")]
22mod serde {
23  use std::fmt;
24
25  use serde::{Deserialize, Serialize};
26
27  use crate::FieldMask;
28  impl Serialize for FieldMask {
29    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
30    where
31      S: serde::Serializer,
32    {
33      let joined_paths = self.paths.join(",");
34      serializer.serialize_str(&joined_paths)
35    }
36  }
37
38  impl<'de> Deserialize<'de> for FieldMask {
39    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
40    where
41      D: serde::Deserializer<'de>,
42    {
43      struct FieldMaskVisitor;
44
45      impl serde::de::Visitor<'_> for FieldMaskVisitor {
46        type Value = FieldMask;
47
48        fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
49          formatter.write_str("a comma-separated string of field paths")
50        }
51
52        fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
53        where
54          E: serde::de::Error,
55        {
56          if value.is_empty() {
57            return Ok(FieldMask { paths: Vec::new() });
58          }
59
60          let paths: Vec<String> = value.split(",").map(|s| s.trim().to_string()).collect();
61
62          Ok(FieldMask { paths })
63        }
64      }
65
66      deserializer.deserialize_str(FieldMaskVisitor)
67    }
68  }
69}