use std::fmt::Display;
#[cfg(feature="writing")]
pub mod writer;
#[cfg(feature="reading")]
pub mod reader;
#[derive(Debug, Clone)]
pub struct Segment {
seg: Vec<u8>
}
impl Segment {
pub fn new() -> Self {
Self {
seg: Vec::new()
}
}
pub fn to_readable(segments: Vec<Segment>) -> Vec<String> {
segments.iter().map(|s| s.to_string()).collect::<Vec<String>>()
}
pub fn append(&mut self, seg: Segment) {
self.seg.extend(seg.seg);
}
pub(crate) fn len(&self) -> usize {
self.seg.len()
}
pub fn to_raw(&self) -> Vec<u8> {
self.seg.clone()
}
}
impl Default for Segment {
fn default() -> Self {
Self::new()
}
}
impl AsRef<[u8]> for Segment {
fn as_ref(&self) -> &[u8] {
&self.seg
}
}
impl From<&[u8]> for Segment {
fn from(value: &[u8]) -> Self {
Self {
seg: value.to_vec()
}
}
}
impl From<Vec<u8>> for Segment {
fn from(value: Vec<u8>) -> Self {
Self {
seg: value
}
}
}
impl From<String> for Segment {
fn from(value: String) -> Self {
Self {
seg: value.as_bytes().to_vec()
}
}
}
impl Display for Segment {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", String::from_utf8_lossy(&self.seg))
}
}
mod tests {
#[test]
fn test_writer() {
let mut writer = crate::writer::VarWriter::new();
writer.add_string("Hello, ");
writer.add_string("World!");
let mut stream: Vec<u8> = Vec::new();
writer.send(&mut stream).expect("Failed to send data");
}
#[test]
fn test_reader() {
let stream: Vec<u8> = vec![21, 7, 0, 0, 0, 72, 101, 108, 108, 111, 44, 32, 6, 0, 0, 0, 87, 111, 114, 108, 100, 33];
let mut fake_stream = stream.as_slice();
let mut reader = crate::reader::VarReader::new(&mut fake_stream);
let data = reader.read_data().unwrap();
assert_eq!(data[0].to_string(), "Hello, ");
assert_eq!(data[1].to_string(), "World!");
}
#[test]
fn both_test() {
let mut writer = crate::writer::VarWriter::new();
writer.add_string("Hello, ");
writer.add_string("World!");
let mut stream: Vec<u8> = Vec::new();
writer.send(&mut stream).expect("Failed to send data");
let mut fake_stream = stream.as_slice();
let mut reader = crate::reader::VarReader::new(&mut fake_stream);
let data = reader.read_data().unwrap();
assert_eq!(data[0].to_string(), "Hello, ");
assert_eq!(data[1].to_string(), "World!");
}
}