typesense_rs/apis/
mod.rs

1use std::{error, fmt};
2
3#[derive(Debug, Clone)]
4pub struct ResponseContent<T> {
5	pub status: reqwest::StatusCode,
6	pub content: String,
7	pub entity: Option<T>,
8}
9
10#[derive(Debug)]
11pub enum Error<T> {
12	Reqwest(reqwest::Error),
13	Serde(serde_json::Error),
14	Io(std::io::Error),
15	ResponseError(ResponseContent<T>),
16}
17
18impl<T> fmt::Display for Error<T> {
19	fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
20		let (module, e) = match self {
21			Error::Reqwest(e) => ("reqwest", e.to_string()),
22			Error::Serde(e) => ("serde", e.to_string()),
23			Error::Io(e) => ("IO", e.to_string()),
24			Error::ResponseError(e) => ("response", format!("status code {}", e.status)),
25		};
26		write!(f, "error in {}: {}", module, e)
27	}
28}
29
30impl<T: fmt::Debug> error::Error for Error<T> {
31	fn source(&self) -> Option<&(dyn error::Error + 'static)> {
32		Some(match self {
33			Error::Reqwest(e) => e,
34			Error::Serde(e) => e,
35			Error::Io(e) => e,
36			Error::ResponseError(_) => return None,
37		})
38	}
39}
40
41impl<T> From<reqwest::Error> for Error<T> {
42	fn from(e: reqwest::Error) -> Self {
43		Error::Reqwest(e)
44	}
45}
46
47impl<T> From<serde_json::Error> for Error<T> {
48	fn from(e: serde_json::Error) -> Self {
49		Error::Serde(e)
50	}
51}
52
53impl<T> From<std::io::Error> for Error<T> {
54	fn from(e: std::io::Error) -> Self {
55		Error::Io(e)
56	}
57}
58
59pub fn urlencode<T: AsRef<str>>(s: T) -> String {
60	::url::form_urlencoded::byte_serialize(s.as_ref().as_bytes()).collect()
61}
62
63pub fn parse_deep_object(prefix: &str, value: &serde_json::Value) -> Vec<(String, String)> {
64	if let serde_json::Value::Object(object) = value {
65		let mut params = vec![];
66
67		for (key, value) in object {
68			match value {
69				serde_json::Value::Object(_) => {
70					params.append(&mut parse_deep_object(&format!("{}[{}]", prefix, key), value))
71				}
72				serde_json::Value::Array(array) => {
73					for (i, value) in array.iter().enumerate() {
74						params.append(&mut parse_deep_object(&format!("{}[{}][{}]", prefix, key, i), value));
75					}
76				}
77				serde_json::Value::String(s) => params.push((format!("{}[{}]", prefix, key), s.clone())),
78				_ => params.push((format!("{}[{}]", prefix, key), value.to_string())),
79			}
80		}
81
82		return params;
83	}
84
85	unimplemented!("Only objects are supported with style=deepObject")
86}
87
88pub mod analytics_api;
89pub mod collections_api;
90pub mod conversations_api;
91pub mod curation_api;
92pub mod debug_api;
93pub mod documents_api;
94pub mod health_api;
95pub mod keys_api;
96pub mod operations_api;
97pub mod override_api;
98pub mod presets_api;
99pub mod stopwords_api;
100
101pub mod configuration;
102
103use std::sync::Arc;
104
105pub trait Api {
106	fn analytics_api(&self) -> &dyn analytics_api::AnalyticsApi;
107	fn collections_api(&self) -> &dyn collections_api::CollectionsApi;
108	fn conversations_api(&self) -> &dyn conversations_api::ConversationsApi;
109	fn curation_api(&self) -> &dyn curation_api::CurationApi;
110	fn debug_api(&self) -> &dyn debug_api::DebugApi;
111	fn documents_api(&self) -> &dyn documents_api::DocumentsApi;
112	fn health_api(&self) -> &dyn health_api::HealthApi;
113	fn keys_api(&self) -> &dyn keys_api::KeysApi;
114	fn operations_api(&self) -> &dyn operations_api::OperationsApi;
115	fn override_api(&self) -> &dyn override_api::OverrideApi;
116	fn presets_api(&self) -> &dyn presets_api::PresetsApi;
117	fn stopwords_api(&self) -> &dyn stopwords_api::StopwordsApi;
118}
119
120pub struct ApiClient {
121	analytics_api: Box<dyn analytics_api::AnalyticsApi>,
122	collections_api: Box<dyn collections_api::CollectionsApi>,
123	conversations_api: Box<dyn conversations_api::ConversationsApi>,
124	curation_api: Box<dyn curation_api::CurationApi>,
125	debug_api: Box<dyn debug_api::DebugApi>,
126	documents_api: Box<dyn documents_api::DocumentsApi>,
127	health_api: Box<dyn health_api::HealthApi>,
128	keys_api: Box<dyn keys_api::KeysApi>,
129	operations_api: Box<dyn operations_api::OperationsApi>,
130	override_api: Box<dyn override_api::OverrideApi>,
131	presets_api: Box<dyn presets_api::PresetsApi>,
132	stopwords_api: Box<dyn stopwords_api::StopwordsApi>,
133}
134
135impl ApiClient {
136	pub fn new(configuration: Arc<configuration::Configuration>) -> Self {
137		Self {
138			analytics_api: Box::new(analytics_api::AnalyticsApiClient::new(configuration.clone())),
139			collections_api: Box::new(collections_api::CollectionsApiClient::new(configuration.clone())),
140			conversations_api: Box::new(conversations_api::ConversationsApiClient::new(configuration.clone())),
141			curation_api: Box::new(curation_api::CurationApiClient::new(configuration.clone())),
142			debug_api: Box::new(debug_api::DebugApiClient::new(configuration.clone())),
143			documents_api: Box::new(documents_api::DocumentsApiClient::new(configuration.clone())),
144			health_api: Box::new(health_api::HealthApiClient::new(configuration.clone())),
145			keys_api: Box::new(keys_api::KeysApiClient::new(configuration.clone())),
146			operations_api: Box::new(operations_api::OperationsApiClient::new(configuration.clone())),
147			override_api: Box::new(override_api::OverrideApiClient::new(configuration.clone())),
148			presets_api: Box::new(presets_api::PresetsApiClient::new(configuration.clone())),
149			stopwords_api: Box::new(stopwords_api::StopwordsApiClient::new(configuration.clone())),
150		}
151	}
152}
153
154impl Api for ApiClient {
155	fn analytics_api(&self) -> &dyn analytics_api::AnalyticsApi {
156		self.analytics_api.as_ref()
157	}
158
159	fn collections_api(&self) -> &dyn collections_api::CollectionsApi {
160		self.collections_api.as_ref()
161	}
162
163	fn conversations_api(&self) -> &dyn conversations_api::ConversationsApi {
164		self.conversations_api.as_ref()
165	}
166
167	fn curation_api(&self) -> &dyn curation_api::CurationApi {
168		self.curation_api.as_ref()
169	}
170
171	fn debug_api(&self) -> &dyn debug_api::DebugApi {
172		self.debug_api.as_ref()
173	}
174
175	fn documents_api(&self) -> &dyn documents_api::DocumentsApi {
176		self.documents_api.as_ref()
177	}
178
179	fn health_api(&self) -> &dyn health_api::HealthApi {
180		self.health_api.as_ref()
181	}
182
183	fn keys_api(&self) -> &dyn keys_api::KeysApi {
184		self.keys_api.as_ref()
185	}
186
187	fn operations_api(&self) -> &dyn operations_api::OperationsApi {
188		self.operations_api.as_ref()
189	}
190
191	fn override_api(&self) -> &dyn override_api::OverrideApi {
192		self.override_api.as_ref()
193	}
194
195	fn presets_api(&self) -> &dyn presets_api::PresetsApi {
196		self.presets_api.as_ref()
197	}
198
199	fn stopwords_api(&self) -> &dyn stopwords_api::StopwordsApi {
200		self.stopwords_api.as_ref()
201	}
202}