Skip to main content

mint_core/layout/
settings.rs

1use super::value::ValueSource;
2use serde::Deserialize;
3use std::collections::HashMap;
4
5/// Top-level `[mint]` configuration section.
6#[derive(Debug, Deserialize)]
7#[serde(deny_unknown_fields)]
8pub struct MintConfig {
9    pub endianness: Endianness,
10    #[serde(default)]
11    pub checksum: HashMap<String, ChecksumConfig>,
12    #[serde(rename = "const", default)]
13    pub consts: HashMap<String, ValueSource>,
14}
15
16#[derive(Debug, Deserialize, Clone, Copy)]
17#[serde(rename_all = "lowercase")]
18pub enum Endianness {
19    Little,
20    Big,
21}
22
23/// Named checksum algorithm configuration, referenced by leaf entries via `checksum = "name"`.
24/// All fields are required — no inheritance or merging.
25#[derive(Debug, Deserialize, Clone)]
26#[serde(deny_unknown_fields)]
27pub struct ChecksumConfig {
28    pub polynomial: u32,
29    pub start: u32,
30    pub xor_out: u32,
31    pub ref_in: bool,
32    pub ref_out: bool,
33}
34
35pub trait EndianBytes {
36    fn to_endian_bytes(self, endianness: &Endianness) -> Vec<u8>;
37}
38
39macro_rules! impl_endian_bytes {
40    ($($t:ty),* $(,)?) => {$(
41        impl EndianBytes for $t {
42            fn to_endian_bytes(self, e: &Endianness) -> Vec<u8> {
43                match e {
44                    Endianness::Little => self.to_le_bytes().to_vec(),
45                    Endianness::Big => self.to_be_bytes().to_vec(),
46                }
47            }
48        }
49    )*};
50}
51impl_endian_bytes!(u8, u16, u32, u64, i8, i16, i32, i64, f32, f64);