co_didcomm/messages/problem_report.rs
1use regex::Regex;
2use serde::{Deserialize, Serialize};
3
4use crate::Error;
5
6#[derive(Serialize, Deserialize, Debug, Default)]
7pub struct Problem {
8 code: String,
9 comment: Option<String>,
10 args: Vec<String>,
11 escalate_to: Option<String>,
12}
13
14impl Problem {
15 /// Parses given code into new instance of Problem
16 /// If given string does not match regex "" - returns Err.
17 ///
18 pub fn from_code(code: &str) -> Result<Self, Error> {
19 let re = Regex::new(r"^[e|w]\.[a-z0-9]{1,32}\.[a-zA-Z]*\.?[-a-zA-Z\-]*\.?[-a-zA-Z\-]*$")?;
20 if re.is_match(code) {
21 Ok(Problem {
22 code: code.into(),
23 ..Default::default()
24 })
25 } else {
26 Err(Error::Generic(
27 "Code badly formatted for this problem".into(),
28 ))
29 }
30 }
31
32 /// Takes `KnownProblem` variant and creates new Problem
33 /// using it as code.
34 /// Kwnown problems are defined in the specifications of
35 /// the didcomm v2.
36 ///
37 pub fn from_known_problem(problem: KnownProblems) -> Self {
38 Problem {
39 code: problem.to_string(),
40 ..Default::default()
41 }
42 }
43
44 // TODO: someday? =)
45 //pub fn elevate(self) -> Self {
46 // let new_code = match self.code.into() {
47 // KnownProblems::ProtocolWarning => KnownProblems::ProtocolError,
48 // KnownProblems::TrustWarning => KnownProblems::TrustlError,
49 // KnownProblems::CryptoTrustWarning => KnownProblems::CryptoTrusError,
50 // KnownProblems::XferWarning => KnownProblems::XferError,
51 // KnownProblems::DidWarning => KnownProblems::DidError,
52 // KnownProblems::MsgError => KnownProblems::MsgError,
53 // KnownProblems::MeResWarning => KnownProblems::MeResError,
54 // KnownProblems::MeWarning => KnownProblems::MeErro,
55 // KnownProblems::LegalWarning => KnownProblems::LegalError,
56 // KnownProblems::ReqWarning => KnownProblems::ReqError,
57 // KnownProblems::ReqTimeWarning => KnownProblems::ReqTimeError,
58 // _ => self.code,
59 // };
60 // Self {
61 // code: new_code,
62 // ..self
63 // }
64 //}
65}
66
67/// Values defined in spec: https://identity.foundation/didcomm-messaging/spec/#problem-codes
68/// Except `KnownProblems::Unknow`, which is default and should be used as little as possible
69///
70#[derive(Serialize, Deserialize, Debug, Clone, Copy)]
71pub enum KnownProblems {
72 // Protocol Error section
73 ProtocolError,
74 TrustlError,
75 CryptoTrusError,
76 XferError,
77 DidError,
78 MsgError,
79 MeErro,
80 MeResError,
81 ReqError,
82 ReqTimeError,
83 LegalError,
84
85 // Protocol warning section
86 ProtocolWarning,
87 TrustWarning,
88 CryptoTrustWarning,
89 XferWarning,
90 DidWarning,
91 MsgWarning,
92 MeWarning,
93 MeResWarning,
94 ReqWarning,
95 ReqTimeWarning,
96 LegalWarning,
97
98 /// Error - Unknown - No data
99 #[serde(rename = "e.u.no-data")]
100 Unknown,
101}
102
103impl Default for KnownProblems {
104 fn default() -> Self {
105 KnownProblems::Unknown
106 }
107}
108
109impl ToString for KnownProblems {
110 fn to_string(&self) -> String {
111 serde_json::to_string(&self).unwrap_or_default()
112 }
113}