jbytes/lib.rs
1//!
2//! ```
3//! use jbytes::{ByteEncode, ByteDecode};
4//! use jbytes_derive::{ByteEncode, ByteDecode};
5//!
6//!
7//! #[derive(Debug, PartialEq, Eq, ByteEncode, ByteDecode)]
8//! pub struct SimpleExample {
9//! pub length: u16,
10//! #[jbytes(length="length")]
11//! pub value: String,
12//! pub cmd: u8,
13//! #[jbytes(branch="cmd")]
14//! pub body: SimpleExampleBody,
15//! }
16//!
17//!
18//! #[derive(Debug, PartialEq, Eq, ByteEncode, ByteDecode)]
19//! pub enum SimpleExampleBody {
20//! #[jbytes(branch_value=1)]
21//! Read {
22//! address: u8,
23//! },
24//! Write {
25//! address: u8,
26//! value: [u8; 3],
27//! },
28//! #[jbytes(branch_default)]
29//! Unknown,
30//! }
31//!
32//!
33//! fn main() {
34//! let input = b"\x00\x03\x31\x32\x33\x01\x05";
35//! let value: SimpleExample = jbytes::decode(input).unwrap();
36//! assert_eq!(value, SimpleExample { length: 3, value: "123".to_string(), cmd: 1, body: SimpleExampleBody::Read { address: 5 } });
37//! assert_eq!(*jbytes::encode(value).unwrap(), input);
38//! }
39//! ```
40#![allow(clippy::needless_borrow)]
41
42#![cfg_attr(not(feature = "std"), no_std)]
43
44#[cfg(not(feature = "std"))]
45extern crate alloc;
46
47#[cfg(feature = "jbytes_derive")]
48#[allow(unused_imports)]
49#[macro_use]
50extern crate jbytes_derive;
51
52#[cfg(feature = "jbytes_derive")]
53pub use jbytes_derive::{ByteDecode, ByteEncode, BorrowByteDecode, BorrowByteEncode};
54
55
56#[cfg(feature = "jdefault_derive")]
57extern crate jdefault_derive;
58#[cfg(feature = "jdefault_derive")]
59pub use jdefault_derive::Jdefault;
60
61#[cfg(feature = "jget")]
62pub use jget::Jget;
63
64
65pub mod errors;
66pub mod buffer;
67pub mod bytes;
68pub mod buf_mut_traits;
69pub mod buf_traits;
70pub mod std;
71mod impls;
72
73pub mod modifiers;
74pub mod byteorder;
75pub mod decode;
76pub mod encode;
77pub mod types;
78
79pub use buffer::Buffer;
80pub use bytes::{Bytes, ToBytes};
81pub use buf_mut_traits::{BufReadMut, BufWriteMut};
82pub use buf_traits::{BufRead, BufWrite};
83pub use errors::{JResult, ErrorKind, make_error};
84
85pub use modifiers::{ContainerAttrModifiers, FieldAttrModifiers, get_byteorder};
86pub use byteorder::ByteOrder;
87pub use decode::{ByteDecode, BorrowByteDecode};
88pub use encode::{ByteEncode, BorrowByteEncode};
89
90pub mod prelude {
91 pub use crate::buffer::Buffer;
92 pub use crate::bytes::{Bytes, ToBytes};
93 pub use crate::buf_mut_traits::{BufReadMut, BufWriteMut};
94 pub use crate::buf_traits::{BufRead, BufWrite};
95 pub use crate::errors::{JResult, ErrorKind, make_error};
96
97 pub use crate::modifiers::{ContainerAttrModifiers, FieldAttrModifiers, get_byteorder};
98 pub use crate::byteorder::ByteOrder;
99 pub use crate::decode::{ByteDecode, BorrowByteDecode};
100 pub use crate::encode::{ByteEncode, BorrowByteEncode};
101
102 pub use crate::types::{MacAddress, NetAddress, HexString, HexBytes};
103
104 #[cfg(feature = "jbytes_derive")]
105 pub use jbytes_derive::{ByteDecode, ByteEncode, BorrowByteDecode, BorrowByteEncode};
106
107 #[cfg(feature = "jdefault_derive")]
108 pub use jdefault_derive::Jdefault;
109}
110
111
112/// This is a decode function of byte stream.
113///
114/// # Example
115///
116/// ```
117/// use jbytes_derive::{ByteEncode, ByteDecode};
118///
119///
120/// #[derive(Debug, PartialEq, Eq, ByteEncode, ByteDecode)]
121/// pub struct SimpleExample {
122/// pub length: u16,
123/// #[jbytes(length="length")]
124/// pub value: String,
125/// pub cmd: u8,
126/// #[jbytes(branch="cmd")]
127/// pub body: SimpleExampleBody,
128/// }
129///
130///
131/// #[derive(Debug, PartialEq, Eq, ByteEncode, ByteDecode)]
132/// pub enum SimpleExampleBody {
133/// #[jbytes(branch_value=1)]
134/// Read {
135/// address: u8,
136/// },
137/// Write {
138/// address: u8,
139/// value: [u8; 3],
140/// },
141/// #[jbytes(branch_default)]
142/// Unknown,
143/// }
144///
145///
146/// fn main() {
147/// let input = b"\x00\x03\x31\x32\x33\x01\x05";
148/// let value: SimpleExample = jbytes::decode(input).unwrap();
149/// assert_eq!(value, SimpleExample { length: 3, value: "123".to_string(), cmd: 1, body: SimpleExampleBody::Read { address: 5 } });
150/// assert_eq!(*jbytes::encode(value).unwrap(), input);
151/// }
152/// ```
153#[inline]
154pub fn decode<I: AsRef<[u8]>, T: ByteDecode>(input: I) -> JResult<T> {
155 T::decode_inner(&Bytes::new(input), None, None)
156}
157
158
159/// This is a decode function of byte stream.
160///
161/// # Example
162///
163/// ```rust
164/// use jbytes_derive::{BorrowByteEncode, BorrowByteDecode};
165/// use jbytes::prelude::*;
166///
167///
168/// #[derive(Debug, Default, PartialEq, Eq, BorrowByteEncode, BorrowByteDecode)]
169/// pub struct Http<'a> {
170/// #[jbytes(linend=b"\x20")]
171/// pub method: &'a str,
172/// #[jbytes(linend=b"\x20")]
173/// pub uri: &'a str,
174/// #[jbytes(linend=b"\r\n")]
175/// pub version: &'a str,
176/// #[jbytes(try_count=20)]
177/// pub headers: Vec<HttpHeader<'a>>,
178/// }
179///
180///
181/// #[derive(Debug, Default, PartialEq, Eq, BorrowByteEncode, BorrowByteDecode)]
182/// pub struct HttpHeader<'a> {
183/// #[jbytes(linend=b": ")]
184/// pub key: &'a str,
185/// #[jbytes(linend=b"\r\n")]
186/// pub value: &'a str,
187/// }
188///
189///
190/// fn main() {
191/// // decode
192/// let data = b"GET http://www.jankincai.com/ HTTP/1.1\r\nHost: www.jankincai.com\r\nAccept-Encoding: gzip, deflate\r\n";
193/// let bytes = Bytes::new(data);
194/// let value: Http = jbytes::decode_borrow(&bytes).unwrap();
195/// println!("{value:?}");
196
197/// // encode
198/// assert_eq!(*jbytes::encode_borrow(value).unwrap(), data);
199/// }
200/// ```
201#[inline]
202pub fn decode_borrow<'de, I: AsRef<[u8]>, T: BorrowByteDecode<'de>>(input: &'de Bytes<I>) -> JResult<T> {
203 T::decode_inner(input, None, None)
204}
205
206
207#[inline]
208pub fn decode_borrow2<'de, I: BufRead, T: BorrowByteDecode<'de>>(input: &'de I) -> JResult<T> {
209 T::decode_inner(input, None, None)
210}
211
212
213/// This is a encode function of byte stream.
214///
215/// # Example
216///
217/// ```
218/// use jbytes_derive::{ByteEncode, ByteDecode};
219///
220///
221/// #[derive(Debug, PartialEq, Eq, ByteEncode, ByteDecode)]
222/// pub struct SimpleExample {
223/// pub length: u16,
224/// #[jbytes(length="length")]
225/// pub value: String,
226/// pub cmd: u8,
227/// #[jbytes(branch="cmd")]
228/// pub body: SimpleExampleBody,
229/// }
230///
231///
232/// #[derive(Debug, PartialEq, Eq, ByteEncode, ByteDecode)]
233/// pub enum SimpleExampleBody {
234/// #[jbytes(branch_value=1)]
235/// Read {
236/// address: u8,
237/// },
238/// Write {
239/// address: u8,
240/// value: [u8; 3],
241/// },
242/// #[jbytes(branch_default)]
243/// Unknown,
244/// }
245///
246///
247/// fn main() {
248/// let input = b"\x00\x03\x31\x32\x33\x01\x05";
249/// let value: SimpleExample = jbytes::decode(input).unwrap();
250/// assert_eq!(value, SimpleExample { length: 3, value: "123".to_string(), cmd: 1, body: SimpleExampleBody::Read { address: 5 } });
251/// assert_eq!(*jbytes::encode(value).unwrap(), input);
252/// }
253/// ```
254#[inline]
255pub fn encode<T: ByteEncode>(t: T) -> JResult<Buffer> {
256 let mut buf = Buffer::new();
257
258 t.encode_inner(&mut buf, None, None)?;
259
260 Ok(buf)
261}
262
263
264/// This is a encode function of byte stream.
265///
266/// # Example
267///
268/// ```rust
269/// use jbytes_derive::{BorrowByteEncode, BorrowByteDecode};
270/// use jbytes::prelude::*;
271///
272///
273/// #[derive(Debug, Default, PartialEq, Eq, BorrowByteEncode, BorrowByteDecode)]
274/// pub struct Http<'a> {
275/// #[jbytes(linend=b"\x20")]
276/// pub method: &'a str,
277/// #[jbytes(linend=b"\x20")]
278/// pub uri: &'a str,
279/// #[jbytes(linend=b"\r\n")]
280/// pub version: &'a str,
281/// #[jbytes(try_count=20)]
282/// pub headers: Vec<HttpHeader<'a>>,
283/// }
284///
285///
286/// #[derive(Debug, Default, PartialEq, Eq, BorrowByteEncode, BorrowByteDecode)]
287/// pub struct HttpHeader<'a> {
288/// #[jbytes(linend=b": ")]
289/// pub key: &'a str,
290/// #[jbytes(linend=b"\r\n")]
291/// pub value: &'a str,
292/// }
293///
294///
295/// fn main() {
296/// // decode
297/// let data = b"GET http://www.jankincai.com/ HTTP/1.1\r\nHost: www.jankincai.com\r\nAccept-Encoding: gzip, deflate\r\n";
298/// let bytes = Bytes::new(data);
299/// let value: Http = jbytes::decode_borrow(&bytes).unwrap();
300/// println!("{value:?}");
301
302/// // encode
303/// assert_eq!(*jbytes::encode_borrow(value).unwrap(), data);
304/// }
305/// ```
306#[inline]
307pub fn encode_borrow<T: BorrowByteEncode>(t: T) -> JResult<Buffer> {
308 let mut buf = Buffer::new();
309
310 t.encode_inner(&mut buf, None, None)?;
311
312 Ok(buf)
313}