├── .gitignore ├── Cargo.toml ├── src ├── duration.rs ├── bytes.rs ├── time.rs ├── lib.rs ├── de.rs └── tests.rs ├── LICENSE └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | **/*.rs.bk 3 | Cargo.lock 4 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "serde-humanize-rs" 3 | version = "0.1.1" 4 | authors = ["dtynn "] 5 | description = """ 6 | A Serde deserializer for duration and byte-size. 7 | """ 8 | readme = "README.md" 9 | license-file = "LICENSE" 10 | homepage = "https://github.com/dtynn/serde-humanize-rs" 11 | documentation = "https://docs.rs/serde-humanize-rs" 12 | repository = "https://github.com/dtynn/serde-humanize-rs" 13 | keywords = ["humanize", "human-friendly", "readable", "serde", "deserialize"] 14 | categories = ["parsing"] 15 | 16 | [dependencies] 17 | serde = "1.0" 18 | humanize-rs = "0.1.4" 19 | 20 | [dev-dependencies] 21 | serde_derive = "1.0" 22 | serde_json = "1.0" 23 | -------------------------------------------------------------------------------- /src/duration.rs: -------------------------------------------------------------------------------- 1 | use de::DE; 2 | use humanize_rs::duration::parse; 3 | use serde::de::{Deserializer, Error, Unexpected, Visitor}; 4 | use std::fmt; 5 | use std::time::Duration; 6 | 7 | impl DE for Duration { 8 | fn de<'de, D>(d: D) -> Result 9 | where 10 | D: Deserializer<'de>, 11 | { 12 | struct V; 13 | 14 | impl<'v> Visitor<'v> for V { 15 | type Value = Duration; 16 | 17 | fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { 18 | formatter.write_str("expecting duration") 19 | } 20 | 21 | fn visit_str(self, s: &str) -> Result 22 | where 23 | E: Error, 24 | { 25 | parse(s).map_err(|_| Error::invalid_value(Unexpected::Str(s), &self)) 26 | } 27 | } 28 | 29 | d.deserialize_str(V) 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/bytes.rs: -------------------------------------------------------------------------------- 1 | use de::DE; 2 | use humanize_rs::bytes::Bytes; 3 | use serde::de::{Deserializer, Error, Unexpected, Visitor}; 4 | use std::fmt; 5 | 6 | impl DE for usize { 7 | fn de<'de, D>(d: D) -> Result 8 | where 9 | Self: Sized, 10 | D: Deserializer<'de>, 11 | { 12 | struct V; 13 | 14 | impl<'v> Visitor<'v> for V { 15 | type Value = usize; 16 | 17 | fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { 18 | formatter.write_str("expecting byte-size") 19 | } 20 | 21 | fn visit_str(self, s: &str) -> Result 22 | where 23 | E: Error, 24 | { 25 | let bytes = s 26 | .parse::() 27 | .map_err(|_| Error::invalid_value(Unexpected::Str(s), &self))?; 28 | 29 | Ok(bytes.size()) 30 | } 31 | } 32 | 33 | d.deserialize_str(V) 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/time.rs: -------------------------------------------------------------------------------- 1 | use de::DE; 2 | use humanize_rs::time::Time; 3 | use humanize_rs::ParseError; 4 | use serde::de::{Deserializer, Error, Unexpected, Visitor}; 5 | use std::fmt; 6 | use std::time::SystemTime; 7 | 8 | impl DE for SystemTime { 9 | fn de<'de, D>(d: D) -> Result 10 | where 11 | D: Deserializer<'de>, 12 | { 13 | struct V; 14 | 15 | impl<'v> Visitor<'v> for V { 16 | type Value = SystemTime; 17 | 18 | fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { 19 | formatter.write_str("expecting rfc3339 datetime string") 20 | } 21 | 22 | fn visit_str(self, s: &str) -> Result 23 | where 24 | E: Error, 25 | { 26 | s.parse::