use crate::error::{PodtenderError, Result};
use crate::podman_service::network_internals::PodmanServiceResponseBytes;
use crate::podtender_errors::PodmanErrorResponse;
use crate::podtender_errors::RequestError;
use crate::PODMAN_API_VERSION;
use serde::de::DeserializeOwned;
use std::collections::HashMap;
#[cfg(feature = "enable-tracing")]
use tracing::{debug, warn};
pub(crate) fn create_endpoint(endpoint: &str) -> String {
format!("{}{}", PODMAN_API_VERSION, endpoint)
}
pub(crate) fn deserialize_service_response<T: DeserializeOwned + std::fmt::Debug>(
service_response: PodmanServiceResponseBytes,
) -> Result<T> {
#[cfg(feature = "enable-tracing")]
{
let tmp = String::from_utf8(service_response.body.to_vec());
debug!(raw_response = ?tmp);
}
let response_deserializer =
&mut serde_json::Deserializer::from_slice(service_response.body.as_ref());
match serde_path_to_error::deserialize(response_deserializer) {
Ok(result) => {
#[cfg(feature = "enable-tracing")]
debug!(deserialized_response = ?result);
Ok(result)
}
Err(error) => {
if service_response.status_code.is_success() {
#[cfg(feature = "enable-tracing")]
warn!(
?error,
"Status code indicates success but deserialization failed"
);
Err(PodtenderError::from(error))
}
else {
Err(handle_service_response_error(service_response))
}
}
}
}
pub(crate) fn check_service_response_for_error(
service_response: PodmanServiceResponseBytes,
) -> Result<()> {
if service_response.status_code.is_success() {
Ok(())
} else {
Err(handle_service_response_error(service_response))
}
}
pub(crate) fn handle_service_response_error(
service_response: PodmanServiceResponseBytes,
) -> PodtenderError {
if let Ok(podman_error) =
serde_json::from_slice::<PodmanErrorResponse>(service_response.body.as_ref())
{
#[cfg(feature = "enable-tracing")]
warn!(?podman_error);
podman_error.into()
} else {
let message = {
match String::from_utf8(service_response.body.to_vec()) {
Ok(message) => message,
Err(error) => return error.into(),
}
};
let request_error = RequestError {
message,
response_code: service_response.status_code.as_u16(),
};
#[cfg(feature = "enable-tracing")]
warn!(?request_error,);
request_error.into()
}
}
pub(crate) fn convert_from_map_to_json_string(
map: Option<HashMap<String, Vec<String>>>,
) -> Result<Option<String>> {
Ok(if let Some(map) = map {
Some(serde_json::to_string(&map)?)
} else {
None
})
}