psdk_fruit_emapi/
payload.rs1use crate::{
2 endian::{read_uint32, uint16, uint32},
3 error::{EmapiError, Result},
4};
5
6pub struct EmapiPayload;
7
8impl EmapiPayload {
9 pub fn uint8(value: u8) -> Vec<u8> {
10 vec![value]
11 }
12
13 pub fn uint16(value: u16) -> Vec<u8> {
14 uint16(value).to_vec()
15 }
16
17 pub fn uint32(value: u32) -> Vec<u8> {
18 uint32(value).to_vec()
19 }
20
21 pub fn read_uint32(data: &[u8]) -> Result<u32> {
22 if data.len() != 4 {
23 return Err(EmapiError::Range {
24 name: "data.length",
25 min: 4,
26 max: 4,
27 value: data.len() as u64,
28 });
29 }
30 read_uint32(data, 0)
31 }
32
33 pub fn file_chunk(index: u32, data: &[u8]) -> Result<Vec<u8>> {
34 if index < 1 || index > u32::from(u16::MAX) {
35 return Err(EmapiError::Range {
36 name: "index",
37 min: 1,
38 max: u64::from(u16::MAX),
39 value: u64::from(index),
40 });
41 }
42 if data.len() > usize::from(u16::MAX) {
43 return Err(EmapiError::Range {
44 name: "data.length",
45 min: 0,
46 max: u64::from(u16::MAX),
47 value: data.len() as u64,
48 });
49 }
50
51 let mut payload = Vec::with_capacity(4 + data.len());
52 payload.extend_from_slice(&uint16(index as u16));
53 payload.extend_from_slice(&uint16(data.len() as u16));
54 payload.extend_from_slice(data);
55 Ok(payload)
56 }
57}