|
1 | 1 | use crate::{errors::Error, indexes::Index};
|
2 | 2 | use serde::{de::DeserializeOwned, Deserialize, Serialize, Serializer};
|
3 |
| -use serde::ser::{SerializeSeq}; |
4 | 3 | use serde_json::{Map, Value};
|
5 | 4 | use std::collections::HashMap;
|
| 5 | +use either::Either; |
6 | 6 |
|
7 | 7 | #[derive(Deserialize, Debug, Eq, PartialEq)]
|
8 | 8 | pub struct MatchRange {
|
9 | 9 | pub start: usize,
|
10 | 10 | pub length: usize,
|
11 | 11 | }
|
12 | 12 |
|
13 |
| -#[derive(Debug, Eq, PartialEq , Clone)] |
14 |
| -pub enum Filter<'a> { |
15 |
| - String(&'a str), |
16 |
| - Array(Vec<&'a str>) |
| 13 | +#[derive(Serialize , Debug, Eq, PartialEq , Clone)] |
| 14 | +#[serde(transparent)] |
| 15 | +pub struct Filter<'a>{ |
| 16 | + #[serde(with = "either::serde_untagged")] |
| 17 | + inner: Either<&'a str , Vec<&'a str>> |
17 | 18 | }
|
18 | 19 |
|
19 |
| -impl<'a> Serialize for Filter<'a> { |
20 |
| - fn serialize<S>(&self , serializer: S) -> Result<S::Ok , S::Error> |
21 |
| - where |
22 |
| - S: Serializer |
23 |
| - { |
24 |
| - match self { |
25 |
| - Filter::String(s) => serializer.serialize_str(s), |
26 |
| - Filter::Array(s) => { |
27 |
| - let mut seq = serializer.serialize_seq(Some(s.len()))?; |
28 |
| - |
29 |
| - for item in s { |
30 |
| - seq.serialize_element(item)?; |
31 |
| - } |
32 |
| - |
33 |
| - seq.end() |
34 |
| - }, |
35 |
| - } |
| 20 | +impl<'a> Filter<'a> { |
| 21 | + pub fn new(inner: Either<&'a str , Vec<&'a str>>) -> Filter { |
| 22 | + Filter { |
| 23 | + inner |
| 24 | + } |
36 | 25 | }
|
37 | 26 | }
|
38 | 27 |
|
@@ -311,11 +300,11 @@ impl<'a> SearchQuery<'a> {
|
311 | 300 | self
|
312 | 301 | }
|
313 | 302 | pub fn with_filter<'b>(&'b mut self, filter: &'a str) -> &'b mut SearchQuery<'a> {
|
314 |
| - self.filter = Some(Filter::String(filter)); |
| 303 | + self.filter = Some(Filter::new(Either::Left(filter))); |
315 | 304 | self
|
316 | 305 | }
|
317 | 306 | pub fn with_array_filter<'b>(&'b mut self , filter: Vec<&'a str>) -> &'b mut SearchQuery<'a> {
|
318 |
| - self.filter = Some(Filter::Array(filter)); |
| 307 | + self.filter = Some(Filter::new(Either::Right(filter))); |
319 | 308 | self
|
320 | 309 | }
|
321 | 310 | pub fn with_facets<'b>(
|
|
0 commit comments