use crate::{
http::{headers::HeaderMap, request::Body, response::Response, transport::Transport, Method},
Error,
};
use serde::{Serialize, Serializer};
use std::time::Duration;
pub(crate) fn serialize_coll_qs<S, T>(
value: &Option<&[T]>,
serializer: S,
) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where
S: Serializer,
T: Serialize,
{
let vec = value.expect("attempt to serialize Option::None value");
let serialized = vec
.iter()
.map(|v| serde_json::to_string(v).unwrap())
.collect::<Vec<_>>();
let target = serialized
.iter()
.map(|s| s.trim_matches('"'))
.collect::<Vec<_>>()
.join(",");
serializer.serialize_str(&target)
}
#[derive(Clone, Debug, Default)]
pub struct OpenSearch {
transport: Transport,
}
impl OpenSearch {
pub fn new(transport: Transport) -> Self {
OpenSearch { transport }
}
pub fn transport(&self) -> &Transport {
&self.transport
}
pub async fn send<B, Q>(
&self,
method: Method,
path: &str,
headers: HeaderMap,
query_string: Option<&Q>,
body: Option<B>,
timeout: Option<Duration>,
) -> Result<Response, Error>
where
B: Body,
Q: Serialize + ?Sized,
{
self.transport
.send(method, path, headers, query_string, body, timeout)
.await
}
}