Skip to main content

boytacean_common/
data.rs

1//! Data manipulation utilities for reading and writing primitive types.
2//!
3//! This module provides functions to read and write various primitive data types
4//! (such as u8, i8, u16, i16, u32, i32, u64, i64, f32) from and to byte streams.
5//! It also includes functions to read and write byte arrays and strings.
6
7use std::{
8    io::{Read, Write},
9    mem::size_of,
10};
11
12use crate::error::Error;
13
14#[inline(always)]
15pub fn read_u8<R: Read>(reader: &mut R) -> Result<u8, Error> {
16    let mut buffer = [0x00; size_of::<u8>()];
17    reader.read_exact(&mut buffer)?;
18    Ok(u8::from_le_bytes(buffer))
19}
20
21#[inline(always)]
22pub fn read_i8<R: Read>(reader: &mut R) -> Result<i8, Error> {
23    let mut buffer = [0x00; size_of::<i8>()];
24    reader.read_exact(&mut buffer)?;
25    Ok(i8::from_le_bytes(buffer))
26}
27
28#[inline(always)]
29pub fn read_u16<R: Read>(reader: &mut R) -> Result<u16, Error> {
30    let mut buffer = [0x00; size_of::<u16>()];
31    reader.read_exact(&mut buffer)?;
32    Ok(u16::from_le_bytes(buffer))
33}
34
35#[inline(always)]
36pub fn read_i16<R: Read>(reader: &mut R) -> Result<i16, Error> {
37    let mut buffer = [0x00; size_of::<i16>()];
38    reader.read_exact(&mut buffer)?;
39    Ok(i16::from_le_bytes(buffer))
40}
41
42#[inline(always)]
43pub fn read_u32<R: Read>(reader: &mut R) -> Result<u32, Error> {
44    let mut buffer = [0x00; size_of::<u32>()];
45    reader.read_exact(&mut buffer)?;
46    Ok(u32::from_le_bytes(buffer))
47}
48
49#[inline(always)]
50pub fn read_i32<R: Read>(reader: &mut R) -> Result<i32, Error> {
51    let mut buffer = [0x00; size_of::<i32>()];
52    reader.read_exact(&mut buffer)?;
53    Ok(i32::from_le_bytes(buffer))
54}
55
56#[inline(always)]
57pub fn read_u64<R: Read>(reader: &mut R) -> Result<u64, Error> {
58    let mut buffer = [0x00; size_of::<u64>()];
59    reader.read_exact(&mut buffer)?;
60    Ok(u64::from_le_bytes(buffer))
61}
62
63#[inline(always)]
64pub fn read_i64<R: Read>(reader: &mut R) -> Result<i64, Error> {
65    let mut buffer = [0x00; size_of::<i64>()];
66    reader.read_exact(&mut buffer)?;
67    Ok(i64::from_le_bytes(buffer))
68}
69
70#[inline(always)]
71pub fn read_f32<R: Read>(reader: &mut R) -> Result<f32, Error> {
72    let mut buffer = [0x00; size_of::<f32>()];
73    reader.read_exact(&mut buffer)?;
74    Ok(f32::from_le_bytes(buffer))
75}
76
77#[inline(always)]
78pub fn read_bytes<R: Read>(reader: &mut R, count: usize) -> Result<Vec<u8>, Error> {
79    let mut buffer = vec![0; count];
80    reader.read_exact(&mut buffer)?;
81    Ok(buffer)
82}
83
84#[inline(always)]
85pub fn read_string<R: Read>(reader: &mut R, count: usize) -> Result<String, Error> {
86    let buffer = read_bytes(reader, count)?;
87    Ok(String::from_utf8(buffer)?)
88}
89
90#[inline(always)]
91pub fn read_into<R: Read>(reader: &mut R, buffer: &mut [u8]) -> Result<(), Error> {
92    reader.read_exact(buffer)?;
93    Ok(())
94}
95
96#[inline(always)]
97pub fn write_u8<W: Write>(writer: &mut W, value: u8) -> Result<(), Error> {
98    writer.write_all(&value.to_le_bytes())?;
99    Ok(())
100}
101
102#[inline(always)]
103pub fn write_i8<W: Write>(writer: &mut W, value: i8) -> Result<(), Error> {
104    writer.write_all(&value.to_le_bytes())?;
105    Ok(())
106}
107
108#[inline(always)]
109pub fn write_u16<W: Write>(writer: &mut W, value: u16) -> Result<(), Error> {
110    writer.write_all(&value.to_le_bytes())?;
111    Ok(())
112}
113
114#[inline(always)]
115pub fn write_i16<W: Write>(writer: &mut W, value: i16) -> Result<(), Error> {
116    writer.write_all(&value.to_le_bytes())?;
117    Ok(())
118}
119
120#[inline(always)]
121pub fn write_u32<W: Write>(writer: &mut W, value: u32) -> Result<(), Error> {
122    writer.write_all(&value.to_le_bytes())?;
123    Ok(())
124}
125
126#[inline(always)]
127pub fn write_i32<W: Write>(writer: &mut W, value: i32) -> Result<(), Error> {
128    writer.write_all(&value.to_le_bytes())?;
129    Ok(())
130}
131
132#[inline(always)]
133pub fn write_u64<W: Write>(writer: &mut W, value: u64) -> Result<(), Error> {
134    writer.write_all(&value.to_le_bytes())?;
135    Ok(())
136}
137
138#[inline(always)]
139pub fn write_i64<W: Write>(writer: &mut W, value: i64) -> Result<(), Error> {
140    writer.write_all(&value.to_le_bytes())?;
141    Ok(())
142}
143
144#[inline(always)]
145pub fn write_f32<W: Write>(writer: &mut W, value: f32) -> Result<(), Error> {
146    writer.write_all(&value.to_le_bytes())?;
147    Ok(())
148}
149
150#[inline(always)]
151pub fn write_bytes<W: Write>(writer: &mut W, value: &[u8]) -> Result<(), Error> {
152    writer.write_all(value)?;
153    Ok(())
154}
155
156#[inline(always)]
157pub fn write_string<W: Write>(writer: &mut W, value: &str) -> Result<(), Error> {
158    write_bytes(writer, value.as_bytes())
159}