amp_serde/
types.rs

1use std::fmt::Display;
2
3use bytes::Bytes;
4use serde::{Deserialize, Serialize};
5
6#[derive(Serialize, Deserialize, Clone, Debug)]
7pub struct Request<Q> {
8    #[serde(rename = "_ask", skip_serializing_if = "Option::is_none")]
9    pub tag: Option<Bytes>,
10    #[serde(rename = "_command")]
11    pub command: String,
12    #[serde(flatten)]
13    pub fields: Q,
14}
15
16#[derive(Serialize, Deserialize, Clone, Debug)]
17pub struct OkResponse<R> {
18    #[serde(rename = "_answer")]
19    pub tag: Bytes,
20    #[serde(flatten)]
21    pub fields: R,
22}
23
24#[derive(Serialize, Deserialize, Clone, Debug)]
25pub struct ErrorResponse {
26    #[serde(rename = "_error")]
27    pub tag: Bytes,
28    #[serde(rename = "_error_code")]
29    pub code: String,
30    #[serde(rename = "_error_description")]
31    pub description: String,
32}
33
34impl<R> From<Response<R>> for Result<OkResponse<R>, ErrorResponse> {
35    fn from(value: Response<R>) -> Result<OkResponse<R>, ErrorResponse> {
36        match value {
37            Response::Ok(v) => Ok(v),
38            Response::Err(e) => Err(e),
39        }
40    }
41}
42
43impl<R> From<Result<OkResponse<R>, ErrorResponse>> for Response<R> {
44    fn from(value: Result<OkResponse<R>, ErrorResponse>) -> Response<R> {
45        match value {
46            Ok(v) => Response::Ok(v),
47            Err(e) => Response::Err(e),
48        }
49    }
50}
51
52#[derive(Serialize, Deserialize, Clone, Debug)]
53#[serde(untagged)]
54pub enum Response<F> {
55    Ok(OkResponse<F>),
56    Err(ErrorResponse),
57}
58
59#[derive(Debug)]
60pub enum Error {
61    IO(std::io::Error),
62    KeyTooLong,
63    EmptyKey,
64    ValueTooLong,
65    Serde(String),
66    Unsupported,
67}
68
69impl From<std::io::Error> for Error {
70    fn from(err: std::io::Error) -> Self {
71        Self::IO(err)
72    }
73}
74
75impl Display for Error {
76    fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> {
77        write!(fmt, "{:?}", self)
78    }
79}
80
81impl serde::ser::Error for Error {
82    fn custom<T>(msg: T) -> Error
83    where
84        T: Display,
85    {
86        Error::Serde(msg.to_string())
87    }
88}
89
90impl std::error::Error for Error {}