use regex::Regex;
use serde::{Deserialize, Serialize};
use crate::Error;
#[derive(Serialize, Deserialize, Debug, Default)]
pub struct Problem {
code: String,
comment: Option<String>,
args: Vec<String>,
escalate_to: Option<String>,
}
impl Problem {
pub fn from_code(code: &str) -> Result<Self, Error> {
let re = Regex::new(r"^[e|w]\.[a-z0-9]{1,32}\.[a-zA-Z]*\.?[-a-zA-Z\-]*\.?[-a-zA-Z\-]*$")?;
if re.is_match(code) {
Ok(Problem {
code: code.into(),
..Default::default()
})
} else {
Err(Error::Generic(
"Code badly formatted for this problem".into(),
))
}
}
pub fn from_known_problem(problem: KnownProblems) -> Self {
Problem {
code: problem.to_string(),
..Default::default()
}
}
}
#[derive(Serialize, Deserialize, Debug, Clone, Copy)]
pub enum KnownProblems {
ProtocolError,
TrustlError,
CryptoTrusError,
XferError,
DidError,
MsgError,
MeErro,
MeResError,
ReqError,
ReqTimeError,
LegalError,
ProtocolWarning,
TrustWarning,
CryptoTrustWarning,
XferWarning,
DidWarning,
MsgWarning,
MeWarning,
MeResWarning,
ReqWarning,
ReqTimeWarning,
LegalWarning,
#[serde(rename = "e.u.no-data")]
Unknown,
}
impl Default for KnownProblems {
fn default() -> Self {
KnownProblems::Unknown
}
}
impl ToString for KnownProblems {
fn to_string(&self) -> String {
serde_json::to_string(&self).unwrap_or_default()
}
}