Skip to main content

psdk_fruit_emapi/
payload.rs

1use 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}