Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions src/args.rs
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,11 @@ pub enum Commands {
/// Show the full path to the virtual filesystem.
Vfs,

/// Access device config.
#[command(subcommand)]
#[clap(alias("conf"), alias("settings"))]
Config(ConfigCommands),

/// Control a running device or emulator.
Runtime(RuntimeArgs),

Expand Down Expand Up @@ -318,6 +323,20 @@ pub struct RuntimeArgs {
pub command: RuntimeCommands,
}

#[derive(Debug, Parser)]
pub enum ConfigCommands {
/// Get config as JSON.
#[clap(alias("list"), alias("dump"), alias("export"), alias("json"))]
Get(ConfigGetArgs),
}

#[derive(Debug, Parser)]
pub struct ConfigGetArgs {
/// Option name to get.
#[arg(default_value = None)]
pub key: Option<String>,
}

#[derive(Debug, Parser)]
pub enum RuntimeCommands {
/// Send a cheat code.
Expand Down
3 changes: 3 additions & 0 deletions src/cli.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@ pub fn run_command(vfs: PathBuf, command: &Commands) -> anyhow::Result<()> {
CatalogCommands::List(args) => cmd_catalog_list(args),
CatalogCommands::Show(args) => cmd_catalog_show(args),
},
Config(command) => match command {
ConfigCommands::Get(args) => cmd_config_get(&vfs, args),
},
Runtime(root_args) => match &root_args.command {
RuntimeCommands::Launch(args) => cmd_launch(root_args, args),
RuntimeCommands::Restart => cmd_restart(root_args),
Expand Down
72 changes: 72 additions & 0 deletions src/commands/config.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
use crate::args::ConfigGetArgs;
use anyhow::{Context, Result, bail};
use firefly_types::Encode;
use std::path::Path;

pub fn cmd_config_get(vfs: &Path, args: &ConfigGetArgs) -> Result<()> {
if !vfs.exists() {
bail!("vfs is not created yet")
}
let settings_path = vfs.join("sys").join("config");
if !settings_path.exists() {
bail!("settings file not found")
}
let raw = std::fs::read(settings_path).context("read settings")?;
let s = firefly_types::Settings::decode(&raw).context("parse settings")?;

if let Some(key) = &args.key {
match key.as_str() {
"xp" => println!("{}", s.xp),
"badges" => println!("{}", s.badges),
"country" => println!("{}", p(&s.country)),
"lang" => println!("{}", p(&s.lang)),
"name" => println!("{}", s.name),
"timezone" => println!("{}", s.timezone),
"auto_lock" => println!("{}", s.auto_lock),
"font_size" => println!("{}", s.font_size),
"headphones_volume" => println!("{}", s.headphones_volume),
"leds_brightness" => println!("{}", s.leds_brightness),
"screen_brightness" => println!("{}", s.screen_brightness),
"speakers_volume" => println!("{}", s.speakers_volume),
"contrast" => println!("{}", s.contrast),
"easter_eggs" => println!("{}", s.easter_eggs),
"gamepad_mode" => println!("{}", s.gamepad_mode),
"reduce_flashing" => println!("{}", s.reduce_flashing),
"rotate_screen" => println!("{}", s.rotate_screen),
"telemetry" => println!("{}", s.telemetry),
_ => bail!("unsupported key"),
}
return Ok(());
}

println!("{{");
println!(r#" "xp": {},"#, s.xp);
println!(r#" "badges": {},"#, s.badges);
println!(r#" "country": "{}","#, p(&s.country));
println!(r#" "lang": "{}","#, p(&s.lang));
println!(r#" "name": "{}","#, s.name);
println!(r#" "timezone": "{}","#, s.timezone);

println!();
println!(r#" "auto_lock": {:>3},"#, s.auto_lock);
println!(r#" "font_size": {:>3},"#, s.font_size);
println!(r#" "headphones_volume": {:>3},"#, s.headphones_volume);
println!(r#" "leds_brightness": {:>3},"#, s.leds_brightness);
println!(r#" "screen_brightness": {:>3},"#, s.screen_brightness);
println!(r#" "speakers_volume": {:>3},"#, s.speakers_volume);

println!();
println!(r#" "contrast": {},"#, s.contrast);
println!(r#" "easter_eggs": {},"#, s.easter_eggs);
println!(r#" "gamepad_mode": {},"#, s.gamepad_mode);
println!(r#" "reduce_flashing": {},"#, s.reduce_flashing);
println!(r#" "rotate_screen": {},"#, s.rotate_screen);
println!(r#" "telemetry": {}"#, s.telemetry);

println!("}}");
Ok(())
}

fn p(r: &[u8]) -> &str {
str::from_utf8(r).unwrap_or_default()
}
2 changes: 2 additions & 0 deletions src/commands/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ mod boards;
mod build;
mod catalog;
mod cheat;
mod config;
mod emulator;
mod export;
mod import;
Expand All @@ -23,6 +24,7 @@ pub use boards::cmd_boards;
pub use build::cmd_build;
pub use catalog::{cmd_catalog_list, cmd_catalog_show};
pub use cheat::cmd_cheat;
pub use config::cmd_config_get;
pub use emulator::cmd_emulator;
pub use export::cmd_export;
pub use import::cmd_import;
Expand Down
Loading