use std::io::Write;
use lending_iterator::LendingIterator;
use crate::{
client::DadaClient,
errors::{PsrdadaError, PsrdadaResult},
io::{ReadHalf, WriteHalf},
};
impl WriteHalf<'_> {
pub fn push(&mut self, data: &[u8]) -> PsrdadaResult<usize> {
let mut block = match self.next() {
Some(b) => b,
None => return Err(PsrdadaError::DadaWriteError),
};
block.write(data).map_err(|_| PsrdadaError::DadaWriteError)
}
}
impl ReadHalf<'_> {
pub fn pop(&mut self) -> Option<Vec<u8>> {
let mut block = match self.next() {
Some(b) => b,
None => return None,
};
Some(block.read_block().to_vec())
}
}
impl DadaClient {
pub fn push_data(&mut self, data: &[u8]) -> PsrdadaResult<usize> {
let (_, mut dc) = self.split();
let mut writer = dc.writer();
writer.push(data)
}
pub fn pop_data(&mut self) -> Option<Vec<u8>> {
let (_, mut dc) = self.split();
let mut reader = dc.reader();
reader.pop()
}
}
#[cfg(test)]
mod tests {
use lending_iterator::LendingIterator;
use crate::{builder::DadaClientBuilder, tests::next_key};
#[test]
fn test_push() {
let key = next_key();
let mut client = DadaClientBuilder::new(key).build().unwrap();
let (_, mut dc) = client.split();
let mut writer = dc.writer();
assert_eq!(32, writer.push(&[0u8; 32]).unwrap());
let mut reader = dc.reader();
assert_eq!([0u8; 32], reader.next().unwrap().read_block());
}
#[test]
fn test_push_pop_data() {
let key = next_key();
let mut client = DadaClientBuilder::new(key).build().unwrap();
assert_eq!(8, client.push_data(&[0u8; 8]).unwrap());
assert_eq!(vec![0u8; 8], client.pop_data().unwrap());
}
}