| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | |
| | |
| | |
| | #[derive(Clone, Debug, PartialEq)] |
| | pub struct Blob { |
| | data: Vec<u8>, |
| | } |
| |
|
| | impl Blob { |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | pub fn new(data: Vec<u8>) -> Self { |
| | Self { data } |
| | } |
| |
|
| | |
| | |
| | |
| | pub fn empty() -> Self { |
| | Self { data: vec![] } |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | pub fn from_str(s: &str) -> Self { |
| | Self { |
| | data: s.as_bytes().to_vec(), |
| | } |
| | } |
| |
|
| | |
| | pub fn data(&self) -> &[u8] { |
| | &self.data |
| | } |
| |
|
| | |
| | pub fn size(&self) -> usize { |
| | self.data.len() |
| | } |
| |
|
| | |
| | pub fn is_empty(&self) -> bool { |
| | self.data.is_empty() |
| | } |
| |
|
| | |
| | pub fn as_str(&self) -> Option<&str> { |
| | std::str::from_utf8(&self.data).ok() |
| | } |
| |
|
| | |
| | pub fn into_inner(self) -> Vec<u8> { |
| | self.data |
| | } |
| | } |
| |
|
| | impl From<Vec<u8>> for Blob { |
| | fn from(data: Vec<u8>) -> Self { |
| | Self::new(data) |
| | } |
| | } |
| |
|
| | impl From<&[u8]> for Blob { |
| | fn from(data: &[u8]) -> Self { |
| | Self::new(data.to_vec()) |
| | } |
| | } |
| |
|
| | impl From<&str> for Blob { |
| | fn from(s: &str) -> Self { |
| | Self::from_str(s) |
| | } |
| | } |
| |
|
| | impl From<String> for Blob { |
| | fn from(s: String) -> Self { |
| | Self::new(s.into_bytes()) |
| | } |
| | } |
| |
|
| | #[cfg(test)] |
| | mod tests { |
| | use super::*; |
| |
|
| | #[test] |
| | fn test_blob_new() { |
| | let blob = Blob::new(vec![1, 2, 3]); |
| | assert_eq!(blob.data(), &[1, 2, 3]); |
| | assert_eq!(blob.size(), 3); |
| | } |
| |
|
| | #[test] |
| | fn test_blob_empty() { |
| | let blob = Blob::empty(); |
| | assert!(blob.is_empty()); |
| | assert_eq!(blob.size(), 0); |
| | } |
| |
|
| | #[test] |
| | fn test_blob_from_str() { |
| | let blob = Blob::from_str("hello world"); |
| | assert_eq!(blob.as_str(), Some("hello world")); |
| | } |
| |
|
| | #[test] |
| | fn test_blob_as_str_invalid_utf8() { |
| | let blob = Blob::new(vec![0xff, 0xfe]); |
| | assert_eq!(blob.as_str(), None); |
| | } |
| |
|
| | #[test] |
| | fn test_blob_from_conversions() { |
| | let blob1: Blob = vec![1, 2, 3].into(); |
| | assert_eq!(blob1.size(), 3); |
| |
|
| | let blob2: Blob = "test".into(); |
| | assert_eq!(blob2.as_str(), Some("test")); |
| |
|
| | let blob3: Blob = String::from("test").into(); |
| | assert_eq!(blob3.as_str(), Some("test")); |
| | } |
| |
|
| | #[test] |
| | fn test_blob_into_inner() { |
| | let blob = Blob::new(vec![1, 2, 3]); |
| | let data = blob.into_inner(); |
| | assert_eq!(data, vec![1, 2, 3]); |
| | } |
| | } |
| |
|