binary_stream/
lib.rs

1#![cfg_attr(all(doc, CHANNEL_NIGHTLY), feature(doc_auto_cfg))]
2//! Read and write binary data to streams.
3//!
4//! An asynchronous version using [futures::io](https://docs.rs/futures/latest/futures/io/index.html) is available using the `async` feature and if the `tokio` feature flag is given then the implementation will use the traits from `tokio::io` instead which avoids the need to use the compat traits from `tokio-util` if you are using the tokio runtime.
5//!
6//! Strings are length prefixed using `u32` by default, use
7//! the `64bit` feature if you really need huge strings.
8//!
9//! Encode and decode implementations are provided for all primitive
10//! types and blanket implementations for `Option<T>` and `Vec<T>`;
11//! the blank implementation for `Vec<T>` is length prefixed using a
12//! `u32` so will panic if it is longer than `u32::MAX`.
13#![deny(missing_docs)]
14use std::{
15    borrow::Borrow,
16    io::{
17        BufReader, BufWriter, Cursor, Error, ErrorKind, Read, Result, Seek,
18        SeekFrom, Write,
19    },
20};
21
22#[cfg(feature = "async")]
23pub mod futures;
24
25macro_rules! encode_endian {
26    ($endian:expr, $value:expr, $stream:expr) => {
27        let data = match $endian {
28            Endian::Little => $value.to_le_bytes(),
29            Endian::Big => $value.to_be_bytes(),
30        };
31        return Ok($stream.write(&data)?);
32    };
33}
34
35macro_rules! decode_endian {
36    ($endian:expr, $value:expr, $kind:ty) => {
37        let data = match $endian {
38            Endian::Little => <$kind>::from_le_bytes($value),
39            Endian::Big => <$kind>::from_be_bytes($value),
40        };
41        return Ok(data);
42    };
43}
44
45macro_rules! guard_size {
46    ($len:expr, $max:expr) => {
47        if let Some(max) = $max {
48            if $len as usize > max {
49                return Err(Error::new(
50                    ErrorKind::Other,
51                    format!(
52                        "length {} exceeds max buffer size {}",
53                        $len, max
54                    ),
55                ));
56            }
57        }
58    };
59}
60
61pub(crate) use decode_endian;
62pub(crate) use guard_size;
63
64/// Variants to describe endianness.
65#[derive(Clone, Copy)]
66pub enum Endian {
67    /// Big endian.
68    Big,
69    /// Little endian.
70    Little,
71}
72
73impl Default for Endian {
74    fn default() -> Self {
75        Self::Little
76    }
77}
78
79/// Options for reading and writing.
80#[derive(Clone, Default)]
81pub struct Options {
82    /// The endian type.
83    pub endian: Endian,
84    /// Maximum buffer size for strings and byte slices.
85    pub max_buffer_size: Option<usize>,
86}
87
88impl From<Endian> for Options {
89    fn from(endian: Endian) -> Self {
90        Self {
91            endian,
92            max_buffer_size: None,
93        }
94    }
95}
96
97/// Get the length of a stream by seeking to the end
98/// and then restoring the previous position.
99pub fn stream_length<S: Seek>(stream: &mut S) -> Result<u64> {
100    let position = stream.stream_position()?;
101    let length = stream.seek(SeekFrom::End(0))?;
102    stream.seek(SeekFrom::Start(position))?;
103    Ok(length)
104}
105
106/// Read from a stream.
107pub struct BinaryReader<R>
108where
109    R: Read + Seek,
110{
111    stream: R,
112    options: Options,
113}
114
115impl<R: Read + Seek> BinaryReader<R> {
116    /// Create a binary reader with the given options.
117    pub fn new(stream: R, options: Options) -> Self {
118        Self { stream, options }
119    }
120
121    /// Seek to a position.
122    pub fn seek(&mut self, to: SeekFrom) -> Result<u64> {
123        Ok(self.stream.seek(to)?)
124    }
125
126    /// Get the current seek position.
127    pub fn stream_position(&mut self) -> Result<u64> {
128        Ok(self.stream.stream_position()?)
129    }
130
131    /// Get the length of this stream by seeking to the end
132    /// and then restoring the previous cursor position.
133    pub fn len(&mut self) -> Result<u64> {
134        stream_length(&mut self.stream)
135    }
136
137    /// Read a length-prefixed `String` from the stream.
138    pub fn read_string(&mut self) -> Result<String> {
139        let chars = if cfg!(feature = "64bit") {
140            let str_len = self.read_u64()?;
141            guard_size!(str_len, self.options.max_buffer_size);
142            let mut chars: Vec<u8> = vec![0; str_len as usize];
143            self.stream.read_exact(&mut chars)?;
144            chars
145        } else {
146            let str_len = self.read_u32()?;
147            guard_size!(str_len, self.options.max_buffer_size);
148            let mut chars: Vec<u8> = vec![0; str_len as usize];
149            self.stream.read_exact(&mut chars)?;
150            chars
151        };
152        Ok(String::from_utf8(chars)
153            .map_err(|_| Error::new(ErrorKind::Other, "invalid utf-8"))?)
154    }
155
156    /// Read a character from the stream.
157    pub fn read_char(&mut self) -> Result<char> {
158        std::char::from_u32(self.read_u32()?)
159            .ok_or_else(|| Error::new(ErrorKind::Other, "invalid character"))
160    }
161
162    /// Read a `bool` from the stream.
163    pub fn read_bool(&mut self) -> Result<bool> {
164        let value = self.read_u8()?;
165        Ok(value > 0)
166    }
167
168    /// Read a `f32` from the stream.
169    pub fn read_f32(&mut self) -> Result<f32> {
170        let mut buffer: [u8; 4] = [0; 4];
171        self.stream.read_exact(&mut buffer)?;
172        decode_endian!(self.options.endian, buffer, f32);
173    }
174
175    /// Read a `f64` from the stream.
176    pub fn read_f64(&mut self) -> Result<f64> {
177        let mut buffer: [u8; 8] = [0; 8];
178        self.stream.read_exact(&mut buffer)?;
179        decode_endian!(self.options.endian, buffer, f64);
180    }
181
182    /// Read an `isize` from the stream.
183    #[cfg(target_pointer_width = "32")]
184    pub fn read_isize(&mut self) -> Result<isize> {
185        let mut buffer: [u8; 4] = [0; 4];
186        self.stream.read_exact(&mut buffer)?;
187        decode_endian!(self.options.endian, buffer, isize);
188    }
189
190    /// Read an `isize` from the stream.
191    #[cfg(target_pointer_width = "64")]
192    pub fn read_isize(&mut self) -> Result<isize> {
193        let mut buffer: [u8; 8] = [0; 8];
194        self.stream.read_exact(&mut buffer)?;
195        decode_endian!(self.options.endian, buffer, isize);
196    }
197
198    /// Read a `usize` from the stream.
199    #[cfg(target_pointer_width = "32")]
200    pub fn read_usize(&mut self) -> Result<usize> {
201        let mut buffer: [u8; 4] = [0; 4];
202        self.stream.read_exact(&mut buffer)?;
203        decode_endian!(self.options.endian, buffer, usize);
204    }
205
206    /// Read a `usize` from the stream.
207    #[cfg(target_pointer_width = "64")]
208    pub fn read_usize(&mut self) -> Result<usize> {
209        let mut buffer: [u8; 8] = [0; 8];
210        self.stream.read_exact(&mut buffer)?;
211        decode_endian!(self.options.endian, buffer, usize);
212    }
213
214    /// Read a `u64` from the stream.
215    pub fn read_u64(&mut self) -> Result<u64> {
216        let mut buffer: [u8; 8] = [0; 8];
217        self.stream.read_exact(&mut buffer)?;
218        decode_endian!(self.options.endian, buffer, u64);
219    }
220
221    /// Read an `i64` from the stream.
222    pub fn read_i64(&mut self) -> Result<i64> {
223        let mut buffer: [u8; 8] = [0; 8];
224        self.stream.read_exact(&mut buffer)?;
225        decode_endian!(self.options.endian, buffer, i64);
226    }
227
228    /// Read a `u128` from the stream.
229    pub fn read_u128(&mut self) -> Result<u128> {
230        let mut buffer: [u8; 16] = [0; 16];
231        self.stream.read_exact(&mut buffer)?;
232        decode_endian!(self.options.endian, buffer, u128);
233    }
234
235    /// Read an `i128` from the stream.
236    pub fn read_i128(&mut self) -> Result<i128> {
237        let mut buffer: [u8; 16] = [0; 16];
238        self.stream.read_exact(&mut buffer)?;
239        decode_endian!(self.options.endian, buffer, i128);
240    }
241
242    /// Read a `u32` from the stream.
243    pub fn read_u32(&mut self) -> Result<u32> {
244        let mut buffer: [u8; 4] = [0; 4];
245        self.stream.read_exact(&mut buffer)?;
246        decode_endian!(self.options.endian, buffer, u32);
247    }
248
249    /// Read an `i32` from the stream.
250    pub fn read_i32(&mut self) -> Result<i32> {
251        let mut buffer: [u8; 4] = [0; 4];
252        self.stream.read_exact(&mut buffer)?;
253        decode_endian!(self.options.endian, buffer, i32);
254    }
255
256    /// Read a `u16` from the stream.
257    pub fn read_u16(&mut self) -> Result<u16> {
258        let mut buffer: [u8; 2] = [0; 2];
259        self.stream.read_exact(&mut buffer)?;
260        decode_endian!(self.options.endian, buffer, u16);
261    }
262
263    /// Read an `i16` from the stream.
264    pub fn read_i16(&mut self) -> Result<i16> {
265        let mut buffer: [u8; 2] = [0; 2];
266        self.stream.read_exact(&mut buffer)?;
267        decode_endian!(self.options.endian, buffer, i16);
268    }
269
270    /// Read a `u8` from the stream.
271    pub fn read_u8(&mut self) -> Result<u8> {
272        let mut buffer: [u8; 1] = [0; 1];
273        self.stream.read_exact(&mut buffer)?;
274        decode_endian!(self.options.endian, buffer, u8);
275    }
276
277    /// Read an `i8` from the stream.
278    pub fn read_i8(&mut self) -> Result<i8> {
279        let mut buffer: [u8; 1] = [0; 1];
280        self.stream.read_exact(&mut buffer)?;
281        decode_endian!(self.options.endian, buffer, i8);
282    }
283
284    /// Read bytes from the stream into a buffer.
285    pub fn read_bytes(&mut self, length: usize) -> Result<Vec<u8>> {
286        guard_size!(length, self.options.max_buffer_size);
287        let mut buffer: Vec<u8> = vec![0; length];
288        self.stream.read_exact(&mut buffer)?;
289        Ok(buffer)
290    }
291}
292
293/// Write to a stream.
294pub struct BinaryWriter<W>
295where
296    W: Write + Seek,
297{
298    stream: W,
299    options: Options,
300}
301
302impl<W: Write + Seek> BinaryWriter<W> {
303    /// Create a binary writer with the given options.
304    pub fn new(stream: W, options: Options) -> Self {
305        Self { stream, options }
306    }
307
308    /// Seek to a position.
309    pub fn seek(&mut self, to: SeekFrom) -> Result<u64> {
310        Ok(self.stream.seek(to)?)
311    }
312
313    /// Get the current seek position.
314    pub fn stream_position(&mut self) -> Result<u64> {
315        Ok(self.stream.stream_position()?)
316    }
317
318    /// Get the length of this stream by seeking to the end
319    /// and then restoring the previous cursor position.
320    pub fn len(&mut self) -> Result<u64> {
321        stream_length(&mut self.stream)
322    }
323
324    /// Write a length-prefixed `String` to the stream.
325    pub fn write_string<S: AsRef<str>>(&mut self, value: S) -> Result<usize> {
326        let bytes = value.as_ref().as_bytes();
327        guard_size!(bytes.len(), self.options.max_buffer_size);
328        if cfg!(feature = "64bit") {
329            self.write_u64(bytes.len() as u64)?;
330        } else {
331            self.write_u32(bytes.len() as u32)?;
332        }
333        Ok(self.stream.write(bytes)?)
334    }
335
336    /// Write a character to the stream.
337    pub fn write_char<V: Borrow<char>>(&mut self, v: V) -> Result<usize> {
338        self.write_u32(*v.borrow() as u32)
339    }
340
341    /// Write a `bool` to the stream.
342    pub fn write_bool<V: Borrow<bool>>(&mut self, value: V) -> Result<usize> {
343        let written = self.write_u8(if *value.borrow() { 1 } else { 0 })?;
344        Ok(written)
345    }
346
347    /// Write a `f32` to the stream.
348    pub fn write_f32<V: Borrow<f32>>(&mut self, value: V) -> Result<usize> {
349        encode_endian!(self.options.endian, value.borrow(), self.stream);
350    }
351
352    /// Write a `f64` to the stream.
353    pub fn write_f64<V: Borrow<f64>>(&mut self, value: V) -> Result<usize> {
354        encode_endian!(self.options.endian, value.borrow(), self.stream);
355    }
356
357    /// Write an `isize` to the stream.
358    pub fn write_isize<V: Borrow<isize>>(
359        &mut self,
360        value: V,
361    ) -> Result<usize> {
362        encode_endian!(self.options.endian, value.borrow(), self.stream);
363    }
364
365    /// Write a `usize` to the stream.
366    pub fn write_usize<V: Borrow<usize>>(
367        &mut self,
368        value: V,
369    ) -> Result<usize> {
370        encode_endian!(self.options.endian, value.borrow(), self.stream);
371    }
372
373    /// Write a `u64` to the stream.
374    pub fn write_u64<V: Borrow<u64>>(&mut self, value: V) -> Result<usize> {
375        encode_endian!(self.options.endian, value.borrow(), self.stream);
376    }
377
378    /// Write an `i64` to the stream.
379    pub fn write_i64<V: Borrow<i64>>(&mut self, value: V) -> Result<usize> {
380        encode_endian!(self.options.endian, value.borrow(), self.stream);
381    }
382
383    /// Write a `u128` to the stream.
384    pub fn write_u128<V: Borrow<u128>>(&mut self, value: V) -> Result<usize> {
385        encode_endian!(self.options.endian, value.borrow(), self.stream);
386    }
387
388    /// Write an `i128` to the stream.
389    pub fn write_i128<V: Borrow<i128>>(&mut self, value: V) -> Result<usize> {
390        encode_endian!(self.options.endian, value.borrow(), self.stream);
391    }
392
393    /// Write a `u32` to the stream.
394    pub fn write_u32<V: Borrow<u32>>(&mut self, value: V) -> Result<usize> {
395        encode_endian!(self.options.endian, value.borrow(), self.stream);
396    }
397
398    /// Write an `i32` to the stream.
399    pub fn write_i32<V: Borrow<i32>>(&mut self, value: V) -> Result<usize> {
400        encode_endian!(self.options.endian, value.borrow(), self.stream);
401    }
402
403    /// Write a `u16` to the stream.
404    pub fn write_u16<V: Borrow<u16>>(&mut self, value: V) -> Result<usize> {
405        encode_endian!(self.options.endian, value.borrow(), self.stream);
406    }
407
408    /// Write an `i16` to the stream.
409    pub fn write_i16<V: Borrow<i16>>(&mut self, value: V) -> Result<usize> {
410        encode_endian!(self.options.endian, value.borrow(), self.stream);
411    }
412
413    /// Write a `u8` to the stream.
414    pub fn write_u8<V: Borrow<u8>>(&mut self, value: V) -> Result<usize> {
415        encode_endian!(self.options.endian, value.borrow(), self.stream);
416    }
417
418    /// Write an `i8` to the stream.
419    pub fn write_i8<V: Borrow<i8>>(&mut self, value: V) -> Result<usize> {
420        encode_endian!(self.options.endian, value.borrow(), self.stream);
421    }
422
423    /// Write a byte buffer to the stream.
424    pub fn write_bytes<B: AsRef<[u8]>>(&mut self, data: B) -> Result<usize> {
425        guard_size!(data.as_ref().len(), self.options.max_buffer_size);
426        Ok(self.stream.write(data.as_ref())?)
427    }
428
429    /// Flush the write buffer.
430    pub fn flush(&mut self) -> Result<()> {
431        self.stream.flush()
432    }
433}
434
435/// Trait for encoding to binary.
436pub trait Encodable {
437    /// Encode self into the binary writer.
438    fn encode<W: Write + Seek>(
439        &self,
440        writer: &mut BinaryWriter<W>,
441    ) -> Result<()>;
442}
443
444/// Trait for decoding from binary.
445pub trait Decodable {
446    /// Decode from the binary reader into self.
447    fn decode<R: Read + Seek>(
448        &mut self,
449        reader: &mut BinaryReader<R>,
450    ) -> Result<()>;
451}
452
453/// Encode to a binary buffer.
454pub fn encode(
455    encodable: &impl Encodable,
456    options: Options,
457) -> Result<Vec<u8>> {
458    let mut buffer = Vec::new();
459    let mut stream = BufWriter::new(Cursor::new(&mut buffer));
460    encode_stream(encodable, &mut stream, options)?;
461    drop(stream);
462    Ok(buffer)
463}
464
465/// Decode from a binary buffer.
466pub fn decode<T: Decodable + Default>(
467    buffer: &[u8],
468    options: Options,
469) -> Result<T> {
470    let mut stream = BufReader::new(Cursor::new(buffer));
471    decode_stream::<T, _>(&mut stream, options)
472}
473
474/// Encode to a stream.
475pub fn encode_stream<S>(
476    encodable: &impl Encodable,
477    stream: &mut S,
478    options: Options,
479) -> Result<()>
480where
481    S: Write + Seek,
482{
483    let mut writer = BinaryWriter::new(stream, options);
484    encodable.encode(&mut writer)?;
485    writer.flush()?;
486    Ok(())
487}
488
489/// Decode from a stream.
490pub fn decode_stream<T: Decodable + Default, S: Read + Seek>(
491    stream: &mut S,
492    options: Options,
493) -> Result<T> {
494    let mut reader = BinaryReader::new(stream, options);
495    let mut decoded: T = T::default();
496    decoded.decode(&mut reader)?;
497    Ok(decoded)
498}
499
500impl<T> Encodable for Option<T>
501where
502    T: Encodable + Default,
503{
504    fn encode<W: Write + Seek>(
505        &self,
506        writer: &mut BinaryWriter<W>,
507    ) -> Result<()> {
508        writer.write_bool(self.is_some())?;
509        if let Some(value) = self {
510            value.encode(&mut *writer)?;
511        }
512        Ok(())
513    }
514}
515
516impl<T> Decodable for Option<T>
517where
518    T: Decodable + Default,
519{
520    fn decode<R: Read + Seek>(
521        &mut self,
522        reader: &mut BinaryReader<R>,
523    ) -> Result<()> {
524        let has_value = reader.read_bool()?;
525        if has_value {
526            let mut value: T = Default::default();
527            value.decode(&mut *reader)?;
528            *self = Some(value);
529        }
530        Ok(())
531    }
532}
533
534impl<T> Encodable for Vec<T>
535where
536    T: Encodable + Default,
537{
538    fn encode<W: Write + Seek>(
539        &self,
540        writer: &mut BinaryWriter<W>,
541    ) -> Result<()> {
542        writer.write_u32(self.len() as u32)?;
543        for item in self {
544            item.encode(&mut *writer)?;
545        }
546        Ok(())
547    }
548}
549
550impl<T> Decodable for Vec<T>
551where
552    T: Decodable + Default + Send + Sync,
553{
554    fn decode<R: Read + Seek>(
555        &mut self,
556        reader: &mut BinaryReader<R>,
557    ) -> Result<()> {
558        let len = reader.read_u32()?;
559        for _ in 0..len {
560            let mut item = T::default();
561            item.decode(&mut *reader)?;
562            self.push(item);
563        }
564        Ok(())
565    }
566}
567
568macro_rules! impl_encode_decode {
569    ($type:ty, $read:ident, $write:ident) => {
570        impl Encodable for $type {
571            fn encode<W: Write + Seek>(
572                &self,
573                writer: &mut BinaryWriter<W>,
574            ) -> Result<()> {
575                writer.$write(self)?;
576                Ok(())
577            }
578        }
579
580        impl Decodable for $type {
581            fn decode<R: Read + Seek>(
582                &mut self,
583                reader: &mut BinaryReader<R>,
584            ) -> Result<()> {
585                *self = reader.$read()?;
586                Ok(())
587            }
588        }
589    };
590}
591
592impl_encode_decode!(u8, read_u8, write_u8);
593impl_encode_decode!(u16, read_u16, write_u16);
594impl_encode_decode!(u32, read_u32, write_u32);
595impl_encode_decode!(u64, read_u64, write_u64);
596impl_encode_decode!(u128, read_u128, write_u128);
597impl_encode_decode!(usize, read_usize, write_usize);
598
599impl_encode_decode!(i8, read_i8, write_i8);
600impl_encode_decode!(i16, read_i16, write_i16);
601impl_encode_decode!(i32, read_i32, write_i32);
602impl_encode_decode!(i64, read_i64, write_i64);
603impl_encode_decode!(i128, read_i128, write_i128);
604impl_encode_decode!(isize, read_isize, write_isize);
605
606impl_encode_decode!(f32, read_f32, write_f32);
607impl_encode_decode!(f64, read_f64, write_f64);
608
609impl_encode_decode!(bool, read_bool, write_bool);
610impl_encode_decode!(char, read_char, write_char);
611impl_encode_decode!(String, read_string, write_string);
612
613#[cfg(test)]
614mod tests {
615    use super::{BinaryReader, BinaryWriter, Endian, Options};
616    use anyhow::Result;
617    use std::io::{Cursor, SeekFrom};
618    use tempfile::tempfile;
619
620    #[test]
621    fn max_buffer_size() -> Result<()> {
622        let options = Options {
623            endian: Endian::Little,
624            max_buffer_size: Some(1024),
625        };
626
627        let mut buffer = Vec::new();
628        let stream = Cursor::new(&mut buffer);
629        let mut writer = BinaryWriter::new(stream, options.clone());
630
631        let large_string = ".".repeat(2048);
632        let result = writer.write_string(&large_string);
633        assert!(result.is_err());
634
635        let large_buffer = [0u8; 2048];
636        let result = writer.write_bytes(&large_buffer);
637        assert!(result.is_err());
638
639        // Create invalid values for the read assertions
640        let mut read_string_buffer = {
641            let mut buffer = Vec::new();
642            let stream = Cursor::new(&mut buffer);
643            let mut writer = BinaryWriter::new(stream, Default::default());
644            writer.write_string(&large_string)?;
645            buffer
646        };
647
648        let mut read_bytes_buffer = {
649            let mut buffer = Vec::new();
650            let stream = Cursor::new(&mut buffer);
651            let mut writer = BinaryWriter::new(stream, Default::default());
652            writer.write_bytes(&large_buffer)?;
653            buffer
654        };
655
656        let mut stream = Cursor::new(&mut read_string_buffer);
657        let mut reader = BinaryReader::new(&mut stream, options.clone());
658        let result = reader.read_string();
659        assert!(result.is_err());
660
661        let mut stream = Cursor::new(&mut read_bytes_buffer);
662        let mut reader = BinaryReader::new(&mut stream, options.clone());
663        let result = reader.read_bytes(2048);
664        assert!(result.is_err());
665
666        Ok(())
667    }
668
669    #[test]
670    fn borrow_test() -> Result<()> {
671        let mut buffer = Vec::new();
672        let stream = Cursor::new(&mut buffer);
673
674        let mut writer = BinaryWriter::new(stream, Default::default());
675        writer.write_u8(8)?;
676        writer.write_u8(&8)?;
677        writer.write_i8(-8)?;
678        writer.write_i8(&-8)?;
679
680        writer.write_u16(16)?;
681        writer.write_u16(&16)?;
682        writer.write_i16(-16)?;
683        writer.write_i16(&-16)?;
684
685        writer.write_u32(32)?;
686        writer.write_u32(&32)?;
687        writer.write_i32(-32)?;
688        writer.write_i32(&-32)?;
689
690        writer.write_u64(64)?;
691        writer.write_u64(&64)?;
692        writer.write_i64(-64)?;
693        writer.write_i64(&-64)?;
694
695        writer.write_u128(128)?;
696        writer.write_u128(&128)?;
697        writer.write_i128(-128)?;
698        writer.write_i128(&-128)?;
699
700        writer.write_usize(64)?;
701        writer.write_usize(&64)?;
702        writer.write_isize(-64)?;
703        writer.write_isize(&-64)?;
704
705        writer.write_char('c')?;
706        writer.write_char(&'c')?;
707
708        writer.write_bool(true)?;
709        writer.write_bool(&true)?;
710
711        writer.write_string("foo")?;
712        writer.write_string(String::from("foo"))?;
713
714        let buf: Vec<u8> = vec![1, 2, 3, 4];
715        let exp: Vec<u8> = buf.clone(); // for assertion
716
717        writer.write_bytes(&buf)?;
718        writer.write_bytes(buf)?;
719
720        let mut stream = Cursor::new(&mut buffer);
721        let mut reader = BinaryReader::new(&mut stream, Default::default());
722
723        let value = (reader.read_u8()?, reader.read_u8()?);
724        assert_eq!((8, 8), value);
725        let value = (reader.read_i8()?, reader.read_i8()?);
726        assert_eq!((-8, -8), value);
727
728        let value = (reader.read_u16()?, reader.read_u16()?);
729        assert_eq!((16, 16), value);
730        let value = (reader.read_i16()?, reader.read_i16()?);
731        assert_eq!((-16, -16), value);
732
733        let value = (reader.read_u32()?, reader.read_u32()?);
734        assert_eq!((32, 32), value);
735        let value = (reader.read_i32()?, reader.read_i32()?);
736        assert_eq!((-32, -32), value);
737
738        let value = (reader.read_u64()?, reader.read_u64()?);
739        assert_eq!((64, 64), value);
740        let value = (reader.read_i64()?, reader.read_i64()?);
741        assert_eq!((-64, -64), value);
742
743        let value = (reader.read_u128()?, reader.read_u128()?);
744        assert_eq!((128, 128), value);
745        let value = (reader.read_i128()?, reader.read_i128()?);
746        assert_eq!((-128, -128), value);
747
748        let value = (reader.read_usize()?, reader.read_usize()?);
749        assert_eq!((64, 64), value);
750        let value = (reader.read_isize()?, reader.read_isize()?);
751        assert_eq!((-64, -64), value);
752
753        let value = (reader.read_char()?, reader.read_char()?);
754        assert_eq!(('c', 'c'), value);
755
756        let value = (reader.read_bool()?, reader.read_bool()?);
757        assert_eq!((true, true), value);
758
759        let value = (reader.read_string()?, reader.read_string()?);
760        assert_eq!((String::from("foo"), String::from("foo")), value);
761
762        let value = (reader.read_bytes(4)?, reader.read_bytes(4)?);
763        assert_eq!((exp.clone(), exp), value);
764
765        Ok(())
766    }
767
768    #[test]
769    fn slice_test() -> Result<()> {
770        let mut buffer = Vec::new();
771        let mut stream = Cursor::new(&mut buffer);
772
773        let mut writer = BinaryWriter::new(&mut stream, Default::default());
774        writer.write_u32(42)?;
775        writer.write_string("foo")?;
776        writer.write_char('b')?;
777
778        let mut buffer = stream.into_inner();
779
780        if cfg!(feature = "64bit") {
781            assert_eq!(19, buffer.len());
782        } else {
783            assert_eq!(15, buffer.len());
784        }
785
786        let mut stream = Cursor::new(&mut buffer);
787        let mut reader = BinaryReader::new(&mut stream, Default::default());
788
789        reader.seek(SeekFrom::Start(0))?;
790        let value = reader.read_u32()?;
791        assert_eq!(42, value);
792
793        assert_eq!(4, reader.stream_position()?);
794
795        let value = reader.read_string()?;
796        assert_eq!("foo", &value);
797
798        let value = reader.read_char()?;
799        assert_eq!('b', value);
800
801        if cfg!(feature = "64bit") {
802            assert_eq!(19, buffer.len());
803        } else {
804            assert_eq!(15, buffer.len());
805        }
806
807        Ok(())
808    }
809
810    #[test]
811    fn seek_test() -> Result<()> {
812        let temp: f32 = 50.0;
813        let seek_loc = 5u64;
814
815        let mut file = tempfile()?;
816        let mut writer = BinaryWriter::new(&mut file, Default::default());
817
818        writer.write_bytes([16; 32].to_vec())?;
819        writer.seek(SeekFrom::Start(seek_loc))?;
820        assert_eq!(writer.stream_position()?, seek_loc);
821        writer.write_f32(temp)?;
822
823        let mut reader = BinaryReader::new(&mut file, Default::default());
824        reader.seek(SeekFrom::Start(seek_loc))?;
825        assert_eq!(reader.stream_position()?, seek_loc);
826        let read_temp = reader.read_f32()?;
827
828        assert_eq!(temp, read_temp);
829
830        Ok(())
831    }
832
833    #[test]
834    fn read_write_test_f64() -> Result<()> {
835        let temp: f64 = f64::MAX;
836
837        let mut file = tempfile()?;
838        let mut writer = BinaryWriter::new(&mut file, Default::default());
839        writer.write_f64(temp)?;
840
841        writer.seek(SeekFrom::Start(0))?;
842        let mut reader = BinaryReader::new(&mut file, Default::default());
843
844        let read_temp = reader.read_f64()?;
845        assert_eq!(temp, read_temp);
846
847        Ok(())
848    }
849
850    #[test]
851    fn read_write_test_f32() -> Result<()> {
852        let temp: f32 = f32::MAX;
853
854        let mut file = tempfile()?;
855        let mut writer = BinaryWriter::new(&mut file, Default::default());
856
857        writer.write_f32(temp)?;
858
859        writer.seek(SeekFrom::Start(0))?;
860        let mut reader = BinaryReader::new(&mut file, Default::default());
861
862        let read_temp = reader.read_f32()?;
863        assert_eq!(temp, read_temp);
864
865        Ok(())
866    }
867
868    #[test]
869    fn read_write_test_isize() -> Result<()> {
870        let temp: isize = isize::MAX;
871
872        let mut file = tempfile()?;
873        let mut writer = BinaryWriter::new(&mut file, Default::default());
874
875        writer.write_isize(temp)?;
876
877        writer.seek(SeekFrom::Start(0))?;
878        let mut reader = BinaryReader::new(&mut file, Default::default());
879
880        let read_temp = reader.read_isize()?;
881        assert_eq!(temp, read_temp);
882
883        Ok(())
884    }
885
886    #[test]
887    fn read_write_test_usize() -> Result<()> {
888        let temp: usize = usize::MAX;
889
890        let mut file = tempfile()?;
891        let mut writer = BinaryWriter::new(&mut file, Default::default());
892
893        writer.write_usize(temp)?;
894
895        writer.seek(SeekFrom::Start(0))?;
896        let mut reader = BinaryReader::new(&mut file, Default::default());
897
898        let read_temp = reader.read_usize()?;
899        assert_eq!(temp, read_temp);
900
901        Ok(())
902    }
903
904    #[test]
905    fn read_write_test_i64() -> Result<()> {
906        let temp: i64 = i64::MAX;
907
908        let mut file = tempfile()?;
909        let mut writer = BinaryWriter::new(&mut file, Default::default());
910
911        writer.write_i64(temp)?;
912
913        writer.seek(SeekFrom::Start(0))?;
914        let mut reader = BinaryReader::new(&mut file, Default::default());
915
916        let read_temp = reader.read_i64()?;
917        assert_eq!(temp, read_temp);
918
919        Ok(())
920    }
921
922    #[test]
923    fn read_write_test_i128() -> Result<()> {
924        let temp: i128 = i128::MAX;
925
926        let mut file = tempfile()?;
927        let mut writer = BinaryWriter::new(&mut file, Default::default());
928
929        writer.write_i128(temp)?;
930
931        writer.seek(SeekFrom::Start(0))?;
932        let mut reader = BinaryReader::new(&mut file, Default::default());
933
934        let read_temp = reader.read_i128()?;
935        assert_eq!(temp, read_temp);
936
937        Ok(())
938    }
939
940    #[test]
941    fn read_write_test_i32() -> Result<()> {
942        let temp: i32 = i32::MAX;
943
944        let mut file = tempfile()?;
945        let mut writer = BinaryWriter::new(&mut file, Default::default());
946
947        writer.write_i32(temp)?;
948
949        writer.seek(SeekFrom::Start(0))?;
950        let mut reader = BinaryReader::new(&mut file, Default::default());
951
952        let read_temp = reader.read_i32()?;
953        assert_eq!(temp, read_temp);
954
955        Ok(())
956    }
957
958    #[test]
959    fn read_write_test_i16() -> Result<()> {
960        let temp: i16 = i16::MAX;
961
962        let mut file = tempfile()?;
963        let mut writer = BinaryWriter::new(&mut file, Default::default());
964
965        writer.write_i16(temp)?;
966
967        writer.seek(SeekFrom::Start(0))?;
968        let mut reader = BinaryReader::new(&mut file, Default::default());
969
970        let read_temp = reader.read_i16()?;
971        assert_eq!(temp, read_temp);
972
973        Ok(())
974    }
975
976    #[test]
977    fn read_write_test_i8() -> Result<()> {
978        let temp: i8 = i8::MAX;
979
980        let mut file = tempfile()?;
981        let mut writer = BinaryWriter::new(&mut file, Default::default());
982
983        writer.write_i8(temp)?;
984
985        writer.seek(SeekFrom::Start(0))?;
986        let mut reader = BinaryReader::new(&mut file, Default::default());
987
988        let read_temp = reader.read_i8()?;
989        assert_eq!(temp, read_temp);
990
991        Ok(())
992    }
993
994    #[test]
995    fn read_write_test_u64() -> Result<()> {
996        let temp: u64 = u64::MAX;
997
998        let mut file = tempfile()?;
999        let mut writer = BinaryWriter::new(&mut file, Default::default());
1000
1001        writer.write_u64(temp)?;
1002
1003        writer.seek(SeekFrom::Start(0))?;
1004        let mut reader = BinaryReader::new(&mut file, Default::default());
1005
1006        let read_temp = reader.read_u64()?;
1007        assert_eq!(temp, read_temp);
1008
1009        Ok(())
1010    }
1011
1012    #[test]
1013    fn read_write_test_u128() -> Result<()> {
1014        let temp: u128 = u128::MAX;
1015
1016        let mut file = tempfile()?;
1017        let mut writer = BinaryWriter::new(&mut file, Default::default());
1018
1019        writer.write_u128(temp)?;
1020
1021        writer.seek(SeekFrom::Start(0))?;
1022        let mut reader = BinaryReader::new(&mut file, Default::default());
1023
1024        let read_temp = reader.read_u128()?;
1025        assert_eq!(temp, read_temp);
1026
1027        Ok(())
1028    }
1029
1030    #[test]
1031    fn read_write_test_u32() -> Result<()> {
1032        let temp: u32 = u32::MAX;
1033
1034        let mut file = tempfile()?;
1035        let mut writer = BinaryWriter::new(&mut file, Default::default());
1036
1037        writer.write_u32(temp)?;
1038
1039        writer.seek(SeekFrom::Start(0))?;
1040        let mut reader = BinaryReader::new(&mut file, Default::default());
1041
1042        let read_temp = reader.read_u32()?;
1043        assert_eq!(temp, read_temp);
1044
1045        Ok(())
1046    }
1047
1048    #[test]
1049    fn read_write_test_u16() -> Result<()> {
1050        let temp: u16 = u16::MAX;
1051
1052        let mut file = tempfile()?;
1053        let mut writer = BinaryWriter::new(&mut file, Default::default());
1054
1055        writer.write_u16(temp)?;
1056
1057        writer.seek(SeekFrom::Start(0))?;
1058        let mut reader = BinaryReader::new(&mut file, Default::default());
1059
1060        let read_temp = reader.read_u16()?;
1061        assert_eq!(temp, read_temp);
1062
1063        Ok(())
1064    }
1065
1066    #[test]
1067    fn read_write_test_u8() -> Result<()> {
1068        let temp: u8 = u8::MAX;
1069
1070        let mut file = tempfile()?;
1071        let mut writer = BinaryWriter::new(&mut file, Default::default());
1072
1073        writer.write_u8(temp)?;
1074
1075        writer.seek(SeekFrom::Start(0))?;
1076        let mut reader = BinaryReader::new(&mut file, Default::default());
1077
1078        let read_temp = reader.read_u8()?;
1079        assert_eq!(temp, read_temp);
1080
1081        Ok(())
1082    }
1083
1084    #[test]
1085    fn read_write_bytes() -> Result<()> {
1086        let count = 20;
1087
1088        let temp = vec![16; count];
1089
1090        let mut file = tempfile()?;
1091        let mut writer = BinaryWriter::new(&mut file, Default::default());
1092
1093        writer.write_bytes(temp.clone())?;
1094
1095        writer.seek(SeekFrom::Start(0))?;
1096        let mut reader = BinaryReader::new(&mut file, Default::default());
1097
1098        let read_temp = reader.read_bytes(count)?;
1099        assert_eq!(temp, read_temp);
1100
1101        Ok(())
1102    }
1103
1104    #[test]
1105    fn read_out_of_range() -> Result<()> {
1106        let mut file = tempfile()?;
1107        let mut writer = BinaryWriter::new(&mut file, Default::default());
1108        writer.write_f32(5.0)?;
1109
1110        writer.seek(SeekFrom::Start(0))?;
1111        let mut reader = BinaryReader::new(&mut file, Default::default());
1112        reader.read_f32()?;
1113
1114        assert!(reader.read_f32().is_err());
1115
1116        Ok(())
1117    }
1118
1119    #[test]
1120    fn read_write_string() -> Result<()> {
1121        let temp = "Hello World";
1122
1123        let mut file = tempfile()?;
1124        let mut writer = BinaryWriter::new(&mut file, Default::default());
1125        writer.write_string(temp.to_string())?;
1126
1127        writer.seek(SeekFrom::Start(0))?;
1128        let mut reader = BinaryReader::new(&mut file, Default::default());
1129        let string = reader.read_string()?;
1130        assert_eq!(temp, string);
1131
1132        Ok(())
1133    }
1134
1135    #[test]
1136    fn read_write_test_bool() -> Result<()> {
1137        let positive = true;
1138        let negative = false;
1139
1140        let mut file = tempfile()?;
1141        let mut writer = BinaryWriter::new(&mut file, Default::default());
1142
1143        writer.write_bool(positive)?;
1144        writer.write_bool(negative)?;
1145
1146        writer.seek(SeekFrom::Start(0))?;
1147        let mut reader = BinaryReader::new(&mut file, Default::default());
1148
1149        let read_positive = reader.read_bool()?;
1150        let read_negative = reader.read_bool()?;
1151        assert_eq!(positive, read_positive);
1152        assert_eq!(negative, read_negative);
1153
1154        Ok(())
1155    }
1156
1157    #[test]
1158    fn read_write_from_memorystream() -> Result<()> {
1159        let value_a = 3.0;
1160        let value_b = 5.0;
1161        let mut buffer = Vec::new();
1162        let mut stream = Cursor::new(&mut buffer);
1163
1164        let mut writer = BinaryWriter::new(&mut stream, Default::default());
1165        writer.write_f32(value_a)?;
1166        writer.write_f32(value_b)?;
1167
1168        let mut reader = BinaryReader::new(&mut stream, Default::default());
1169        reader.seek(SeekFrom::Start(0))?;
1170        let value = reader.read_f32()?;
1171        assert_eq!(value_a, value);
1172        let value = reader.read_f32()?;
1173        assert_eq!(value_b, value);
1174
1175        Ok(())
1176    }
1177
1178    #[test]
1179    fn write_to_memorystream_overlapping() -> Result<()> {
1180        let mut buffer = Vec::new();
1181        let mut stream = Cursor::new(&mut buffer);
1182
1183        let mut writer = BinaryWriter::new(&mut stream, Default::default());
1184        writer.write_f32(1.0)?;
1185        writer.write_f32(2.0)?;
1186        writer.write_f32(3.0)?;
1187
1188        writer.seek(SeekFrom::Start(0))?;
1189        writer.write_f32(4.0)?;
1190        writer.write_f32(5.0)?;
1191        writer.write_f32(6.0)?;
1192
1193        let mut reader = BinaryReader::new(&mut stream, Default::default());
1194        reader.seek(SeekFrom::Start(0))?;
1195        let value = reader.read_f32()?;
1196        assert_eq!(4.0, value);
1197        let value = reader.read_f32()?;
1198        assert_eq!(5.0, value);
1199        let value = reader.read_f32()?;
1200        assert_eq!(6.0, value);
1201
1202        Ok(())
1203    }
1204
1205    /*
1206    #[test]
1207    fn write_to_memorystream_into_vec() -> Result<()> {
1208        let mut buffer = Vec::new();
1209        let mut stream = Cursor::new(&mut buffer);
1210        let mut writer = BinaryWriter::new(&mut stream, Default::default());
1211        writer.write_f32(1.0)?;
1212        assert_eq!(4, buffer.len());
1213        Ok(())
1214    }
1215    */
1216
1217    #[test]
1218    fn write_to_filestream_overlapping() -> Result<()> {
1219        let mut file = tempfile()?;
1220        let mut writer = BinaryWriter::new(&mut file, Default::default());
1221        writer.write_f32(1.0)?;
1222        writer.write_f32(2.0)?;
1223        writer.write_f32(3.0)?;
1224
1225        writer.seek(SeekFrom::Start(0))?;
1226        writer.write_f32(4.0)?;
1227        writer.write_f32(5.0)?;
1228        writer.write_f32(6.0)?;
1229
1230        //let file = std::fs::File::open("filestream_overlapping.test")?;
1231
1232        writer.seek(SeekFrom::Start(0))?;
1233        let mut reader = BinaryReader::new(&mut file, Default::default());
1234        let value = reader.read_f32()?;
1235        assert_eq!(4.0, value);
1236        let value = reader.read_f32()?;
1237        assert_eq!(5.0, value);
1238        let value = reader.read_f32()?;
1239        assert_eq!(6.0, value);
1240
1241        assert_eq!(12, file.metadata()?.len());
1242
1243        Ok(())
1244    }
1245}