use std::collections::HashMap;
use prost::{EncodeError, Message};
pub trait TryIntoOrNone<F, T> {
fn try_into_or_none(self) -> Option<T>;
}
impl<F, T> TryIntoOrNone<F, T> for Option<F>
where
F: TryInto<T>,
{
fn try_into_or_none(self) -> Option<T> {
self.map(TryInto::try_into).transpose().ok().flatten()
}
}
pub fn pack_any<T: Message>(type_url: String, msg: &T) -> Result<prost_types::Any, EncodeError> {
let mut value = Vec::new();
Message::encode(msg, &mut value)?;
Ok(prost_types::Any { type_url, value })
}
pub fn decode_status_detail<T: Message + Default>(details: &[u8]) -> Option<T> {
let status = super::google::rpc::Status::decode(details).ok()?;
let first_detail = status.details.first()?;
T::decode(first_detail.value.as_slice()).ok()
}
pub fn normalize_http_headers(headers: HashMap<String, String>) -> HashMap<String, String> {
let mut new_headers = HashMap::new();
for (header_key, val) in headers.into_iter() {
new_headers.insert(header_key.to_lowercase(), val);
}
new_headers
}