load.rs 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. use serde::de::Visitor;
  2. use rusqlite::Row;
  3. pub struct RowDeserializer<'de> {
  4. row: &'de Row<'de>,
  5. col_index: usize,
  6. }
  7. impl<'de> RowDeserializer<'de> {
  8. pub fn from_row(row: &'de Row) -> Self {
  9. // we skip the rowid by starting at index 1
  10. Self { row, col_index: 1 }
  11. }
  12. }
  13. impl<'de, 'a> serde::de::Deserializer<'de> for &'a mut RowDeserializer<'de> {
  14. type Error = super::ModelError;
  15. fn deserialize_any<V: Visitor<'de>>(self, _v: V) -> Result<V::Value, Self::Error> {
  16. todo!()
  17. }
  18. fn deserialize_bool<V: Visitor<'de>>(self, v: V) -> Result<V::Value, Self::Error> {
  19. let res = v.visit_bool(self.row.get(self.col_index)?);
  20. self.col_index += 1;
  21. res
  22. }
  23. fn deserialize_i8<V: Visitor<'de>>(self, v: V) -> Result<V::Value, Self::Error> {
  24. let res = v.visit_i8(self.row.get(self.col_index)?);
  25. self.col_index += 1;
  26. res
  27. }
  28. fn deserialize_i16<V: Visitor<'de>>(self, v: V) -> Result<V::Value, Self::Error> {
  29. let res = v.visit_i16(self.row.get(self.col_index)?);
  30. self.col_index += 1;
  31. res
  32. }
  33. fn deserialize_i32<V: Visitor<'de>>(self, v: V) -> Result<V::Value, Self::Error> {
  34. let res = v.visit_i32(self.row.get(self.col_index)?);
  35. self.col_index += 1;
  36. res
  37. }
  38. fn deserialize_i64<V: Visitor<'de>>(self, v: V) -> Result<V::Value, Self::Error> {
  39. let res = v.visit_i64(self.row.get(self.col_index)?);
  40. self.col_index += 1;
  41. res
  42. }
  43. fn deserialize_string<V: Visitor<'de>>(self, v: V) -> Result<V::Value, Self::Error> {
  44. let res = v.visit_string(self.row.get(self.col_index)?);
  45. self.col_index += 1;
  46. res
  47. }
  48. fn deserialize_struct<V: Visitor<'de>>(
  49. self,
  50. _name: &'static str,
  51. _fields: &'static [&'static str],
  52. v: V,
  53. ) -> Result<V::Value, Self::Error> {
  54. v.visit_seq(self)
  55. }
  56. serde::forward_to_deserialize_any! {
  57. i128 u8 u16 u32 u64 u128 f32 f64 char str
  58. bytes byte_buf option unit unit_struct newtype_struct seq tuple
  59. tuple_struct map enum identifier ignored_any
  60. }
  61. }
  62. impl<'de> serde::de::SeqAccess<'de> for RowDeserializer<'de> {
  63. type Error = super::ModelError;
  64. fn next_element_seed<T: serde::de::DeserializeSeed<'de>>(
  65. &mut self,
  66. seed: T,
  67. ) -> Result<Option<T::Value>, Self::Error> {
  68. seed.deserialize(self).map(Some)
  69. }
  70. }