use sysexits::{ExitCode, Result};
pub trait ConvertBuffer<T> {
fn convert_from(&mut self, buffer: T) -> Result<()>;
fn convert_into(&self) -> Result<T>;
}
impl ConvertBuffer<Self> for String {
fn convert_from(&mut self, buffer: Self) -> Result<()> {
*self = buffer;
Ok(())
}
fn convert_into(&self) -> Result<Self> {
Ok(self.clone())
}
}
impl ConvertBuffer<Vec<u8>> for String {
fn convert_from(&mut self, buffer: Vec<u8>) -> Result<()> {
Self::from_utf8(buffer).map_or(Err(ExitCode::DataErr), |s| {
*self = s;
Ok(())
})
}
fn convert_into(&self) -> Result<Vec<u8>> {
Ok(self.as_bytes().to_vec())
}
}
impl ConvertBuffer<Self> for Vec<u8> {
fn convert_from(&mut self, buffer: Self) -> Result<()> {
*self = buffer;
Ok(())
}
fn convert_into(&self) -> Result<Self> {
Ok(self.clone())
}
}
impl ConvertBuffer<String> for Vec<u8> {
fn convert_from(&mut self, buffer: String) -> Result<()> {
*self = buffer.as_bytes().to_vec();
Ok(())
}
fn convert_into(&self) -> Result<String> {
String::from_utf8(self.clone()).map_or(Err(ExitCode::DataErr), Ok)
}
}