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}