use std::collections::BTreeMap;
use serde::Deserialize;
use crate::event::PieMode;
#[derive(Deserialize, Clone, Debug, Default)]
pub struct RunConfig {
#[serde(default)]
pub name: Option<String>,
#[serde(default = "one")]
pub instances: u32,
#[serde(default)]
pub env: BTreeMap<String, String>,
#[serde(default)]
pub args: Vec<String>,
#[serde(default)]
pub cwd: Option<String>,
#[serde(default)]
pub mode: PieMode,
}
fn one() -> u32 {
1
}
impl RunConfig {
pub fn label(&self) -> &str {
self.name.as_deref().unwrap_or("Play")
}
}
#[derive(Deserialize, Clone, Debug, Default)]
pub struct Manifest {
#[serde(default)]
pub plugin: Option<String>,
#[serde(default, rename = "run")]
pub runs: Vec<RunConfig>,
}
impl Manifest {
pub fn run_by_name(&self, label: &str) -> Option<&RunConfig> {
self.runs.iter().find(|r| r.label() == label)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn label_and_defaults() {
let m: Manifest = toml::from_str(
r#"[[run]]
name = "My Game""#,
)
.unwrap();
assert_eq!(m.runs[0].label(), "My Game");
assert_eq!(m.runs[0].instances, 1);
assert_eq!(m.runs[0].mode, PieMode::Play);
assert!(m.plugin.is_none());
}
#[test]
fn full_entry_parses() {
let m: Manifest = toml::from_str(
r#"
plugin = "MyGamePlugin"
[[run]]
name = "Client"
instances = 4
env = { ADDR = "127.0.0.1:5000" }
"#,
)
.unwrap();
assert_eq!(m.plugin.as_deref(), Some("MyGamePlugin"));
assert_eq!(m.runs[0].label(), "Client");
assert_eq!(m.runs[0].instances, 4);
assert_eq!(m.runs[0].env.get("ADDR").unwrap(), "127.0.0.1:5000");
assert_eq!(m.run_by_name("Client").unwrap().instances, 4);
}
#[test]
fn editor_preview_mode_parses() {
let m: Manifest = toml::from_str(
r#"[[run]]
mode = "editor-preview""#,
)
.unwrap();
assert_eq!(m.runs[0].mode, PieMode::EditorPreview);
}
}