68 lines
1.7 KiB
Rust
68 lines
1.7 KiB
Rust
mod burning;
|
|
mod consumers;
|
|
mod data_sessions;
|
|
mod media;
|
|
mod power;
|
|
mod profiles;
|
|
mod programs;
|
|
mod recovery;
|
|
mod server;
|
|
mod software;
|
|
use clap::Parser;
|
|
use fds_common::{Error, Result, topology};
|
|
use std::{path::PathBuf, process::ExitCode};
|
|
|
|
#[derive(Parser)]
|
|
#[command(
|
|
version = env!("FDS_BUILD_VERSION"),
|
|
about = "Run the root cartridge service or inspect USB topology"
|
|
)]
|
|
struct Cli {
|
|
/// Notify s6 when the service is ready.
|
|
#[arg(long, conflicts_with = "topology")]
|
|
notify: bool,
|
|
/// Inspect topology without starting the service or mounting devices.
|
|
#[arg(long, value_name = "SYSFS_ROOT")]
|
|
topology: Option<PathBuf>,
|
|
}
|
|
fn run() -> Result<()> {
|
|
let cli = Cli::parse();
|
|
if let Some(sys) = cli.topology {
|
|
println!(
|
|
"{}",
|
|
serde_json::to_string_pretty(&topology::devices(&sys)?)
|
|
.map_err(|e| Error(e.to_string()))?
|
|
);
|
|
Ok(())
|
|
} else {
|
|
server::run(cli.notify)
|
|
}
|
|
}
|
|
fn main() -> ExitCode {
|
|
match run() {
|
|
Ok(()) => ExitCode::SUCCESS,
|
|
Err(e) => {
|
|
eprintln!("fds-cartridged: {e}");
|
|
ExitCode::FAILURE
|
|
}
|
|
}
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod cli_tests {
|
|
use super::*;
|
|
use clap::{CommandFactory, Parser};
|
|
#[test]
|
|
fn typed_command_contract() {
|
|
Cli::command().debug_assert();
|
|
assert!(!Cli::try_parse_from(["fds-cartridged"]).unwrap().notify);
|
|
assert!(
|
|
Cli::try_parse_from(["fds-cartridged", "--notify"])
|
|
.unwrap()
|
|
.notify
|
|
);
|
|
assert!(Cli::try_parse_from(["fds-cartridged", "--topology", "/sys"]).is_ok());
|
|
assert!(Cli::try_parse_from(["fds-cartridged", "--notify", "--topology", "/sys"]).is_err());
|
|
}
|
|
}
|