mirror of
https://github.com/meilisearch/meilisearch.git
synced 2024-11-27 04:25:06 +08:00
Merge pull request #231 from meilisearch/recursive-object-indexing
Make possible to convert recursive object into strings
This commit is contained in:
commit
0fbd4cd632
@ -12,8 +12,8 @@ impl ser::Serializer for ConvertToString {
|
|||||||
type SerializeTuple = ser::Impossible<Self::Ok, Self::Error>;
|
type SerializeTuple = ser::Impossible<Self::Ok, Self::Error>;
|
||||||
type SerializeTupleStruct = ser::Impossible<Self::Ok, Self::Error>;
|
type SerializeTupleStruct = ser::Impossible<Self::Ok, Self::Error>;
|
||||||
type SerializeTupleVariant = ser::Impossible<Self::Ok, Self::Error>;
|
type SerializeTupleVariant = ser::Impossible<Self::Ok, Self::Error>;
|
||||||
type SerializeMap = ser::Impossible<Self::Ok, Self::Error>;
|
type SerializeMap = MapConvertToString;
|
||||||
type SerializeStruct = ser::Impossible<Self::Ok, Self::Error>;
|
type SerializeStruct = StructConvertToString;
|
||||||
type SerializeStructVariant = ser::Impossible<Self::Ok, Self::Error>;
|
type SerializeStructVariant = ser::Impossible<Self::Ok, Self::Error>;
|
||||||
|
|
||||||
fn serialize_bool(self, _value: bool) -> Result<Self::Ok, Self::Error> {
|
fn serialize_bool(self, _value: bool) -> Result<Self::Ok, Self::Error> {
|
||||||
@ -169,7 +169,9 @@ impl ser::Serializer for ConvertToString {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
|
fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
|
||||||
Err(SerializerError::UnserializableType { type_name: "map" })
|
Ok(MapConvertToString {
|
||||||
|
text: String::new(),
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
fn serialize_struct(
|
fn serialize_struct(
|
||||||
@ -177,8 +179,8 @@ impl ser::Serializer for ConvertToString {
|
|||||||
_name: &'static str,
|
_name: &'static str,
|
||||||
_len: usize,
|
_len: usize,
|
||||||
) -> Result<Self::SerializeStruct, Self::Error> {
|
) -> Result<Self::SerializeStruct, Self::Error> {
|
||||||
Err(SerializerError::UnserializableType {
|
Ok(StructConvertToString {
|
||||||
type_name: "struct",
|
text: String::new(),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -194,3 +196,63 @@ impl ser::Serializer for ConvertToString {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub struct MapConvertToString {
|
||||||
|
text: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ser::SerializeMap for MapConvertToString {
|
||||||
|
type Ok = String;
|
||||||
|
type Error = SerializerError;
|
||||||
|
|
||||||
|
fn serialize_key<T: ?Sized>(&mut self, key: &T) -> Result<(), Self::Error>
|
||||||
|
where
|
||||||
|
T: ser::Serialize,
|
||||||
|
{
|
||||||
|
let text = key.serialize(ConvertToString)?;
|
||||||
|
self.text.push_str(&text);
|
||||||
|
self.text.push_str(" ");
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serialize_value<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
|
||||||
|
where
|
||||||
|
T: ser::Serialize,
|
||||||
|
{
|
||||||
|
let text = value.serialize(ConvertToString)?;
|
||||||
|
self.text.push_str(&text);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn end(self) -> Result<Self::Ok, Self::Error> {
|
||||||
|
Ok(self.text)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct StructConvertToString {
|
||||||
|
text: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ser::SerializeStruct for StructConvertToString {
|
||||||
|
type Ok = String;
|
||||||
|
type Error = SerializerError;
|
||||||
|
|
||||||
|
fn serialize_field<T: ?Sized>(
|
||||||
|
&mut self,
|
||||||
|
key: &'static str,
|
||||||
|
value: &T,
|
||||||
|
) -> Result<(), Self::Error>
|
||||||
|
where
|
||||||
|
T: ser::Serialize,
|
||||||
|
{
|
||||||
|
let value = value.serialize(ConvertToString)?;
|
||||||
|
self.text.push_str(key);
|
||||||
|
self.text.push_str(" ");
|
||||||
|
self.text.push_str(&value);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn end(self) -> Result<Self::Ok, Self::Error> {
|
||||||
|
Ok(self.text)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -20,7 +20,7 @@ impl<'a> ser::Serializer for Indexer<'a> {
|
|||||||
type SerializeTupleStruct = ser::Impossible<Self::Ok, Self::Error>;
|
type SerializeTupleStruct = ser::Impossible<Self::Ok, Self::Error>;
|
||||||
type SerializeTupleVariant = ser::Impossible<Self::Ok, Self::Error>;
|
type SerializeTupleVariant = ser::Impossible<Self::Ok, Self::Error>;
|
||||||
type SerializeMap = MapIndexer<'a>;
|
type SerializeMap = MapIndexer<'a>;
|
||||||
type SerializeStruct = StructSerializer<'a>;
|
type SerializeStruct = StructIndexer<'a>;
|
||||||
type SerializeStructVariant = ser::Impossible<Self::Ok, Self::Error>;
|
type SerializeStructVariant = ser::Impossible<Self::Ok, Self::Error>;
|
||||||
|
|
||||||
fn serialize_bool(self, _value: bool) -> Result<Self::Ok, Self::Error> {
|
fn serialize_bool(self, _value: bool) -> Result<Self::Ok, Self::Error> {
|
||||||
@ -302,14 +302,14 @@ impl<'a> ser::SerializeMap for MapIndexer<'a> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct StructSerializer<'a> {
|
pub struct StructIndexer<'a> {
|
||||||
attribute: SchemaAttr,
|
attribute: SchemaAttr,
|
||||||
document_id: DocumentId,
|
document_id: DocumentId,
|
||||||
indexer: &'a mut RawIndexer,
|
indexer: &'a mut RawIndexer,
|
||||||
texts: Vec<String>,
|
texts: Vec<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> ser::SerializeStruct for StructSerializer<'a> {
|
impl<'a> ser::SerializeStruct for StructIndexer<'a> {
|
||||||
type Ok = Option<usize>;
|
type Ok = Option<usize>;
|
||||||
type Error = SerializerError;
|
type Error = SerializerError;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user