firedbg_cli/
cfg.rs

1use serde::{Deserialize, Serialize};
2use std::collections::BTreeMap;
3
4#[derive(Debug, Clone, PartialEq, Eq, Default, Deserialize)]
5pub struct Config {
6    pub workspace: Workspace,
7}
8
9#[derive(Debug, Clone, PartialEq, Eq, Default, Deserialize)]
10pub struct Workspace {
11    pub members: BTreeMap<String, Member>,
12}
13
14#[derive(Debug, Clone, PartialEq, Eq, Default, Deserialize)]
15pub struct Member {
16    #[serde(default)]
17    pub trace: Trace,
18}
19
20#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Deserialize)]
21#[serde(rename_all = "kebab-case")]
22pub enum Trace {
23    #[default]
24    None,
25    CallOnly,
26    Full,
27}
28
29impl Trace {
30    pub fn to_str(&self) -> &str {
31        match self {
32            Trace::None => "none",
33            Trace::CallOnly => "call-only",
34            Trace::Full => "full",
35        }
36    }
37}
38
39#[derive(Debug, Clone, PartialEq, Eq, Default, Serialize, Deserialize)]
40pub struct Version {
41    pub firedbg_cli: String,
42}
43
44#[cfg(test)]
45mod test {
46    use super::*;
47    use pretty_assertions::assert_eq;
48
49    #[test]
50    fn firedbg_toml_parsing() -> anyhow::Result<()> {
51        let config: Config = toml::from_str(
52            r#"
53            [workspace.members]
54            sea-query = { trace = "full" }
55            main-one = { trace = "call-only" } 
56            main-two = { trace = "none" } 
57            shared = {}
58        "#,
59        )?;
60
61        assert_eq!(config.workspace.members["sea-query"].trace, Trace::Full);
62        assert_eq!(config.workspace.members["main-one"].trace, Trace::CallOnly);
63        assert_eq!(config.workspace.members["main-two"].trace, Trace::None);
64        assert_eq!(config.workspace.members["shared"].trace, Trace::None);
65
66        Ok(())
67    }
68}