From 26d76837195225c395e457588c9461bb2129536d Mon Sep 17 00:00:00 2001 From: Victor Koenders Date: Sat, 16 Oct 2021 13:47:48 +0200 Subject: [PATCH] Added support for Path and PathBuf --- src/error.rs | 3 +++ src/features/impl_std.rs | 30 ++++++++++++++++++++++++++++++ tests/std.rs | 13 ++++++++++++- 3 files changed, 45 insertions(+), 1 deletion(-) diff --git a/src/error.rs b/src/error.rs index 143d1f5..77528df 100644 --- a/src/error.rs +++ b/src/error.rs @@ -15,6 +15,9 @@ pub enum EncodeError { type_name: &'static str, }, + /// An uncommon error occured, see the inner text for more information + Other(&'static str), + /// The targetted writer encountered an `std::io::Error` #[cfg(feature = "std")] Io { diff --git a/src/features/impl_std.rs b/src/features/impl_std.rs index e3f2a17..4b1d8b7 100644 --- a/src/features/impl_std.rs +++ b/src/features/impl_std.rs @@ -7,6 +7,7 @@ use crate::{ use core::time::Duration; use std::{ ffi::{CStr, CString}, + path::{Path, PathBuf}, sync::{Mutex, RwLock}, time::SystemTime, }; @@ -173,3 +174,32 @@ impl Decodable for SystemTime { Ok(SystemTime::UNIX_EPOCH + duration) } } + +impl Encodeable for &'_ Path { + fn encode(&self, encoder: E) -> Result<(), EncodeError> { + match self.to_str() { + Some(str) => str.encode(encoder), + None => Err(EncodeError::Other("Path contains invalid UTF-8 characters")), + } + } +} + +impl<'de> BorrowDecodable<'de> for &'de Path { + fn borrow_decode>(decoder: D) -> Result { + let str = <&'de str>::borrow_decode(decoder)?; + Ok(Path::new(str)) + } +} + +impl Encodeable for PathBuf { + fn encode(&self, encoder: E) -> Result<(), EncodeError> { + self.as_path().encode(encoder) + } +} + +impl Decodable for PathBuf { + fn decode(decoder: D) -> Result { + let string = std::string::String::decode(decoder)?; + Ok(string.into()) + } +} diff --git a/tests/std.rs b/tests/std.rs index 7646a4a..fafde3a 100644 --- a/tests/std.rs +++ b/tests/std.rs @@ -59,23 +59,34 @@ fn test_std_file() { #[test] fn test_std_commons() { use std::ffi::{CStr, CString}; + use std::path::{Path, PathBuf}; the_same(CString::new("Hello world").unwrap()); + the_same(PathBuf::from("C:/Program Files/Foo")); let config = bincode::config::Default; let mut buffer = [0u8; 1024]; + // &CStr let cstr = CStr::from_bytes_with_nul(b"Hello world\0").unwrap(); let len = bincode::encode_into_slice_with_config(cstr, &mut buffer, config).unwrap(); let decoded: &CStr = bincode::decode_with_config(&mut buffer[..len], config).unwrap(); assert_eq!(cstr, decoded); + // Mutex let mutex = Mutex::new("Hello world".to_string()); let len = bincode::encode_into_slice_with_config(&mutex, &mut buffer, config).unwrap(); let decoded: Mutex = bincode::decode_with_config(&mut buffer[..len], config).unwrap(); assert_eq!(&*mutex.lock().unwrap(), &*decoded.lock().unwrap()); + // RwLock let rwlock = RwLock::new("Hello world".to_string()); - let len = bincode::encode_into_slice_with_config(&mutex, &mut buffer, config).unwrap(); + let len = bincode::encode_into_slice_with_config(&rwlock, &mut buffer, config).unwrap(); let decoded: RwLock = bincode::decode_with_config(&mut buffer[..len], config).unwrap(); assert_eq!(&*rwlock.read().unwrap(), &*decoded.read().unwrap()); + + // Path + let path = Path::new("C:/Program Files/Foo"); + let len = bincode::encode_into_slice_with_config(path, &mut buffer, config).unwrap(); + let decoded: &Path = bincode::decode_with_config(&mut buffer[..len], config).unwrap(); + assert_eq!(path, decoded); }