|
@@ -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()
|
|
|
+ )
|
|
|
+ );
|
|
|
+ }
|
|
|
}
|