use std::borrow::Cow;
use std::fmt;
use crate::util::format_build_id;
#[derive(Debug)]
pub enum BuildId<'id> {
RawBytes(Cow<'id, [u8]>),
Formatted(Cow<'id, str>),
}
impl<'id> BuildId<'id> {
#[inline]
pub fn formatted<B>(build_id: B) -> Self
where
B: Into<Cow<'id, str>>,
{
Self::Formatted(build_id.into())
}
#[inline]
pub fn raw<B>(build_id: B) -> Self
where
B: Into<Cow<'id, [u8]>>,
{
Self::RawBytes(build_id.into())
}
pub fn format(&self) -> Cow<'_, str> {
match self {
Self::RawBytes(bytes) => Cow::Owned(format_build_id(bytes)),
Self::Formatted(string) => Cow::Borrowed(string),
}
}
}
impl fmt::Display for BuildId<'_> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", self.format())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn build_id_construction() {
let build_id = BuildId::raw(&[0x00]);
assert!(matches!(build_id, BuildId::RawBytes(Cow::Borrowed(..))));
let build_id = BuildId::raw(vec![0x00]);
assert!(matches!(build_id, BuildId::RawBytes(Cow::Owned(..))));
let build_id = BuildId::formatted("abc");
assert!(matches!(build_id, BuildId::Formatted(Cow::Borrowed(..))));
let build_id = BuildId::formatted("abc".to_string());
assert!(matches!(build_id, BuildId::Formatted(Cow::Owned(..))));
}
#[test]
fn build_id_display() {
let build_id = BuildId::raw(&[
0xae, 0xb9, 0xa9, 0x83, 0xac, 0xe1, 0xfb, 0x04, 0x7b, 0x23, 0x41, 0xb1, 0x95, 0x01, 0x65,
0x44, 0x0f, 0xb2, 0xa8, 0xb9,
]);
assert_eq!(
build_id.to_string(),
"aeb9a983ace1fb047b2341b1950165440fb2a8b9"
);
}
}