use clap::{Parser, Subcommand};
use gpio_utils::commands::*;
use gpio_utils::config::{self, GpioConfig};
use gpio_utils::options::*;
use std::process;
pub const CONFIG_ENV_VAR: &str = "GPIO_UTILS_CONFIG";
pub const SYMLINK_ROOT_ENV_VAR: &str = "GPIO_UTILS_SYMLINK_ROOT";
#[derive(Debug, Parser)]
#[command(
name = "GPIO Utils",
version,
about = "Read, Write, and Configure GPIOs"
)]
struct Cli {
#[arg(short, long = "config", value_name = "FILE", num_args = 0.., env = CONFIG_ENV_VAR, value_delimiter = ':')]
configs: Vec<String>,
#[command(subcommand)]
command: Commands,
}
#[derive(Debug, Subcommand)]
enum Commands {
Read {
pin: String,
},
Poll {
pin: String,
#[arg(short, long)]
timeout: Option<isize>,
#[arg(short, long)]
edge: Option<String>,
},
Write {
pin: String,
value: u8,
},
Export {
pin: String,
#[arg(short = 'r', long, env = SYMLINK_ROOT_ENV_VAR)]
symlink_root: Option<String>,
},
ExportAll {
#[arg(short = 'r', long, env = SYMLINK_ROOT_ENV_VAR)]
symlink_root: Option<String>,
},
Unexport {
pin: String,
#[arg(short = 'r', long, env = SYMLINK_ROOT_ENV_VAR)]
symlink_root: Option<String>,
},
UnexportAll {
#[arg(short = 'r', long, env = SYMLINK_ROOT_ENV_VAR)]
symlink_root: Option<String>,
},
Status {
pin: Option<String>,
},
}
fn main() {
env_logger::init();
let cli = Cli::parse();
let gpio_opts = GpioOptions {
configs: cli.configs.clone(),
};
let cfg = match GpioConfig::load(&gpio_opts.configs[..]) {
Ok(cfg) => cfg,
Err(config::Error::NoConfigFound) => Default::default(),
Err(e) => {
println!("Error parsing config. Details follow...");
println!("{}", e);
process::exit(1);
}
};
match cli.command {
Commands::Read { pin } => {
let options = GpioReadOptions {
gpio_opts,
pin: &pin,
};
gpio_read::main(&cfg, &options);
}
Commands::Poll { pin, timeout, edge } => {
let options = GpioPollOptions {
gpio_opts,
timeout,
edge: &edge.unwrap_or_else(|| String::from("both")),
pin: &pin,
};
gpio_poll::main(&cfg, &options);
}
Commands::Write { pin, value } => {
let options = GpioWriteOptions {
gpio_opts,
pin: &pin,
value,
};
gpio_write::main(&cfg, &options);
}
Commands::Export { pin, symlink_root } => {
let options = GpioExportOptions {
gpio_opts,
pin: &pin,
symlink_root: symlink_root.as_deref(),
};
gpio_export::main(&cfg, &options);
}
Commands::ExportAll { symlink_root } => {
let options = GpioExportAllOptions {
gpio_opts,
symlink_root: symlink_root.as_deref(),
};
gpio_exportall::main(&cfg, &options);
}
Commands::Unexport { pin, symlink_root } => {
let options = GpioUnexportOptions {
gpio_opts,
pin: &pin,
symlink_root: symlink_root.as_deref(),
};
gpio_unexport::main(&cfg, &options);
}
Commands::UnexportAll { symlink_root } => {
let options = GpioUnexportAllOptions {
gpio_opts,
symlink_root: symlink_root.as_deref(),
};
gpio_unexportall::main(&cfg, &options);
}
Commands::Status { pin } => {
let options = GpioStatusOptions {
gpio_opts,
pin: pin.as_deref(),
};
gpio_status::main(&cfg, &options);
}
}
}