use crate::regexes::COUCHDB_DB_RULE;
use awc::{Client, ClientRequest};
pub mod errors;
use crate::client::couchdb::responses::db_status::DbStatus;
use errors::DBStatusError;
pub async fn get_db_status(
client: &Client,
db_name: &str,
host: &str,
) -> Result<DbStatus, Box<dyn std::error::Error>> {
if !COUCHDB_DB_RULE.is_match(db_name) {
return Err(Box::new(DBStatusError::new(&format!(
"{} string doesn't respect the regex rule {}",
db_name,
COUCHDB_DB_RULE.as_str()
))));
}
let uri: String = format!("{}/{}", host, db_name,);
let request: ClientRequest = client.get(&uri);
match request.send().await {
Ok(mut response) => {
if response.status().as_u16() >= 400 {
let bytes: Vec<u8> = response.body().await?.iter().cloned().collect();
let error: serde_json::Value =
serde_json::from_str(std::str::from_utf8(bytes.as_slice()).unwrap()).unwrap();
Err(Box::new(DBStatusError::new(&format!(
"Error with the request to {}: error: \n{}",
&uri, error
))))
} else {
let bytes: Vec<u8> = response.body().await?.iter().cloned().collect();
let value: DbStatus = serde_json::from_str({
let res = std::str::from_utf8(bytes.as_slice()).unwrap();
res
})
.unwrap();
Ok(value)
}
}
Err(error) => Err(Box::new(DBStatusError::new(&format!(
"Error with the request to {}: error: \n{}",
host, error
)))),
}
}