use axum::{http::StatusCode, Json};
use chronon_core::{redact_credentials_in_text, sanitize_error_message, ChrononError};
use serde::{Deserialize, Serialize};
#[derive(Debug, Serialize, Deserialize)]
pub struct ApiResponse<T> {
pub success: bool,
pub data: Option<T>,
pub error: Option<String>,
}
impl<T> ApiResponse<T> {
pub fn ok(data: T) -> Self {
Self {
success: true,
data: Some(data),
error: None,
}
}
pub fn err(error: impl Into<String>) -> Self {
Self {
success: false,
data: None,
error: Some(sanitize_error_message(&redact_credentials_in_text(
&error.into(),
))),
}
}
}
pub fn chronon_status(err: &ChrononError) -> StatusCode {
match err {
ChrononError::JobNotFound(_) | ChrononError::RunNotFound(_) => StatusCode::NOT_FOUND,
ChrononError::ScriptNotFound(_)
| ChrononError::InvalidCron(_)
| ChrononError::InvalidTimezone(_)
| ChrononError::ParamError(_)
| ChrononError::Identity(_) => StatusCode::BAD_REQUEST,
ChrononError::ScriptMismatch { .. } => StatusCode::CONFLICT,
ChrononError::StorageError { .. }
| ChrononError::Internal(_)
| ChrononError::InternalSource { .. } => StatusCode::INTERNAL_SERVER_ERROR,
}
}
pub fn chronon_err<T>(err: &ChrononError) -> (StatusCode, Json<ApiResponse<T>>) {
(chronon_status(err), Json(ApiResponse::err(err.to_string())))
}