ds_decomp/config/
config.rs1use std::{
2 backtrace::Backtrace,
3 path::{Path, PathBuf},
4};
5
6use ds_rom::rom::raw::AutoloadKind;
7use serde::{Deserialize, Serialize};
8use snafu::Snafu;
9
10use crate::util::io::{open_file, FileError};
11
12#[derive(Serialize, Deserialize)]
13pub struct Config {
14 pub rom_config: PathBuf,
15 pub build_path: PathBuf,
16 pub delinks_path: PathBuf,
17 pub main_module: ConfigModule,
18 pub autoloads: Vec<ConfigAutoload>,
19 pub overlays: Vec<ConfigOverlay>,
20}
21
22#[derive(Debug, Snafu)]
23pub enum ConfigParseError {
24 #[snafu(transparent)]
25 File { source: FileError },
26 #[snafu(display("Failed to parse dsd config file '{}': {error}\n{backtrace}", path.display()))]
27 SerdeYml { path: PathBuf, error: serde_yml::Error, backtrace: Backtrace },
28}
29
30impl Config {
31 pub fn from_file(path: &Path) -> Result<Config, ConfigParseError> {
32 let file = open_file(path)?;
33 serde_yml::from_reader(file).map_err(|error| SerdeYmlSnafu { path, error }.build())
34 }
35}
36
37#[derive(Serialize, Deserialize)]
38pub struct ConfigModule {
39 pub name: String,
41 pub object: PathBuf,
43 pub hash: String,
45 pub delinks: PathBuf,
47 pub symbols: PathBuf,
49 pub relocations: PathBuf,
51}
52
53#[derive(Serialize, Deserialize)]
54pub struct ConfigOverlay {
55 pub id: u16,
56 #[serde(default = "default_overlay_signed", skip_serializing_if = "skip_overlay_signed")]
57 pub signed: bool,
58 #[serde(flatten)]
59 pub module: ConfigModule,
60}
61
62fn default_overlay_signed() -> bool {
63 false
64}
65
66fn skip_overlay_signed(signed: &bool) -> bool {
67 *signed == default_overlay_signed()
68}
69
70#[derive(Serialize, Deserialize)]
71pub struct ConfigAutoload {
72 pub kind: AutoloadKind,
73 #[serde(flatten)]
74 pub module: ConfigModule,
75}