Skip to main content

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}