Skip to main content

ds_decomp/config/
link_time_const.rs

1use std::{backtrace::Backtrace, fmt::Display};
2
3use serde::{Deserialize, Serialize};
4use snafu::Snafu;
5use strum_macros::EnumIter;
6
7use crate::config::ParseContext;
8
9#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize, EnumIter)]
10pub enum LinkTimeConst {
11    DtcmLo,
12    ItcmHi,
13    CodeHi,
14    OverlayCount,
15    Arm9CtorStart,
16}
17
18#[derive(Debug, Snafu)]
19pub enum LinkTimeConstParseError {
20    #[snafu(display(
21        "{context}: unknown link-time constant '{value}', must be one of:
22        __DTCM_LO, __ITCM_HI, __CODE_HI, __OVERLAY_COUNT, ARM9_CTOR_START:
23        {backtrace}"
24    ))]
25    UnknownKind { context: ParseContext, value: String, backtrace: Backtrace },
26}
27
28impl LinkTimeConst {
29    pub(crate) fn parse(
30        value: &str,
31        context: &ParseContext,
32    ) -> Result<Self, LinkTimeConstParseError> {
33        match value {
34            "__DTCM_LO" => Ok(Self::DtcmLo),
35            "__ITCM_HI" => Ok(Self::ItcmHi),
36            "__CODE_HI" => Ok(Self::CodeHi),
37            "__OVERLAY_COUNT" => Ok(Self::OverlayCount),
38            "ARM9_CTOR_START" => Ok(Self::Arm9CtorStart),
39            _ => UnknownKindSnafu { context, value }.fail(),
40        }
41    }
42}
43
44impl Display for LinkTimeConst {
45    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
46        match self {
47            LinkTimeConst::DtcmLo => write!(f, "__DTCM_LO"),
48            LinkTimeConst::ItcmHi => write!(f, "__ITCM_HI"),
49            LinkTimeConst::CodeHi => write!(f, "__CODE_HI"),
50            LinkTimeConst::OverlayCount => write!(f, "__OVERLAY_COUNT"),
51            LinkTimeConst::Arm9CtorStart => write!(f, "ARM9_CTOR_START"),
52        }
53    }
54}