12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- use serde::de::Visitor;
- use rusqlite::Row;
- pub struct RowDeserializer<'de> {
- row: &'de Row<'de>,
- col_index: usize,
- }
- impl<'de> RowDeserializer<'de> {
- pub fn from_row(row: &'de Row) -> Self {
- // we skip the rowid by starting at index 1
- Self { row, col_index: 1 }
- }
- }
- impl<'de, 'a> serde::de::Deserializer<'de> for &'a mut RowDeserializer<'de> {
- type Error = super::ModelError;
- fn deserialize_any<V: Visitor<'de>>(self, _v: V) -> Result<V::Value, Self::Error> {
- todo!()
- }
- fn deserialize_bool<V: Visitor<'de>>(self, v: V) -> Result<V::Value, Self::Error> {
- let res = v.visit_bool(self.row.get(self.col_index)?);
- self.col_index += 1;
- res
- }
- fn deserialize_i8<V: Visitor<'de>>(self, v: V) -> Result<V::Value, Self::Error> {
- let res = v.visit_i8(self.row.get(self.col_index)?);
- self.col_index += 1;
- res
- }
- fn deserialize_i16<V: Visitor<'de>>(self, v: V) -> Result<V::Value, Self::Error> {
- let res = v.visit_i16(self.row.get(self.col_index)?);
- self.col_index += 1;
- res
- }
- fn deserialize_i32<V: Visitor<'de>>(self, v: V) -> Result<V::Value, Self::Error> {
- let res = v.visit_i32(self.row.get(self.col_index)?);
- self.col_index += 1;
- res
- }
- fn deserialize_i64<V: Visitor<'de>>(self, v: V) -> Result<V::Value, Self::Error> {
- let res = v.visit_i64(self.row.get(self.col_index)?);
- self.col_index += 1;
- res
- }
- fn deserialize_string<V: Visitor<'de>>(self, v: V) -> Result<V::Value, Self::Error> {
- let res = v.visit_string(self.row.get(self.col_index)?);
- self.col_index += 1;
- res
- }
- fn deserialize_struct<V: Visitor<'de>>(
- self,
- _name: &'static str,
- _fields: &'static [&'static str],
- v: V,
- ) -> Result<V::Value, Self::Error> {
- v.visit_seq(self)
- }
- serde::forward_to_deserialize_any! {
- i128 u8 u16 u32 u64 u128 f32 f64 char str
- bytes byte_buf option unit unit_struct newtype_struct seq tuple
- tuple_struct map enum identifier ignored_any
- }
- }
- impl<'de> serde::de::SeqAccess<'de> for RowDeserializer<'de> {
- type Error = super::ModelError;
- fn next_element_seed<T: serde::de::DeserializeSeed<'de>>(
- &mut self,
- seed: T,
- ) -> Result<Option<T::Value>, Self::Error> {
- seed.deserialize(self).map(Some)
- }
- }
|