use chrono::{DateTime, Utc};
use serde::{Serialize, Deserialize};
use serde_with::{SerializeDisplay, DeserializeFromStr};
use struct_metadata::Described;
use crate::{Sha256, ElasticMeta};
#[derive(SerializeDisplay, DeserializeFromStr, strum::Display, strum::EnumString, Described)]
#[metadata_type(ElasticMeta)]
pub enum Status {
#[strum(serialize = "FAIL_NONRECOVERABLE")]
FailNonrecoverable,
#[strum(serialize = "FAIL_RECOVERABLE")]
FailRecoverable,
}
#[derive(SerializeDisplay, DeserializeFromStr, strum::Display, strum::EnumString, Described)]
#[metadata_type(ElasticMeta)]
pub enum ErrorTypes {
#[strum(serialize = "UNKNOWN")]
Unknown = 0,
#[strum(serialize = "EXCEPTION")]
Exception = 1,
#[strum(serialize = "MAX DEPTH REACHED")]
MaxDepthReached = 10,
#[strum(serialize = "MAX FILES REACHED")]
MaxFilesReached = 11,
#[strum(serialize = "MAX RETRY REACHED")]
MaxRetryReached = 12,
#[strum(serialize = "SERVICE BUSY")]
ServiceBusy = 20,
#[strum(serialize = "SERVICE DOWN")]
ServiceDown = 21,
#[strum(serialize = "TASK PRE-EMPTED")]
TaskPreempted = 30
}
#[derive(Serialize, Deserialize, Described)]
#[metadata_type(ElasticMeta)]
#[metadata(index=true, store=true)]
pub struct Response {
#[metadata(copyto="__text__")]
pub message: String,
pub service_debug_info: Option<String>,
#[metadata(copyto="__text__")]
pub service_name: String,
#[metadata(copyto="__text__")]
pub service_tool_version: Option<String>,
pub service_version: String,
pub status: Status,
}
#[derive(Serialize, Deserialize, Described)]
#[metadata_type(ElasticMeta)]
#[metadata(index=true, store=true)]
pub struct Error {
pub created: DateTime<Utc>,
#[metadata(store=false)]
pub expiry_ts: Option<DateTime<Utc>>,
pub response: Response,
#[metadata(copyto="__text__")]
pub sha256: Sha256,
#[serde(rename="type", default="default_error_type")]
pub error_type: ErrorTypes,
}
fn default_error_type() -> ErrorTypes { ErrorTypes::Exception }