diff --git a/src/file_builders/mod.rs b/src/file_builders/mod.rs index de1b005..24f87e0 100644 --- a/src/file_builders/mod.rs +++ b/src/file_builders/mod.rs @@ -1,3 +1,4 @@ pub mod active_runtime_json; pub mod openvrpaths_vrpath; pub mod wivrn_config; +pub mod monado_autorun; diff --git a/src/file_builders/monado_autorun.rs b/src/file_builders/monado_autorun.rs new file mode 100644 index 0000000..180d53a --- /dev/null +++ b/src/file_builders/monado_autorun.rs @@ -0,0 +1,75 @@ +use expect_dialog::ExpectDialog; +use serde::{Deserialize, Serialize}; + +use crate::file_utils::{deserialize_file, get_writer, get_xdg_config_dir}; + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct MonadoAutorun { + pub exec: String, + pub args: Vec, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct MonadoAutorunConfig { + #[serde(skip_serializing_if = "Option::is_none", rename = "$schema")] + _schema: Option, + pub autoruns: Vec, +} + +impl Default for MonadoAutorunConfig { + fn default() -> Self { + Self { + _schema: Some( + "https://monado.pages.freedesktop.org/monado/autorun_v0.schema.json".into(), + ), + autoruns: vec![], + } + } +} + +fn get_monado_autorun_config_path() -> String { + format!( + "{config}/monado/autorun_v0.json", + config = get_xdg_config_dir() + ) +} + +fn get_monado_autorun_config_from_path(path_s: &String) -> Option { + deserialize_file(path_s) +} + +pub fn get_monado_autorun_config() -> MonadoAutorunConfig { + get_monado_autorun_config_from_path(&get_monado_autorun_config_path()) + .unwrap_or(MonadoAutorunConfig::default()) +} + +fn dump_monado_autorun_config_to_path(config: &MonadoAutorunConfig, path_s: &String) { + let writer = get_writer(path_s); + serde_json::to_writer_pretty(writer, config) + .expect_dialog("Unable to save Monado Autorun config"); +} + +pub fn dump_monado_autorun_config(config: &MonadoAutorunConfig) { + dump_monado_autorun_config_to_path(config, &get_monado_autorun_config_path()); +} + +#[cfg(test)] +mod tests { + use super::get_monado_autorun_config_from_path; + + #[test] + fn can_read_monado_autorun_config() { + let conf = + get_monado_autorun_config_from_path(&"./test/files/monado_autorun_config.json".into()) + .expect("Could not find monado autorun config"); + assert_eq!( + conf._schema, + Some("https://monado.pages.freedesktop.org/monado/autorun_v0.schema.json".into()) + ); + assert_eq!(conf.autoruns.len(), 1); + assert_eq!(conf.autoruns.get(0).unwrap().exec, "foobar"); + assert_eq!(conf.autoruns.get(0).unwrap().args.len(), 2); + assert_eq!(conf.autoruns.get(0).unwrap().args.get(0).unwrap(), "bar"); + assert_eq!(conf.autoruns.get(0).unwrap().args.get(1).unwrap(), "baz"); + } +} diff --git a/test/files/monado_autorun_config.json b/test/files/monado_autorun_config.json new file mode 100644 index 0000000..d85c589 --- /dev/null +++ b/test/files/monado_autorun_config.json @@ -0,0 +1,9 @@ +{ + "$schema": "https://monado.pages.freedesktop.org/monado/autorun_v0.schema.json", + "autoruns": [ + { + "exec": "foobar", + "args": ["bar", "baz"] + } + ] +}