proto_types/
field_mask.rs1use 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}