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
12impl 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 let base64 = v.as_ref().map(|element| BASE64_STANDARD.encode(element));
41 <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}