trash_rev.rs 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. use serde::de::Visitor;
  2. use serde::{Deserialize, Serialize};
  3. use serde_repr::*;
  4. use std::fmt;
  5. #[derive(Default, Clone, Debug, Hash, Eq, PartialEq, Serialize, Deserialize)]
  6. pub struct TrashRevision {
  7. pub id: String,
  8. pub name: String,
  9. #[serde(default)]
  10. pub modified_time: i64,
  11. #[serde(default)]
  12. pub create_time: i64,
  13. pub ty: TrashTypeRevision,
  14. }
  15. #[derive(Eq, PartialEq, Debug, Clone, Hash, Serialize_repr)]
  16. #[repr(u8)]
  17. pub enum TrashTypeRevision {
  18. Unknown = 0,
  19. TrashView = 1,
  20. TrashApp = 2,
  21. }
  22. impl<'de> serde::Deserialize<'de> for TrashTypeRevision {
  23. fn deserialize<D>(deserializer: D) -> core::result::Result<Self, D::Error>
  24. where
  25. D: serde::Deserializer<'de>,
  26. {
  27. struct TrashTypeVisitor();
  28. impl<'de> Visitor<'de> for TrashTypeVisitor {
  29. type Value = TrashTypeRevision;
  30. fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
  31. formatter.write_str("expected enum TrashTypeRevision with type: u8")
  32. }
  33. fn visit_i8<E>(self, v: i8) -> Result<Self::Value, E>
  34. where
  35. E: serde::de::Error,
  36. {
  37. self.visit_u8(v as u8)
  38. }
  39. fn visit_i16<E>(self, v: i16) -> Result<Self::Value, E>
  40. where
  41. E: serde::de::Error,
  42. {
  43. self.visit_u8(v as u8)
  44. }
  45. fn visit_i32<E>(self, v: i32) -> Result<Self::Value, E>
  46. where
  47. E: serde::de::Error,
  48. {
  49. self.visit_u8(v as u8)
  50. }
  51. fn visit_i64<E>(self, v: i64) -> Result<Self::Value, E>
  52. where
  53. E: serde::de::Error,
  54. {
  55. self.visit_u8(v as u8)
  56. }
  57. fn visit_u8<E>(self, v: u8) -> Result<Self::Value, E>
  58. where
  59. E: serde::de::Error,
  60. {
  61. let ty = match v {
  62. 0 => TrashTypeRevision::Unknown,
  63. 1 => TrashTypeRevision::TrashView,
  64. 2 => TrashTypeRevision::TrashApp,
  65. _ => TrashTypeRevision::Unknown,
  66. };
  67. Ok(ty)
  68. }
  69. fn visit_u16<E>(self, v: u16) -> Result<Self::Value, E>
  70. where
  71. E: serde::de::Error,
  72. {
  73. self.visit_u8(v as u8)
  74. }
  75. fn visit_u32<E>(self, v: u32) -> Result<Self::Value, E>
  76. where
  77. E: serde::de::Error,
  78. {
  79. self.visit_u8(v as u8)
  80. }
  81. fn visit_u64<E>(self, v: u64) -> Result<Self::Value, E>
  82. where
  83. E: serde::de::Error,
  84. {
  85. self.visit_u8(v as u8)
  86. }
  87. fn visit_str<E>(self, s: &str) -> Result<Self::Value, E>
  88. where
  89. E: serde::de::Error,
  90. {
  91. let value = match s {
  92. "Unknown" => TrashTypeRevision::Unknown,
  93. "TrashView" => TrashTypeRevision::TrashView,
  94. "TrashApp" => TrashTypeRevision::TrashApp,
  95. _ => TrashTypeRevision::Unknown,
  96. };
  97. Ok(value)
  98. }
  99. }
  100. deserializer.deserialize_any(TrashTypeVisitor())
  101. }
  102. }
  103. impl std::default::Default for TrashTypeRevision {
  104. fn default() -> Self {
  105. TrashTypeRevision::Unknown
  106. }
  107. }
  108. impl std::convert::From<TrashTypeRevision> for u8 {
  109. fn from(rev: TrashTypeRevision) -> Self {
  110. match rev {
  111. TrashTypeRevision::Unknown => 0,
  112. TrashTypeRevision::TrashView => 1,
  113. TrashTypeRevision::TrashApp => 2,
  114. }
  115. }
  116. }