meilisearch_sdk/
features.rs

1use crate::{
2    client::Client,
3    errors::Error,
4    request::{HttpClient, Method},
5};
6use serde::{Deserialize, Serialize};
7
8/// Struct representing the experimental features result from the API.
9#[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/// Struct representing the experimental features request.
22///
23/// You can build this struct using the builder pattern.
24///
25/// # Example
26///
27/// ```
28/// # use meilisearch_sdk::{client::Client, features::ExperimentalFeatures};
29/// # let MEILISEARCH_URL = option_env!("MEILISEARCH_URL").unwrap_or("http://localhost:7700");
30/// # let MEILISEARCH_API_KEY = option_env!("MEILISEARCH_API_KEY").unwrap_or("masterKey");
31/// # let client = Client::new(MEILISEARCH_URL, Some(MEILISEARCH_API_KEY)).unwrap();
32/// let mut features = ExperimentalFeatures::new(&client);
33/// ```
34#[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    /// Get all the experimental features
69    ///
70    /// # Example
71    ///
72    /// ```
73    /// # use meilisearch_sdk::{client::Client, features::ExperimentalFeatures};
74    /// # let MEILISEARCH_URL = option_env!("MEILISEARCH_URL").unwrap_or("http://localhost:7700");
75    /// # let MEILISEARCH_API_KEY = option_env!("MEILISEARCH_API_KEY").unwrap_or("masterKey");
76    /// # let client = Client::new(MEILISEARCH_URL, Some(MEILISEARCH_API_KEY)).unwrap();
77    /// # tokio::runtime::Builder::new_current_thread().enable_all().build().unwrap().block_on(async {
78    /// let features = ExperimentalFeatures::new(&client);
79    /// features.get().await.unwrap();
80    /// # });
81    /// ```
82    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    /// Update the experimental features
94    ///
95    /// # Example
96    ///
97    /// ```
98    /// # use meilisearch_sdk::{client::Client, features::ExperimentalFeatures};
99    /// # let MEILISEARCH_URL = option_env!("MEILISEARCH_URL").unwrap_or("http://localhost:7700");
100    /// # let MEILISEARCH_API_KEY = option_env!("MEILISEARCH_API_KEY").unwrap_or("masterKey");
101    /// # let client = Client::new(MEILISEARCH_URL, Some(MEILISEARCH_API_KEY)).unwrap();
102    /// # tokio::runtime::Builder::new_current_thread().enable_all().build().unwrap().block_on(async {
103    /// let features = ExperimentalFeatures::new(&client);
104    /// features.update().await.unwrap();
105    /// # });
106    /// ```
107    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}