use meilisearch_schema::SchemaAttr; use serde::ser; use serde::Serialize; use super::{ConvertToString, SerializerError}; use crate::raw_indexer::RawIndexer; use crate::DocumentId; pub struct Indexer<'a> { pub attribute: SchemaAttr, pub indexer: &'a mut RawIndexer, pub document_id: DocumentId, } impl<'a> ser::Serializer for Indexer<'a> { type Ok = Option; type Error = SerializerError; type SerializeSeq = SeqIndexer<'a>; type SerializeTuple = TupleIndexer<'a>; type SerializeTupleStruct = ser::Impossible; type SerializeTupleVariant = ser::Impossible; type SerializeMap = MapIndexer<'a>; type SerializeStruct = StructIndexer<'a>; type SerializeStructVariant = ser::Impossible; fn serialize_bool(self, _value: bool) -> Result { Ok(None) } fn serialize_char(self, value: char) -> Result { let text = value.serialize(ConvertToString)?; self.serialize_str(&text) } fn serialize_i8(self, value: i8) -> Result { let text = value.serialize(ConvertToString)?; self.serialize_str(&text) } fn serialize_i16(self, value: i16) -> Result { let text = value.serialize(ConvertToString)?; self.serialize_str(&text) } fn serialize_i32(self, value: i32) -> Result { let text = value.serialize(ConvertToString)?; self.serialize_str(&text) } fn serialize_i64(self, value: i64) -> Result { let text = value.serialize(ConvertToString)?; self.serialize_str(&text) } fn serialize_u8(self, value: u8) -> Result { let text = value.serialize(ConvertToString)?; self.serialize_str(&text) } fn serialize_u16(self, value: u16) -> Result { let text = value.serialize(ConvertToString)?; self.serialize_str(&text) } fn serialize_u32(self, value: u32) -> Result { let text = value.serialize(ConvertToString)?; self.serialize_str(&text) } fn serialize_u64(self, value: u64) -> Result { let text = value.serialize(ConvertToString)?; self.serialize_str(&text) } fn serialize_f32(self, value: f32) -> Result { let text = value.serialize(ConvertToString)?; self.serialize_str(&text) } fn serialize_f64(self, value: f64) -> Result { let text = value.serialize(ConvertToString)?; self.serialize_str(&text) } fn serialize_str(self, text: &str) -> Result { let number_of_words = self .indexer .index_text(self.document_id, self.attribute, text); Ok(Some(number_of_words)) } fn serialize_bytes(self, _v: &[u8]) -> Result { Err(SerializerError::UnindexableType { type_name: "&[u8]" }) } fn serialize_none(self) -> Result { Ok(None) } fn serialize_some(self, value: &T) -> Result where T: ser::Serialize, { let text = value.serialize(ConvertToString)?; let number_of_words = self .indexer .index_text(self.document_id, self.attribute, &text); Ok(Some(number_of_words)) } fn serialize_unit(self) -> Result { Ok(None) } fn serialize_unit_struct(self, _name: &'static str) -> Result { Ok(None) } fn serialize_unit_variant( self, _name: &'static str, _variant_index: u32, _variant: &'static str, ) -> Result { Ok(None) } fn serialize_newtype_struct( self, _name: &'static str, value: &T, ) -> Result where T: ser::Serialize, { value.serialize(self) } fn serialize_newtype_variant( self, _name: &'static str, _variant_index: u32, _variant: &'static str, _value: &T, ) -> Result where T: ser::Serialize, { Err(SerializerError::UnindexableType { type_name: "newtype variant", }) } fn serialize_seq(self, _len: Option) -> Result { let indexer = SeqIndexer { attribute: self.attribute, document_id: self.document_id, indexer: self.indexer, texts: Vec::new(), }; Ok(indexer) } fn serialize_tuple(self, _len: usize) -> Result { let indexer = TupleIndexer { attribute: self.attribute, document_id: self.document_id, indexer: self.indexer, texts: Vec::new(), }; Ok(indexer) } fn serialize_tuple_struct( self, _name: &'static str, _len: usize, ) -> Result { Err(SerializerError::UnindexableType { type_name: "tuple struct", }) } fn serialize_tuple_variant( self, _name: &'static str, _variant_index: u32, _variant: &'static str, _len: usize, ) -> Result { Err(SerializerError::UnindexableType { type_name: "tuple variant", }) } fn serialize_map(self, _len: Option) -> Result { let indexer = MapIndexer { attribute: self.attribute, document_id: self.document_id, indexer: self.indexer, texts: Vec::new(), }; Ok(indexer) } fn serialize_struct( self, _name: &'static str, _len: usize, ) -> Result { let indexer = StructIndexer { attribute: self.attribute, document_id: self.document_id, indexer: self.indexer, texts: Vec::new(), }; Ok(indexer) } fn serialize_struct_variant( self, _name: &'static str, _variant_index: u32, _variant: &'static str, _len: usize, ) -> Result { Err(SerializerError::UnindexableType { type_name: "struct variant", }) } } pub struct SeqIndexer<'a> { attribute: SchemaAttr, document_id: DocumentId, indexer: &'a mut RawIndexer, texts: Vec, } impl<'a> ser::SerializeSeq for SeqIndexer<'a> { type Ok = Option; type Error = SerializerError; fn serialize_element(&mut self, value: &T) -> Result<(), Self::Error> where T: ser::Serialize, { let text = value.serialize(ConvertToString)?; self.texts.push(text); Ok(()) } fn end(self) -> Result { let texts = self.texts.iter().map(String::as_str); self.indexer .index_text_seq(self.document_id, self.attribute, texts); Ok(None) } } pub struct MapIndexer<'a> { attribute: SchemaAttr, document_id: DocumentId, indexer: &'a mut RawIndexer, texts: Vec, } impl<'a> ser::SerializeMap for MapIndexer<'a> { type Ok = Option; type Error = SerializerError; fn serialize_key(&mut self, key: &T) -> Result<(), Self::Error> where T: ser::Serialize, { let text = key.serialize(ConvertToString)?; self.texts.push(text); Ok(()) } fn serialize_value(&mut self, value: &T) -> Result<(), Self::Error> where T: ser::Serialize, { let text = value.serialize(ConvertToString)?; self.texts.push(text); Ok(()) } fn end(self) -> Result { let texts = self.texts.iter().map(String::as_str); self.indexer .index_text_seq(self.document_id, self.attribute, texts); Ok(None) } } pub struct StructIndexer<'a> { attribute: SchemaAttr, document_id: DocumentId, indexer: &'a mut RawIndexer, texts: Vec, } impl<'a> ser::SerializeStruct for StructIndexer<'a> { type Ok = Option; type Error = SerializerError; fn serialize_field( &mut self, key: &'static str, value: &T, ) -> Result<(), Self::Error> where T: ser::Serialize, { let key_text = key.to_owned(); let value_text = value.serialize(ConvertToString)?; self.texts.push(key_text); self.texts.push(value_text); Ok(()) } fn end(self) -> Result { let texts = self.texts.iter().map(String::as_str); self.indexer .index_text_seq(self.document_id, self.attribute, texts); Ok(None) } } pub struct TupleIndexer<'a> { attribute: SchemaAttr, document_id: DocumentId, indexer: &'a mut RawIndexer, texts: Vec, } impl<'a> ser::SerializeTuple for TupleIndexer<'a> { type Ok = Option; type Error = SerializerError; fn serialize_element(&mut self, value: &T) -> Result<(), Self::Error> where T: Serialize, { let text = value.serialize(ConvertToString)?; self.texts.push(text); Ok(()) } fn end(self) -> Result { let texts = self.texts.iter().map(String::as_str); self.indexer .index_text_seq(self.document_id, self.attribute, texts); Ok(None) } }