use super::net_handle;
pub(crate) mod ops {
use serde_json::Value;
use crate::error::{Error, Result};
use crate::wire::{unit, usb_command, CommandResponse, Op};
fn parse_port_state(resp: CommandResponse) -> Result<bool> {
match resp.state.as_ref() {
Some(Value::String(s)) => Ok(s == "enabled"),
other => Err(Error::Decode(format!(
"expected \"enabled\"/\"disabled\" state, got {other:?}"
))),
}
}
pub(crate) fn enable(name: &str) -> Op<()> {
Op {
req: usb_command(name, "enable"),
parse: unit,
}
}
pub(crate) fn disable(name: &str) -> Op<()> {
Op {
req: usb_command(name, "disable"),
parse: unit,
}
}
pub(crate) fn toggle(name: &str) -> Op<bool> {
Op {
req: usb_command(name, "toggle"),
parse: parse_port_state,
}
}
pub(crate) fn state(name: &str) -> Op<bool> {
Op {
req: usb_command(name, "state"),
parse: parse_port_state,
}
}
}
net_handle! {
sync: UsbPort,
async: AsyncUsbPort,
methods: {
fn enable() -> () = ops::enable;
fn disable() -> () = ops::disable;
fn toggle() -> bool = ops::toggle;
fn state() -> bool = ops::state;
}
}