use crate::error::{CouchError, CouchResult};
use reqwest::StatusCode;
use serde::{Deserialize, Serialize};
pub type DocumentId = String;
#[derive(Serialize, Deserialize, PartialEq, Eq, Debug, Clone)]
#[serde(untagged)]
pub enum DocumentRef<T> {
Ref(DocumentId),
Populated(T),
}
#[derive(Serialize, Deserialize, Eq, PartialEq, Debug, Clone)]
pub(crate) struct DocumentCreatedResponse {
pub id: Option<String>,
pub rev: Option<String>,
pub ok: Option<bool>,
pub error: Option<String>,
pub reason: Option<String>,
}
#[derive(Serialize, Deserialize, Eq, PartialEq, Debug, Clone)]
pub struct DocumentCreatedDetails {
pub id: String,
pub rev: String,
}
impl From<DocumentCreatedResponse> for DocumentCreatedResult {
fn from(response: DocumentCreatedResponse) -> Self {
if let Some(error) = response.error {
let status_code = match error.as_str() {
"forbidden" => StatusCode::FORBIDDEN,
"unauthorized" => StatusCode::UNAUTHORIZED,
"conflict" => StatusCode::CONFLICT,
_ => StatusCode::INTERNAL_SERVER_ERROR,
};
Err(CouchError::new_with_id(
response.id,
response.reason.unwrap_or_default(),
status_code,
))
} else {
match (response.id, response.rev) {
(Some(id), Some(rev)) => Ok(DocumentCreatedDetails { id, rev }),
(_, _) => Err(CouchError::new(
"Unexpected response format".to_string(),
StatusCode::INTERNAL_SERVER_ERROR,
)),
}
}
}
}
pub type DocumentCreatedResult = CouchResult<DocumentCreatedDetails>;