redpanda_http/
lib.rs

1pub mod subscriber;
2pub mod publisher;
3
4use thiserror::Error;
5
6#[derive(Debug,Error)]
7
8#[error("RedPanda http error {0}")]
9pub struct RedPandaError(pub String, #[source] pub Option<Box<dyn std::error::Error>>);
10
11
12// impl Display for RedPandaError {
13//     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
14//         f.write_str(&self.0)
15//     }
16// }
17
18impl RedPandaError {
19    pub fn simple(msg: &str)->Self {
20        RedPandaError(msg.to_owned(), None)
21    }
22
23    pub fn nested(msg: &str, cause: Box<dyn std::error::Error>)->Self {
24        RedPandaError(msg.to_owned(), Some(cause))
25    }
26
27    pub fn wrap(cause: Box<dyn std::error::Error>)->Self {
28        RedPandaError("".to_owned(), Some(cause))
29    }
30}
31
32mod base64_option {
33    use base64::Engine;
34    use base64::engine::general_purpose::STANDARD as BASE64_STANDARD;
35    use serde::{Serialize, Deserialize};
36    use serde::{Deserializer, Serializer};
37
38    pub fn serialize<S: Serializer>(v: &Option<Vec<u8>>, s: S) -> Result<S::Ok, S::Error> {
39        // base64::encode(input)
40        let base64 = v.as_ref().map(|element| BASE64_STANDARD.encode(element));
41        // let base64 = match v {
42
43        //     Some(v) => Some(BASE64_STANDARD.encode(v)),
44        //     None => None,
45        // };
46        <Option<String>>::serialize(&base64, s)
47    }
48    
49    pub fn deserialize<'de, D: Deserializer<'de>>(d: D) -> Result<Option<Vec<u8>>, D::Error> {
50        let base64 = <Option<String>>::deserialize(d)?;
51        match base64 {
52            Some(v) => {
53                BASE64_STANDARD.decode(v.as_bytes())
54                    .map(Some)
55                    .map_err(serde::de::Error::custom)
56            },
57            None => Ok(None),
58        }
59    }
60}