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(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}