diff --git a/Cargo.toml b/Cargo.toml index aacf1e1b..078f256d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,6 +19,7 @@ serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" time = { version = "0.3.7", features = ["serde-well-known", "formatting", "parsing"] } jsonwebtoken = { version = "8", default-features = false } +yaup = "0.2.0" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] futures = "0.3" diff --git a/src/client.rs b/src/client.rs index 8e08a344..18f581b0 100644 --- a/src/client.rs +++ b/src/client.rs @@ -87,7 +87,7 @@ impl Client { let json_indexes = request::<(), Vec>( &format!("{}/indexes", self.host), &self.api_key, - Method::Get, + Method::Get(()), 200, ) .await?; @@ -148,7 +148,7 @@ impl Client { request::<(), Value>( &format!("{}/indexes/{}", self.host, uid.as_ref()), &self.api_key, - Method::Get, + Method::Get(()), 200, ) .await @@ -248,10 +248,10 @@ impl Client { /// # }); /// ``` pub async fn get_stats(&self) -> Result { - request::( + request::<(), ClientStats>( &format!("{}/stats", self.host), &self.api_key, - Method::Get, + Method::Get(()), 200, ) .await @@ -274,10 +274,10 @@ impl Client { /// # }); /// ``` pub async fn health(&self) -> Result { - request::( + request::<(), Health>( &format!("{}/health", self.host), &self.api_key, - Method::Get, + Method::Get(()), 200, ) .await @@ -337,7 +337,7 @@ impl Client { let keys = request::<(), Keys>( &format!("{}/keys", self.host), &self.api_key, - Method::Get, + Method::Get(()), 200, ) .await?; @@ -371,7 +371,7 @@ impl Client { request::<(), Key>( &format!("{}/keys/{}", self.host, key.as_ref()), &self.api_key, - Method::Get, + Method::Get(()), 200, ) .await @@ -498,7 +498,7 @@ impl Client { request::<(), Version>( &format!("{}/version", self.host), &self.api_key, - Method::Get, + Method::Get(()), 200, ) .await @@ -600,7 +600,7 @@ impl Client { request::<(), Task>( &format!("{}/tasks/{}", self.host, task_id.as_ref()), &self.api_key, - Method::Get, + Method::Get(()), 200, ) .await @@ -630,7 +630,7 @@ impl Client { let tasks = request::<(), Tasks>( &format!("{}/tasks", self.host), &self.api_key, - Method::Get, + Method::Get(()), 200, ) .await?; @@ -733,31 +733,31 @@ mod tests { mock("GET", path) .match_header("User-Agent", user_agent) .create(), - request::(address, "", Method::Get, 200), + request::<(), ()>(address, "", Method::Get(()), 200), ), ( mock("POST", path) .match_header("User-Agent", user_agent) .create(), - request::(address, "", Method::Post("".to_string()), 200), + request::<(), ()>(address, "", Method::Post(()), 200), ), ( mock("DELETE", path) .match_header("User-Agent", user_agent) .create(), - request::(address, "", Method::Delete, 200), + request::<(), ()>(address, "", Method::Delete, 200), ), ( mock("PUT", path) .match_header("User-Agent", user_agent) .create(), - request::(address, "", Method::Put("".to_string()), 200), + request::<(), ()>(address, "", Method::Put(()), 200), ), ( mock("PATCH", path) .match_header("User-Agent", user_agent) .create(), - request::(address, "", Method::Patch("".to_string()), 200), + request::<(), ()>(address, "", Method::Patch(()), 200), ), ]; diff --git a/src/dumps.rs b/src/dumps.rs index b4429545..74206a9f 100644 --- a/src/dumps.rs +++ b/src/dumps.rs @@ -126,7 +126,7 @@ impl Client { request::<(), DumpInfo>( &format!("{}/dumps/{}/status", self.host, dump_uid.as_ref()), &self.api_key, - Method::Get, + Method::Get(()), 200, ) .await diff --git a/src/errors.rs b/src/errors.rs index ba400d82..68f78650 100644 --- a/src/errors.rs +++ b/src/errors.rs @@ -24,7 +24,7 @@ pub enum Error { TenantTokensInvalidApiKey, /// It is not possible to generate an already expired tenant token. TenantTokensExpiredSignature, - + /// When jsonwebtoken cannot generate the token successfully. InvalidTenantToken(jsonwebtoken::errors::Error), @@ -34,6 +34,8 @@ pub enum Error { /// The http client encountered an error. #[cfg(target_arch = "wasm32")] HttpError(String), + // The library formating the query parameters encountered an error. + Yaup(yaup::Error), } #[derive(Debug, Clone, Deserialize)] @@ -67,6 +69,12 @@ impl From for Error { } } +impl From for Error { + fn from(error: yaup::Error) -> Error { + Error::Yaup(error) + } +} + /// The type of error that was encountered. #[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "snake_case")] @@ -185,7 +193,8 @@ impl std::fmt::Display for Error { Error::Timeout => write!(fmt, "A task did not succeed in time."), Error::TenantTokensInvalidApiKey => write!(fmt, "The provided api_key is invalid."), Error::TenantTokensExpiredSignature => write!(fmt, "The provided expires_at is already expired."), - Error::InvalidTenantToken(e) => write!(fmt, "Impossible to generate the token, jsonwebtoken encountered an error: {}", e) + Error::InvalidTenantToken(e) => write!(fmt, "Impossible to generate the token, jsonwebtoken encountered an error: {}", e), + Error::Yaup(e) => write!(fmt, "Internal Error: could not parse the query parameters: {}", e) } } } diff --git a/src/indexes.rs b/src/indexes.rs index 7178fc1e..2e0dad4d 100644 --- a/src/indexes.rs +++ b/src/indexes.rs @@ -264,7 +264,7 @@ impl Index { self.client.host, self.uid, uid ), &self.client.api_key, - Method::Get, + Method::Get(()), 200, ) .await @@ -330,7 +330,7 @@ impl Index { url.push_str("attributesToRetrieve="); url.push_str(attributes_to_retrieve); } - request::<(), Vec>(&url, &self.client.api_key, Method::Get, 200).await + request::<(), Vec>(&url, &self.client.api_key, Method::Get(()), 200).await } /// Add a list of [Document]s or replace them if they already exist. @@ -742,7 +742,7 @@ impl Index { uid.as_ref() ), &self.client.api_key, - Method::Get, + Method::Get(()), 200, ) .await @@ -782,7 +782,7 @@ impl Index { Ok(request::<(), AllTasks>( &format!("{}/indexes/{}/tasks", self.client.host, self.uid), &self.client.api_key, - Method::Get, + Method::Get(()), 200, ) .await? @@ -809,10 +809,10 @@ impl Index { /// # }); /// ``` pub async fn get_stats(&self) -> Result { - request::( + request::<(), IndexStats>( &format!("{}/indexes/{}/stats", self.client.host, self.uid), &self.client.api_key, - Method::Get, + Method::Get(()), 200, ) .await diff --git a/src/request.rs b/src/request.rs index 52cd8d05..e748d543 100644 --- a/src/request.rs +++ b/src/request.rs @@ -5,7 +5,7 @@ use serde_json::{from_str, to_string}; #[derive(Debug)] pub(crate) enum Method { - Get, + Get(T), Post(T), Patch(T), Put(T), @@ -26,7 +26,15 @@ pub(crate) async fn request { + Method::Get(query) => { + let query = yaup::to_string(query)?; + + let url = if query.is_empty() { + url.to_string() + } else { + format!("{}?{}", url, query) + }; + Request::get(url) .header(header::AUTHORIZATION, auth) .header(header::USER_AGENT, user_agent) diff --git a/src/settings.rs b/src/settings.rs index 1e09e668..254d17db 100644 --- a/src/settings.rs +++ b/src/settings.rs @@ -216,7 +216,7 @@ impl Index { request::<(), Settings>( &format!("{}/indexes/{}/settings", self.client.host, self.uid), &self.client.api_key, - Method::Get, + Method::Get(()), 200, ) .await @@ -245,7 +245,7 @@ impl Index { self.client.host, self.uid ), &self.client.api_key, - Method::Get, + Method::Get(()), 200, ) .await @@ -274,7 +274,7 @@ impl Index { self.client.host, self.uid ), &self.client.api_key, - Method::Get, + Method::Get(()), 200, ) .await @@ -303,7 +303,7 @@ impl Index { self.client.host, self.uid ), &self.client.api_key, - Method::Get, + Method::Get(()), 200, ) .await @@ -332,7 +332,7 @@ impl Index { self.client.host, self.uid ), &self.client.api_key, - Method::Get, + Method::Get(()), 200, ) .await @@ -361,7 +361,7 @@ impl Index { self.client.host, self.uid ), &self.client.api_key, - Method::Get, + Method::Get(()), 200, ) .await @@ -390,7 +390,7 @@ impl Index { self.client.host, self.uid ), &self.client.api_key, - Method::Get, + Method::Get(()), 200, ) .await @@ -419,7 +419,7 @@ impl Index { self.client.host, self.uid ), &self.client.api_key, - Method::Get, + Method::Get(()), 200, ) .await @@ -448,7 +448,7 @@ impl Index { self.client.host, self.uid ), &self.client.api_key, - Method::Get, + Method::Get(()), 200, ) .await