Skip to content

Commit

Permalink
Add serialize seq
Browse files Browse the repository at this point in the history
  • Loading branch information
bouzuya committed Sep 19, 2023
1 parent 536c8b2 commit 4ed7020
Showing 1 changed file with 68 additions and 19 deletions.
87 changes: 68 additions & 19 deletions crates/serde-firestore-value/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
mod tests {
use std::fmt::Display;

use google::firestore::v1::{value::ValueType, Value};
use google::firestore::v1::{value::ValueType, ArrayValue, Value};
use serde::{
ser::{
SerializeMap, SerializeSeq, SerializeStruct, SerializeStructVariant, SerializeTuple,
Expand All @@ -26,11 +26,11 @@ mod tests {
}

impl<'a> Serializer for &'a mut FirestoreValueSerializer {
type Ok = ();
type Ok = &'a mut FirestoreValueSerializer;

type Error = Error;

type SerializeSeq = Self;
type SerializeSeq = FirestoreArrayValueSerializer<'a>;

type SerializeTuple = Self;

Expand All @@ -46,7 +46,7 @@ mod tests {

fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error> {
self.output.value_type = Some(ValueType::BooleanValue(v));
Ok(())
Ok(self)
}

fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error> {
Expand All @@ -63,7 +63,7 @@ mod tests {

fn serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error> {
self.output.value_type = Some(ValueType::IntegerValue(v));
Ok(())
Ok(self)
}

fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error> {
Expand All @@ -88,7 +88,7 @@ mod tests {

fn serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error> {
self.output.value_type = Some(ValueType::DoubleValue(v));
Ok(())
Ok(self)
}

fn serialize_char(self, v: char) -> Result<Self::Ok, Self::Error> {
Expand All @@ -98,7 +98,7 @@ mod tests {
fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error> {
// TODO: length check
self.output.value_type = Some(ValueType::StringValue(v.to_string()));
Ok(())
Ok(self)
}

fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok, Self::Error> {
Expand All @@ -107,7 +107,7 @@ mod tests {

fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
self.output.value_type = Some(ValueType::NullValue(0));
Ok(())
Ok(self)
}

fn serialize_some<T: ?Sized>(self, value: &T) -> Result<Self::Ok, Self::Error>
Expand Down Expand Up @@ -159,7 +159,12 @@ mod tests {
}

fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
todo!()
Ok(FirestoreArrayValueSerializer {
parent: self,
output: ArrayValue {
values: Vec::with_capacity(len.unwrap_or(0)),
},
})
}

fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, Self::Error> {
Expand Down Expand Up @@ -207,25 +212,32 @@ mod tests {
}
}

impl<'a> SerializeSeq for &'a mut FirestoreValueSerializer {
type Ok = ();
struct FirestoreArrayValueSerializer<'a> {
output: ArrayValue,
parent: &'a mut FirestoreValueSerializer,
}

impl<'a> SerializeSeq for FirestoreArrayValueSerializer<'a> {
type Ok = &'a mut FirestoreValueSerializer;

type Error = Error;

fn serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
where
T: Serialize,
{
todo!()
self.output.values.push(to_value(&value)?);
Ok(())
}

fn end(self) -> Result<Self::Ok, Self::Error> {
todo!()
self.parent.output.value_type = Some(ValueType::ArrayValue(self.output));
Ok(self.parent)
}
}

impl<'a> SerializeTuple for &'a mut FirestoreValueSerializer {
type Ok = ();
type Ok = &'a mut FirestoreValueSerializer;

type Error = Error;

Expand All @@ -242,7 +254,7 @@ mod tests {
}

impl<'a> SerializeTupleStruct for &'a mut FirestoreValueSerializer {
type Ok = ();
type Ok = &'a mut FirestoreValueSerializer;

type Error = Error;

Expand All @@ -259,7 +271,7 @@ mod tests {
}

impl<'a> SerializeTupleVariant for &'a mut FirestoreValueSerializer {
type Ok = ();
type Ok = &'a mut FirestoreValueSerializer;

type Error = Error;

Expand All @@ -276,7 +288,7 @@ mod tests {
}

impl<'a> SerializeMap for &'a mut FirestoreValueSerializer {
type Ok = ();
type Ok = &'a mut FirestoreValueSerializer;

type Error = Error;

Expand All @@ -300,7 +312,7 @@ mod tests {
}

impl<'a> SerializeStruct for &'a mut FirestoreValueSerializer {
type Ok = ();
type Ok = &'a mut FirestoreValueSerializer;

type Error = Error;

Expand All @@ -321,7 +333,7 @@ mod tests {
}

impl<'a> SerializeStructVariant for &'a mut FirestoreValueSerializer {
type Ok = ();
type Ok = &'a mut FirestoreValueSerializer;

type Error = Error;

Expand Down Expand Up @@ -511,4 +523,41 @@ mod tests {
);
Ok(())
}

#[test]
fn test_seq() -> anyhow::Result<()> {
assert_eq!(
to_value(&vec![1, 2, 3])?,
Value {
value_type: Some(ValueType::ArrayValue(ArrayValue {
values: vec![
Value {
value_type: Some(ValueType::IntegerValue(1))
},
Value {
value_type: Some(ValueType::IntegerValue(2))
},
Value {
value_type: Some(ValueType::IntegerValue(3))
}
]
}))
}
);
assert_eq!(
to_value(&vec![vec![1]])?,
Value {
value_type: Some(ValueType::ArrayValue(ArrayValue {
values: vec![Value {
value_type: Some(ValueType::ArrayValue(ArrayValue {
values: vec![Value {
value_type: Some(ValueType::IntegerValue(1))
}]
}))
}]
}))
}
);
Ok(())
}
}

0 comments on commit 4ed7020

Please sign in to comment.