trash_rev.rs 3.6 KB

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