Преглед изворни кода

Fix failure on Vec<T> in entity.

Kestrel пре 2 година
родитељ
комит
ad4c544ad9
2 измењених фајлова са 43 додато и 2 уклоњено
  1. 42 2
      microrm/src/model/create.rs
  2. 1 0
      microrm/src/model/modelable.rs

+ 42 - 2
microrm/src/model/create.rs

@@ -3,6 +3,19 @@ use serde::de::Visitor;
 use std::cell::Cell;
 use std::rc::Rc;
 
+struct EmptySequence {}
+
+impl<'de> serde::de::SeqAccess<'de> for EmptySequence {
+    type Error = super::ModelError;
+
+    fn next_element_seed<T: serde::de::DeserializeSeed<'de>>(
+        &mut self,
+        _seed: T,
+    ) -> Result<Option<T::Value>, Self::Error> {
+        Ok(None)
+    }
+}
+
 #[derive(Debug)]
 pub struct CreateDeserializer<'de> {
     struct_visited: bool,
@@ -22,7 +35,7 @@ impl<'de, 'a> serde::de::Deserializer<'de> for &'a mut CreateDeserializer<'de> {
 
     // we (ab)use the forward_to_deserialize_any! macro to stub out the types we don't care about
     serde::forward_to_deserialize_any! {
-        bool i128 u64 u128 f32 f64 char str
+        bool i128 u128 f32 f64 char str
         option unit unit_struct tuple
         tuple_struct map enum identifier ignored_any
     }
@@ -46,6 +59,11 @@ impl<'de, 'a> serde::de::Deserializer<'de> for &'a mut CreateDeserializer<'de> {
         v.visit_u32(0)
     }
 
+    fn deserialize_u64<V: Visitor<'de>>(self, v: V) -> Result<V::Value, Self::Error> {
+        self.integral_type();
+        v.visit_u64(0)
+    }
+
     fn deserialize_i8<V: Visitor<'de>>(self, v: V) -> Result<V::Value, Self::Error> {
         self.integral_type();
         v.visit_i8(0)
@@ -82,7 +100,10 @@ impl<'de, 'a> serde::de::Deserializer<'de> for &'a mut CreateDeserializer<'de> {
     }
 
     fn deserialize_seq<V: Visitor<'de>>(self, v: V) -> Result<V::Value, Self::Error> {
-        v.visit_seq(self)
+        // we store sequences as JSON-encoded strings, so...
+        self.column_types.push("text");
+        let es = EmptySequence {};
+        v.visit_seq(es)
     }
 
     fn deserialize_struct<V: Visitor<'de>>(
@@ -94,6 +115,7 @@ impl<'de, 'a> serde::de::Deserializer<'de> for &'a mut CreateDeserializer<'de> {
         if self.struct_visited {
             panic!("Nested structs not allowed!");
         } else {
+            self.struct_visited = true;
             self.expected_length.set(fields.len());
             v.visit_seq(self)
         }
@@ -331,4 +353,22 @@ mod test {
             )
         )
     }
+
+    #[derive(serde::Serialize, serde::Deserialize, crate::Entity)]
+    #[microrm_internal]
+    pub struct VecTest {
+        e: u64,
+        test: Vec<usize>
+    }
+
+    #[test]
+    fn test_vec() {
+        assert_eq!(
+            super::sql_for_table::<VecTest>(),
+            (
+                r#"DROP TABLE IF EXISTS "vec_test""#.to_owned(),
+                r#"CREATE TABLE IF NOT EXISTS "vec_test" (id integer primary key,"e" integer,"test" text)"#.to_owned()
+            )
+        );
+    }
 }

+ 1 - 0
microrm/src/model/modelable.rs

@@ -28,6 +28,7 @@ integral!(i32);
 integral!(u32);
 integral!(i64);
 integral!(u64);
+integral!(usize);
 
 impl Modelable for f64 {
     fn bind_to(&self, stmt: &mut sqlite::Statement, col: usize) -> sqlite::Result<()> {