1 use std::fmt;
2 
3 /// A plist `uid` value. These are found exclusively in plists created by `NSKeyedArchiver`.
4 #[derive(Clone, Copy, Eq, Hash, PartialEq)]
5 pub struct Uid {
6     value: u64,
7 }
8 
9 impl Uid {
10     /// Creates a new `Uid` containing the given value.
new(value: u64) -> Uid11     pub fn new(value: u64) -> Uid {
12         Uid { value }
13     }
14 
15     /// Returns the value as a `u64`.
get(self) -> u6416     pub fn get(self) -> u64 {
17         self.value
18     }
19 }
20 
21 impl fmt::Debug for Uid {
fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error>22     fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
23         self.value.fmt(f)
24     }
25 }
26 
27 #[cfg(feature = "serde")]
28 pub mod serde_impls {
29     use serde::{
30         de::{Deserialize, Deserializer, Error, Visitor},
31         ser::{Serialize, Serializer},
32     };
33     use std::fmt;
34 
35     use crate::Uid;
36 
37     pub const UID_NEWTYPE_STRUCT_NAME: &str = "PLIST-UID";
38 
39     impl Serialize for Uid {
serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer,40         fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
41         where
42             S: Serializer,
43         {
44             serializer.serialize_newtype_struct(UID_NEWTYPE_STRUCT_NAME, &self.get())
45         }
46     }
47 
48     struct UidNewtypeVisitor;
49 
50     impl<'de> Visitor<'de> for UidNewtypeVisitor {
51         type Value = Uid;
52 
expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result53         fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
54             formatter.write_str("a plist uid")
55         }
56 
visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error> where D: Deserializer<'de>,57         fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
58         where
59             D: Deserializer<'de>,
60         {
61             deserializer.deserialize_str(UidU64Visitor)
62         }
63     }
64 
65     struct UidU64Visitor;
66 
67     impl<'de> Visitor<'de> for UidU64Visitor {
68         type Value = Uid;
69 
expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result70         fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
71             formatter.write_str("a plist uid")
72         }
73 
visit_u64<E>(self, v: u64) -> Result<Self::Value, E> where E: Error,74         fn visit_u64<E>(self, v: u64) -> Result<Self::Value, E>
75         where
76             E: Error,
77         {
78             Ok(Uid::new(v))
79         }
80     }
81 
82     impl<'de> Deserialize<'de> for Uid {
deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: Deserializer<'de>,83         fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
84         where
85             D: Deserializer<'de>,
86         {
87             deserializer.deserialize_newtype_struct(UID_NEWTYPE_STRUCT_NAME, UidNewtypeVisitor)
88         }
89     }
90 }
91