meilisearch_sdk/
features.rs1use crate::{
2 client::Client,
3 errors::Error,
4 request::{HttpClient, Method},
5};
6use serde::{Deserialize, Serialize};
7
8#[derive(Clone, Debug, Deserialize)]
10#[serde(rename_all = "camelCase")]
11pub struct ExperimentalFeaturesResult {
12 pub metrics: bool,
13 pub logs_route: bool,
14 pub contains_filter: bool,
15 pub network: bool,
16 pub edit_documents_by_function: bool,
17 #[serde(default)]
18 pub multimodal: bool,
19}
20
21#[derive(Debug, Serialize)]
35#[serde(rename_all = "camelCase")]
36pub struct ExperimentalFeatures<'a, Http: HttpClient> {
37 #[serde(skip_serializing)]
38 client: &'a Client<Http>,
39
40 #[serde(skip_serializing_if = "Option::is_none")]
41 pub metrics: Option<bool>,
42 #[serde(skip_serializing_if = "Option::is_none")]
43 pub contains_filter: Option<bool>,
44 #[serde(skip_serializing_if = "Option::is_none")]
45 pub logs_route: Option<bool>,
46 #[serde(skip_serializing_if = "Option::is_none")]
47 pub network: Option<bool>,
48 #[serde(skip_serializing_if = "Option::is_none")]
49 pub edit_documents_by_function: Option<bool>,
50 #[serde(skip_serializing_if = "Option::is_none")]
51 pub multimodal: Option<bool>,
52}
53
54impl<'a, Http: HttpClient> ExperimentalFeatures<'a, Http> {
55 #[must_use]
56 pub fn new(client: &'a Client<Http>) -> Self {
57 ExperimentalFeatures {
58 client,
59 metrics: None,
60 logs_route: None,
61 network: None,
62 contains_filter: None,
63 edit_documents_by_function: None,
64 multimodal: None,
65 }
66 }
67
68 pub async fn get(&self) -> Result<ExperimentalFeaturesResult, Error> {
83 self.client
84 .http_client
85 .request::<(), (), ExperimentalFeaturesResult>(
86 &format!("{}/experimental-features", self.client.host),
87 Method::Get { query: () },
88 200,
89 )
90 .await
91 }
92
93 pub async fn update(&self) -> Result<ExperimentalFeaturesResult, Error> {
108 self.client
109 .http_client
110 .request::<(), &Self, ExperimentalFeaturesResult>(
111 &format!("{}/experimental-features", self.client.host),
112 Method::Patch {
113 query: (),
114 body: self,
115 },
116 200,
117 )
118 .await
119 }
120
121 pub fn set_metrics(&mut self, metrics: bool) -> &mut Self {
122 self.metrics = Some(metrics);
123 self
124 }
125
126 pub fn set_logs_route(&mut self, logs_route: bool) -> &mut Self {
127 self.logs_route = Some(logs_route);
128 self
129 }
130
131 pub fn set_contains_filter(&mut self, contains_filter: bool) -> &mut Self {
132 self.contains_filter = Some(contains_filter);
133 self
134 }
135
136 pub fn set_edit_documents_by_function(
137 &mut self,
138 edit_documents_by_function: bool,
139 ) -> &mut Self {
140 self.edit_documents_by_function = Some(edit_documents_by_function);
141 self
142 }
143
144 pub fn set_network(&mut self, network: bool) -> &mut Self {
145 self.network = Some(network);
146 self
147 }
148
149 pub fn set_multimodal(&mut self, multimodal: bool) -> &mut Self {
150 self.multimodal = Some(multimodal);
151 self
152 }
153}
154
155#[cfg(test)]
156mod tests {
157 use super::*;
158 use meilisearch_test_macro::meilisearch_test;
159
160 #[meilisearch_test]
161 async fn test_experimental_features(client: Client) {
162 let mut features = ExperimentalFeatures::new(&client);
163 features.set_metrics(true);
164 features.set_logs_route(true);
165 features.set_contains_filter(true);
166 features.set_network(true);
167 features.set_edit_documents_by_function(true);
168 features.set_multimodal(true);
169 let _ = features.update().await.unwrap();
170
171 let res = features.get().await.unwrap();
172 assert!(res.metrics);
173 assert!(res.logs_route);
174 assert!(res.contains_filter);
175 assert!(res.network);
176 assert!(res.edit_documents_by_function);
177 assert!(res.multimodal);
178 }
179}