1pub use prost::{Message, Name};
4
5use alloc::{string::String, vec::Vec};
6use core::str::FromStr;
7use prost::EncodeError;
8
9pub trait MessageExt: Message {
11    fn to_bytes(&self) -> Result<Vec<u8>, EncodeError>;
13}
14
15impl<M> MessageExt for M
16where
17    M: prost::Message,
18{
19    fn to_bytes(&self) -> Result<Vec<u8>, EncodeError> {
20        let mut bytes = Vec::new();
21        Message::encode(self, &mut bytes)?;
22        Ok(bytes)
23    }
24}
25
26pub trait ParseOptional: AsRef<str> {
30    fn parse_optional<T: FromStr>(&self) -> Result<Option<T>, T::Err> {
32        if self.as_ref().is_empty() {
33            Ok(None)
34        } else {
35            Ok(Some(self.as_ref().parse()?))
36        }
37    }
38}
39
40impl ParseOptional for str {}
41impl ParseOptional for String {}