mint_cli/layout/
settings.rs1use 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);