use crate::error::Error;
use crate::http::HttpClient;
use crate::types::common::RequestOptions;
use crate::types::spaces::{
CommitRequest, CreateSpaceRequest, SpaceResponse, SpaceSearchRequest, SpaceSearchResponse,
};
#[derive(Debug, Clone)]
pub struct SpacesClient {
http: HttpClient,
}
impl SpacesClient {
pub(crate) fn new(http: HttpClient) -> Self {
Self { http }
}
pub async fn create_space(
&self,
request: CreateSpaceRequest,
options: Option<&RequestOptions>,
) -> Result<SpaceResponse, Error> {
self.http.post("/spaces", &request, options).await
}
pub async fn get_space(
&self,
space_id: &str,
options: Option<&RequestOptions>,
) -> Result<SpaceResponse, Error> {
let path = format!("/spaces/{}", encode(space_id));
self.http.get(&path, None, options).await
}
pub async fn clone_space(
&self,
space_id: &str,
options: Option<&RequestOptions>,
) -> Result<SpaceResponse, Error> {
let path = format!("/spaces/{}/clone", encode(space_id));
self.http.post(&path, &serde_json::json!({}), options).await
}
pub async fn commit(
&self,
space_id: &str,
request: CommitRequest,
options: Option<&RequestOptions>,
) -> Result<SpaceResponse, Error> {
let path = format!("/spaces/{}/commit", encode(space_id));
self.http.post(&path, &request, options).await
}
pub async fn search(
&self,
space_id: &str,
request: SpaceSearchRequest,
value_ordering: Option<&str>,
options: Option<&RequestOptions>,
) -> Result<SpaceSearchResponse, Error> {
let path = format!("/spaces/{}/search", encode(space_id));
let query = value_ordering.map(|v| [("value_ordering", v)]);
let query_ref = query.as_ref().map(|s| s.as_slice());
self.http
.post_with_query(&path, query_ref, &request, options)
.await
}
}
fn encode(s: &str) -> String {
url::form_urlencoded::byte_serialize(s.as_bytes()).collect()
}