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