elasticsearch_dsl/search/queries/params/
stored_fields.rs1use serde::Serialize;
2
3use crate::{types::Set, util::ShouldSkip};
4
5#[derive(Debug, Clone, PartialEq, Eq)]
9pub enum StoredFields {
10 None,
12
13 Fields(Set<String>),
15}
16
17impl Default for StoredFields {
18 fn default() -> Self {
19 Self::Fields(Set::default())
20 }
21}
22
23impl ShouldSkip for StoredFields {
24 fn should_skip(&self) -> bool {
25 match self {
26 Self::None => false,
27 Self::Fields(fields) => fields.should_skip(),
28 }
29 }
30}
31
32impl Serialize for StoredFields {
33 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
34 where
35 S: serde::Serializer,
36 {
37 match self {
38 Self::None => serializer.serialize_str("_none_"),
39 Self::Fields(fields) => fields.serialize(serializer),
40 }
41 }
42}
43
44impl<T> From<T> for StoredFields
45where
46 T: IntoIterator,
47 T::Item: ToString,
48{
49 fn from(value: T) -> Self {
50 let fields = value.into_iter().map(|v| v.to_string()).collect::<Set<_>>();
51
52 if fields.len() == 1 && fields.contains("_none_") {
53 Self::None
54 } else {
55 Self::Fields(fields)
56 }
57 }
58}
59
60#[cfg(test)]
61mod tests {
62 use super::*;
63 use crate::util::assert_serialize;
64
65 #[test]
66 fn serialization() {
67 assert_serialize(StoredFields::None, json!("_none_"));
68 assert_serialize(StoredFields::from(["_none_"]), json!("_none_"));
69 assert_serialize(StoredFields::from(["abc", "def"]), json!(["abc", "def"]));
70 }
71
72 #[test]
73 fn should_skip() {
74 assert!(!StoredFields::None.should_skip());
75 assert!(!StoredFields::from(["abc", "def"]).should_skip());
76 assert!(StoredFields::from(Vec::<String>::new()).should_skip());
77 }
78}