1#![cfg_attr(all(doc, CHANNEL_NIGHTLY), feature(doc_auto_cfg))]
2#![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#[derive(Clone, Copy)]
66pub enum Endian {
67 Big,
69 Little,
71}
72
73impl Default for Endian {
74 fn default() -> Self {
75 Self::Little
76 }
77}
78
79#[derive(Clone, Default)]
81pub struct Options {
82 pub endian: Endian,
84 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
97pub 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
106pub struct BinaryReader<R>
108where
109 R: Read + Seek,
110{
111 stream: R,
112 options: Options,
113}
114
115impl<R: Read + Seek> BinaryReader<R> {
116 pub fn new(stream: R, options: Options) -> Self {
118 Self { stream, options }
119 }
120
121 pub fn seek(&mut self, to: SeekFrom) -> Result<u64> {
123 Ok(self.stream.seek(to)?)
124 }
125
126 pub fn stream_position(&mut self) -> Result<u64> {
128 Ok(self.stream.stream_position()?)
129 }
130
131 pub fn len(&mut self) -> Result<u64> {
134 stream_length(&mut self.stream)
135 }
136
137 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 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 pub fn read_bool(&mut self) -> Result<bool> {
164 let value = self.read_u8()?;
165 Ok(value > 0)
166 }
167
168 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 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 #[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 #[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 #[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 #[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 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 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 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 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 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 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 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 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 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 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 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
293pub struct BinaryWriter<W>
295where
296 W: Write + Seek,
297{
298 stream: W,
299 options: Options,
300}
301
302impl<W: Write + Seek> BinaryWriter<W> {
303 pub fn new(stream: W, options: Options) -> Self {
305 Self { stream, options }
306 }
307
308 pub fn seek(&mut self, to: SeekFrom) -> Result<u64> {
310 Ok(self.stream.seek(to)?)
311 }
312
313 pub fn stream_position(&mut self) -> Result<u64> {
315 Ok(self.stream.stream_position()?)
316 }
317
318 pub fn len(&mut self) -> Result<u64> {
321 stream_length(&mut self.stream)
322 }
323
324 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 pub fn write_char<V: Borrow<char>>(&mut self, v: V) -> Result<usize> {
338 self.write_u32(*v.borrow() as u32)
339 }
340
341 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 pub fn flush(&mut self) -> Result<()> {
431 self.stream.flush()
432 }
433}
434
435pub trait Encodable {
437 fn encode<W: Write + Seek>(
439 &self,
440 writer: &mut BinaryWriter<W>,
441 ) -> Result<()>;
442}
443
444pub trait Decodable {
446 fn decode<R: Read + Seek>(
448 &mut self,
449 reader: &mut BinaryReader<R>,
450 ) -> Result<()>;
451}
452
453pub 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
465pub 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
474pub 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
489pub 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 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(); 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 #[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 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}