diff --git a/src/args.rs b/src/args.rs index e2bbde3..7ebc013 100644 --- a/src/args.rs +++ b/src/args.rs @@ -70,6 +70,8 @@ pub enum GetSmsCommands { /// ID of the message to show. msg_id: usize, }, + /// Show SMS storage usage and settings. + Info, } #[derive(Subcommand, Debug)] diff --git a/src/main.rs b/src/main.rs index 53d6b39..a5c8da5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -22,6 +22,9 @@ async fn main() -> EyreResult<()> { GetCommands::Sms { command: Some(GetSmsCommands::Show { msg_id }), } => router.show_sms(msg_id).await?, + GetCommands::Sms { + command: Some(GetSmsCommands::Info), + } => router.show_sms_info().await?, GetCommands::Syslog => router.show_syslog().await?, GetCommands::Airtime => router.show::().await?, GetCommands::Power => router.show_multi::().await?, diff --git a/src/proc_get.rs b/src/proc_get.rs index 4ead0f5..4794149 100644 --- a/src/proc_get.rs +++ b/src/proc_get.rs @@ -141,6 +141,74 @@ impl Show for Message { } } +#[derive(Debug, Deserialize)] +pub struct SmsCapacity { + #[serde(deserialize_with = "de::from_str")] + pub sms_nv_total: usize, + #[serde(deserialize_with = "de::from_str")] + pub sms_nv_rev_total: usize, + #[serde(deserialize_with = "de::from_str")] + pub sms_nv_send_total: usize, + #[serde(deserialize_with = "de::from_str")] + pub sms_nv_draftbox_total: usize, +} + +impl SmsCapacity { + fn used(&self) -> usize { + self.sms_nv_rev_total + self.sms_nv_send_total + self.sms_nv_draftbox_total + } +} + +impl ProcGet for SmsCapacity { + const CMD: &str = "sms_capacity_info"; + type Params = (); +} + +#[derive(Debug, Deserialize)] +pub struct SmsParameters { + pub sms_para_sca: BoxStr, + #[serde(deserialize_with = "de::flag")] + pub sms_para_status_report: bool, + pub default_store: SmsStore, +} + +impl ProcGet for SmsParameters { + const CMD: &str = "sms_parameter_info"; + type Params = (); +} + +#[derive(Debug)] +pub struct SmsSettings { + pub capacity: SmsCapacity, + pub parameters: SmsParameters, +} + +impl Show for SmsSettings { + fn show(&self) -> EyreResult<()> { + let capacity = &self.capacity; + let parameters = &self.parameters; + + let mut table = create_table(); + + table + .set_header(["SMS", "Value"]) + .add_row([ + "Messages", + &format!("{} / {}", capacity.used(), capacity.sms_nv_total), + ]) + .add_row(["SMSC", or_dash(¶meters.sms_para_sca)]) + .add_row([ + "Delivery Reports", + yes_no(parameters.sms_para_status_report), + ]) + .add_row(["Default Store", ¶meters.default_store.to_string()]); + + println!("{table}"); + + Ok(()) + } +} + #[derive(Debug, Deserialize)] pub struct AirtimeBalance { /// Cached USSD text like "Airtime balance Br. 2247.50. SMS will be diff --git a/src/router.rs b/src/router.rs index f773a5f..773aab7 100644 --- a/src/router.rs +++ b/src/router.rs @@ -302,6 +302,17 @@ impl Router { .show() } + pub async fn show_sms_info(&self) -> EyreResult<()> { + let capacity = self.get::().await?; + let parameters = self.get::().await?; + + SmsSettings { + capacity, + parameters, + } + .show() + } + pub async fn delete_all_sms(&self) -> EyreResult<()> { let messages = self.get::().await?.messages; if messages.is_empty() { diff --git a/src/types.rs b/src/types.rs index 82a9041..93587c2 100644 --- a/src/types.rs +++ b/src/types.rs @@ -336,6 +336,35 @@ impl std::fmt::Display for MessageStatus { } } +/// Where the router saves new SMS (`default_store`): "nv" (device) or "sim". +#[derive(Debug, Clone)] +pub enum SmsStore { + Device, + Sim, + Other(BoxStr), +} + +impl<'de> Deserialize<'de> for SmsStore { + fn deserialize>(deserializer: D) -> Result { + let raw = BoxStr::deserialize(deserializer)?; + Ok(match raw.as_ref() { + "nv" => Self::Device, + "sim" => Self::Sim, + _ => Self::Other(raw), + }) + } +} + +impl std::fmt::Display for SmsStore { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::Device => write!(f, "Device"), + Self::Sim => write!(f, "SIM"), + Self::Other(store) => write!(f, "{store}"), + } + } +} + /// The firmware build stamp in "YYYY-MM-DD_HH:MM" format ("2025-02-19_13:59"). #[derive(Debug, Clone)] pub struct BuildTime(jiff::civil::DateTime);