forked from proxmox-mirrors/proxmox
		
	src/serde.rs: add serde helpers
This commit is contained in:
		
							parent
							
								
									adb425aeb2
								
							
						
					
					
						commit
						d966061f54
					
				@ -12,6 +12,9 @@ endian_trait = { version = "0.6", features = ["arrays"] }
 | 
			
		||||
libc = "0.2"
 | 
			
		||||
valgrind_request = { version = "1.1.0", optional = true }
 | 
			
		||||
failure = "0.1"
 | 
			
		||||
serde = { version = "1.0", features = ["derive"] }
 | 
			
		||||
base64 = "0.10"
 | 
			
		||||
chrono = "0.4"
 | 
			
		||||
 | 
			
		||||
[features]
 | 
			
		||||
default = [ "valgrind" ]
 | 
			
		||||
 | 
			
		||||
@ -4,6 +4,7 @@ use failure::*;
 | 
			
		||||
 | 
			
		||||
pub mod io;
 | 
			
		||||
pub mod vec;
 | 
			
		||||
pub mod serde;
 | 
			
		||||
 | 
			
		||||
/// Evaluates to the offset (in bytes) of a given member within a struct
 | 
			
		||||
#[macro_export]
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										51
									
								
								proxmox-tools/src/serde.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								proxmox-tools/src/serde.rs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,51 @@
 | 
			
		||||
//! Serialization helpers for serde
 | 
			
		||||
 | 
			
		||||
/// Sertialize DateTime<Local> as RFC3339
 | 
			
		||||
pub mod date_time_as_rfc3339 {
 | 
			
		||||
 | 
			
		||||
    use chrono::{Local, DateTime};
 | 
			
		||||
    use serde::{Serializer, Deserializer, Deserialize};
 | 
			
		||||
 | 
			
		||||
    pub fn serialize<S>(time: &DateTime<Local>, serializer: S) -> Result<S::Ok, S::Error>
 | 
			
		||||
        where S: Serializer,
 | 
			
		||||
    {
 | 
			
		||||
        serializer.serialize_str(&time.to_rfc3339())
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub fn deserialize<'de, D>(deserializer: D) -> Result<DateTime<Local>, D::Error>
 | 
			
		||||
        where D: Deserializer<'de>
 | 
			
		||||
    {
 | 
			
		||||
        use serde::de::Error;
 | 
			
		||||
        String::deserialize(deserializer)
 | 
			
		||||
            .and_then(|string| {
 | 
			
		||||
                string.parse::<DateTime<Local>>()
 | 
			
		||||
                    .map_err(|err| Error::custom(err.to_string()))
 | 
			
		||||
            })
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/// Serialize Vec<u8> as base64 encoded string.
 | 
			
		||||
pub mod bytes_as_base64 {
 | 
			
		||||
 | 
			
		||||
    use base64;
 | 
			
		||||
    use serde::{Serializer,Deserializer, Deserialize};
 | 
			
		||||
 | 
			
		||||
    pub fn serialize<S, T>(data: &T, serializer: S) -> Result<S::Ok, S::Error>
 | 
			
		||||
        where T: AsRef<[u8]>,
 | 
			
		||||
              S: Serializer,
 | 
			
		||||
    {
 | 
			
		||||
        serializer.serialize_str(&base64::encode(data.as_ref()))
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub fn deserialize<'de, D>(deserializer: D) -> Result<Vec<u8>, D::Error>
 | 
			
		||||
        where D: Deserializer<'de>
 | 
			
		||||
    {
 | 
			
		||||
        use serde::de::Error;
 | 
			
		||||
        String::deserialize(deserializer)
 | 
			
		||||
            .and_then(|string| {
 | 
			
		||||
                base64::decode(&string)
 | 
			
		||||
                    .map_err(|err| Error::custom(err.to_string()))
 | 
			
		||||
            })
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user