use busylib::model::settings::HttpAccess;
use busylib::types::access_key::AccessKey;
use busylib::types::brightness::Brightness;
use busylib::types::device_name::DeviceName;
use busylib::types::volume::Volume;
use clap::Subcommand;
use crate::cli::Context;
use crate::error::{CliError, Result};
use crate::reporter::{
OkEvent, SettingsAccessEvent, SettingsBrightnessEvent, SettingsNameEvent, SettingsVolumeEvent,
};
use crate::types::access_mode_arg::AccessModeArg;
#[derive(Debug, Subcommand)]
pub enum SettingsCommand {
Access,
SetAccess {
#[arg(value_enum, value_name = "MODE")]
mode: AccessModeArg,
#[arg(long, short = 'k', value_name = "KEY", required_if_eq("mode", "key"))]
key: Option<AccessKey>,
},
Name,
SetName {
#[arg(value_name = "NAME")]
name: DeviceName,
},
Volume,
SetVolume {
#[arg(value_name = "PERCENT")]
volume: Volume,
#[arg(long)]
silent: bool,
},
Brightness,
SetBrightness {
#[arg(value_name = "VALUE")]
value: Brightness,
},
}
impl SettingsCommand {
pub async fn run(self, context: &Context) -> Result<()> {
match self {
SettingsCommand::Access => access(context).await,
SettingsCommand::SetAccess { mode, key } => set_access(context, mode, key).await,
SettingsCommand::Name => name(context).await,
SettingsCommand::SetName { name } => set_name(context, name).await,
SettingsCommand::Volume => volume(context).await,
SettingsCommand::SetVolume { volume, silent } => {
set_volume(context, volume, silent).await
}
SettingsCommand::Brightness => brightness(context).await,
SettingsCommand::SetBrightness { value } => set_brightness(context, value).await,
}
}
}
async fn access(context: &Context) -> Result<()> {
let access = context.client.settings().access().await?;
context.reporter.report(SettingsAccessEvent::new(access))?;
Ok(())
}
async fn set_access(context: &Context, mode: AccessModeArg, key: Option<AccessKey>) -> Result<()> {
let access = match (mode, key) {
(AccessModeArg::Disabled, _) => HttpAccess::Disabled,
(AccessModeArg::Enabled, _) => HttpAccess::Enabled,
(AccessModeArg::Key, Some(key)) => HttpAccess::Key(key),
(AccessModeArg::Key, None) => {
return Err(CliError::Usage("--key is required for the key mode"));
}
};
context.client.settings().set_access(&access).await?;
context
.reporter
.report(OkEvent::new("settings set-access"))?;
Ok(())
}
async fn name(context: &Context) -> Result<()> {
let name = context.client.settings().name().await?;
context.reporter.report(SettingsNameEvent::new(name))?;
Ok(())
}
async fn set_name(context: &Context, name: DeviceName) -> Result<()> {
context.client.settings().set_name(name).await?;
context.reporter.report(OkEvent::new("settings set-name"))?;
Ok(())
}
async fn volume(context: &Context) -> Result<()> {
let volume = context.client.settings().volume().await?;
context.reporter.report(SettingsVolumeEvent::new(volume))?;
Ok(())
}
async fn set_volume(context: &Context, volume: Volume, silent: bool) -> Result<()> {
context.client.settings().set_volume(volume, silent).await?;
context
.reporter
.report(OkEvent::new("settings set-volume"))?;
Ok(())
}
async fn brightness(context: &Context) -> Result<()> {
let brightness = context.client.settings().brightness().await?;
context
.reporter
.report(SettingsBrightnessEvent::new(brightness))?;
Ok(())
}
async fn set_brightness(context: &Context, value: Brightness) -> Result<()> {
context.client.settings().set_brightness(value).await?;
context
.reporter
.report(OkEvent::new("settings set-brightness"))?;
Ok(())
}