1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
use alloc::format;
use alloc::string::String;
use core::fmt::Display;
use core::format_args;

use flex_error::{define_error, DisplayOnly};
use prost::{DecodeError, EncodeError};

use super::erased::TryFrom;

define_error! {
    Error {
        TryFromProtobuf
            { reason: String }
            | e | {
                format_args!("error converting message type into domain type: {}",
                    e.reason)
            },

        EncodeMessage
            [ DisplayOnly<EncodeError> ]
            | _ | { "error encoding message into buffer" },

        DecodeMessage
            [ DisplayOnly<DecodeError> ]
            | _ | { "error decoding buffer into message" },
    }
}

impl Error {
    pub fn try_from<Raw, T, E>(e: E) -> Error
    where
        E: Display,
        T: TryFrom<Raw, Error = E>,
    {
        Error::try_from_protobuf(format!("{e}"))
    }
}