mint_cli/layout/
settings.rs

1use serde::Deserialize;
2
3#[derive(Debug, Deserialize)]
4pub struct Settings {
5    pub endianness: Endianness,
6    #[serde(default = "default_offset")]
7    pub virtual_offset: u32,
8    #[serde(default)]
9    pub byte_swap: bool,
10    #[serde(default)]
11    pub pad_to_end: bool,
12    pub crc: Option<CrcData>,
13}
14
15#[derive(Debug, Deserialize, Clone, Copy)]
16#[serde(rename_all = "lowercase")]
17pub enum Endianness {
18    Little,
19    Big,
20}
21
22#[derive(Debug, Deserialize, Clone, Copy, PartialEq, Eq)]
23pub enum CrcArea {
24    #[serde(rename = "data")]
25    Data,
26    #[serde(rename = "block_zero_crc")]
27    BlockZeroCrc,
28    #[serde(rename = "block_pad_crc")]
29    BlockPadCrc,
30    #[serde(rename = "block_omit_crc")]
31    BlockOmitCrc,
32}
33
34#[derive(Debug, Deserialize, Clone)]
35pub struct CrcData {
36    pub polynomial: u32,
37    pub start: u32,
38    pub xor_out: u32,
39    pub ref_in: bool,
40    pub ref_out: bool,
41    pub area: CrcArea,
42}
43
44fn default_offset() -> u32 {
45    0
46}
47
48pub trait EndianBytes {
49    fn to_endian_bytes(self, endianness: &Endianness) -> Vec<u8>;
50}
51
52macro_rules! impl_endian_bytes {
53    ($($t:ty),* $(,)?) => {$(
54        impl EndianBytes for $t {
55            fn to_endian_bytes(self, e: &Endianness) -> Vec<u8> {
56                match e {
57                    Endianness::Little => self.to_le_bytes().to_vec(),
58                    Endianness::Big => self.to_be_bytes().to_vec(),
59                }
60            }
61        }
62    )*};
63}
64impl_endian_bytes!(u8, u16, u32, u64, i8, i16, i32, i64, f32, f64);