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: 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);