http_request_derive/
http_request_query_params.rs1use crate::Error;
6
7pub trait HttpRequestQueryParams {
9 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}