use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
#[derive(Serialize, Clone, JsonSchema)]
pub struct ApiError {
pub code: &'static str,
pub message: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub reason_code: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub request_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub details: Option<Vec<ApiErrorDetail>>,
}
#[derive(Serialize, Clone, JsonSchema)]
pub struct ApiErrorDetail {
pub code: String,
pub message: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub field: Option<String>,
}
impl ApiError {
pub fn new(code: &'static str, message: impl Into<String>) -> Self {
Self {
code,
message: message.into(),
reason_code: None,
request_id: None,
details: None,
}
}
pub fn with_reason(
code: &'static str,
message: impl Into<String>,
reason_code: impl Into<String>,
) -> Self {
Self {
code,
message: message.into(),
reason_code: Some(reason_code.into()),
request_id: None,
details: None,
}
}
pub fn with_request_id(mut self, request_id: impl Into<String>) -> Self {
self.request_id = Some(request_id.into());
self
}
pub fn with_request_id_opt(self, request_id: Option<String>) -> Self {
match request_id {
Some(id) => self.with_request_id(id),
None => self,
}
}
}
#[derive(Serialize, JsonSchema)]
pub struct UploadedFileInfo {
pub url: String,
pub filename: String,
pub mime: String,
pub size: u64,
}
#[derive(Serialize, JsonSchema)]
pub struct UploadResponseBody {
pub files: Vec<UploadedFileInfo>,
}
#[derive(Serialize, JsonSchema)]
pub struct DeleteUploadsResponseBody {
pub deleted: Vec<String>,
pub skipped: Vec<String>,
}
#[derive(Deserialize, JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct DeleteUploadsBody {
pub urls: Vec<String>,
}
#[derive(Serialize, JsonSchema)]
pub struct ConfigReloadResponseBody {
pub ok: bool,
pub message: String,
}
#[derive(Deserialize, JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct SessionConversationStoreRequestBody {
pub sqlite: bool,
}
#[derive(Serialize)]
pub struct SessionConversationStoreResponseBody {
pub ok: bool,
pub message: String,
}