ds_decomp/config/
link_time_const.rs1use 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}