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 {}