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: 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")]
27    Block,
28}
29
30#[derive(Debug, Deserialize)]
31pub struct CrcData {
32    pub polynomial: u32,
33    pub start: u32,
34    pub xor_out: u32,
35    pub ref_in: bool,
36    pub ref_out: bool,
37    pub area: CrcArea,
38}
39
40fn default_offset() -> u32 {
41    0
42}
43
44pub trait EndianBytes {
45    fn to_endian_bytes(self, endianness: &Endianness) -> Vec<u8>;
46}
47
48macro_rules! impl_endian_bytes {
49    ($($t:ty),* $(,)?) => {$(
50        impl EndianBytes for $t {
51            fn to_endian_bytes(self, e: &Endianness) -> Vec<u8> {
52                match e {
53                    Endianness::Little => self.to_le_bytes().to_vec(),
54                    Endianness::Big => self.to_be_bytes().to_vec(),
55                }
56            }
57        }
58    )*};
59}
60impl_endian_bytes!(u8, u16, u32, u64, i8, i16, i32, i64, f32, f64);