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}