ds_decomp/config/
config.rs

1use 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    /// Name of module
40    pub name: String,
41    /// Binary file to build
42    pub object: PathBuf,
43    /// 64-bit fxhash of the binary file
44    pub hash: String,
45    /// Path to delinks file
46    pub delinks: PathBuf,
47    /// Path to symbols file
48    pub symbols: PathBuf,
49    /// Path to relocs file
50    pub relocations: PathBuf,
51}
52
53#[derive(Serialize, Deserialize)]
54pub struct ConfigOverlay {
55    pub id: u16,
56    #[serde(flatten)]
57    pub module: ConfigModule,
58}
59
60#[derive(Serialize, Deserialize)]
61pub struct ConfigAutoload {
62    pub kind: AutoloadKind,
63    #[serde(flatten)]
64    pub module: ConfigModule,
65}