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