use crate::common::traits::private::Sealed;
use crate::v0::config::Config;
use crate::v0::raw;
use crate::v0::traits::{ReadFrom, WriteTo};
use std::io::{Read, Write};
use std::string::String;
use super::error::{StringReadError, StringWriteError};
impl Sealed for String {}
impl<R> ReadFrom<R> for String
where
R: Read + ?Sized,
{
type ReadError = StringReadError;
fn read_from<C: ?Sized + Config>(
reader: &mut R,
configuration: &C,
) -> Result<Self, Self::ReadError> {
let length: usize = raw::VariableLengthEnum::read_from(&mut *reader, &*configuration)?
.try_into()
.map_err(|_| StringReadError::LengthTooLarge)?;
let mut buffer: Vec<u8> = Vec::with_capacity(length);
reader.take(length as u64).read_to_end(&mut buffer)?;
let parsed_utf8: String = String::from_utf8(buffer)?;
Ok(parsed_utf8)
}
}
impl<W> WriteTo<W> for String
where
W: Write + ?Sized,
{
type WriteError = StringWriteError;
fn write_to<C: ?Sized + Config>(
&self,
writer: &mut W,
configuration: &C,
) -> Result<(), Self::WriteError> {
let bytes = self.as_bytes();
let length = bytes.len();
let variable_length_enum = raw::VariableLengthEnum::from(length);
variable_length_enum.write_to(writer, configuration)?;
writer.write_all(bytes)?;
Ok(())
}
}