Guest User

Untitled

a guest
Jul 17th, 2018
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.57 KB | None | 0 0
  1. #[macro_use]
  2. extern crate serde_derive; // 1.0.68
  3. extern crate serde_json; // 1.0.22;
  4. extern crate serde; // 1.0.68
  5.  
  6. use std::time::Duration;
  7. use serde::*;
  8.  
  9. #[derive(Clone, Copy, Debug)]
  10. pub struct Seconds(Duration);
  11.  
  12. impl Seconds {
  13. pub fn new(secs: u64) -> Self {
  14. Seconds(Duration::from_secs(secs))
  15. }
  16.  
  17. pub fn value(&self) -> u64 {
  18. self.0.as_secs()
  19. }
  20. }
  21.  
  22.  
  23. impl Serialize for Seconds {
  24. fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
  25. serializer.serialize_u64(self.value())
  26. }
  27. }
  28.  
  29. impl<'de> Deserialize<'de> for Seconds {
  30. fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
  31. let secs = u64::deserialize(deserializer)?;
  32. Ok(Seconds::new(secs))
  33. }
  34. }
  35.  
  36.  
  37.  
  38. #[derive(Clone, Debug, Serialize, Deserialize)]
  39. #[serde(rename_all = "lowercase", tag = "mode")]
  40. pub enum Mode {
  41. Active,
  42. Passive {
  43. #[serde(rename = "mode.timeout")]
  44. timeout: Seconds,
  45. #[serde(rename = "mode.alarm")]
  46. alarm: Seconds,
  47. },
  48. Dark {
  49. #[serde(rename = "mode.timeout")]
  50. timeout: Seconds,
  51. },
  52. Offline,
  53. }
  54.  
  55. #[derive(Debug, Serialize, Deserialize)]
  56. pub struct UserDefaults {
  57. pub tracing: bool,
  58. #[serde(flatten)]
  59. mode: Mode,
  60. }
  61.  
  62. fn main() {
  63. let defaults = UserDefaults {
  64. tracing: true,
  65. mode: Mode::Dark { timeout: Seconds::new(10) },
  66. };
  67. let serialized = serde_json::to_string(&defaults).unwrap();
  68. println!("Serialized: {}", serialized);
  69. let deserialized: UserDefaults = serde_json::from_str(&serialized).unwrap();
  70. println!("Deserialized: {:#?}", deserialized);
  71. }
Add Comment
Please, Sign In to add comment