http_request_derive/
http_request_query_params.rs

1// SPDX-FileCopyrightText: OpenTalk GmbH <mail@opentalk.eu>
2//
3// SPDX-License-Identifier: MIT OR Apache-2.0
4
5use crate::Error;
6
7/// A trait implemented by entities tha can build a HTTP request query string
8pub trait HttpRequestQueryParams {
9    /// Build the HTTP request query string
10    fn http_request_query_string(&self) -> Result<Option<String>, Error>;
11}
12
13#[cfg(not(feature = "serde"))]
14impl HttpRequestQueryParams for () {
15    fn http_request_query_string(&self) -> Result<Option<String>, Error> {
16        Ok(None)
17    }
18}
19
20#[cfg(not(feature = "serde"))]
21impl HttpRequestQueryParams for String {
22    fn http_request_query_string(&self) -> Result<Option<String>, Error> {
23        Ok(Some(self.to_string()))
24    }
25}
26
27#[cfg(feature = "serde")]
28impl<T: serde::Serialize> HttpRequestQueryParams for T {
29    fn http_request_query_string(&self) -> Result<Option<String>, Error> {
30        use snafu::ResultExt;
31
32        let value: serde_json::Value =
33            serde_json::to_value(self).context(crate::error::JsonSnafu)?;
34
35        match value {
36            serde_json::Value::Null => Ok(None),
37            serde_json::Value::String(s) => Ok(Some(s)),
38            serde_json::Value::Bool(_)
39            | serde_json::Value::Number(_)
40            | serde_json::Value::Array(_) => Err(crate::error::QueryStringSnafu {
41                message: "query item must serialize to `null`, `string`, or `object`".to_string(),
42            }
43            .build()),
44            serde_json::Value::Object(_) => Ok(Some(
45                serde_url_params::to_string(self).context(crate::error::SerdeUrlParamsSnafu)?,
46            )),
47        }
48    }
49}