From 6fe5d22745d455c0c43c50ee0c39009eadef081d Mon Sep 17 00:00:00 2001 From: candifloss Date: Sun, 22 Sep 2024 15:48:27 +0530 Subject: [PATCH] Got rson working, added format and verbose options --- Cargo.toml | 3 ++- src/formats/rson.rs | 22 ++++++++--------- src/main.rs | 59 +++++++++++++++++++++++++++++++++------------ src/notification.rs | 4 +-- 4 files changed, 57 insertions(+), 31 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 8622a5e..cc90b6d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snot" -version = "0.1.0" +version = "0.1.1" edition = "2021" authors = ["candifloss "] @@ -9,5 +9,6 @@ zbus = "4.4.0" zvariant = "4.2.0" tokio = { version = "1.40.0", features = ["full"] } futures-util = "0.3.30" +serde = { version = "1.0", features = ["derive"] } serde_json = "1.0.128" rson_rs = "0.2.1" \ No newline at end of file diff --git a/src/formats/rson.rs b/src/formats/rson.rs index cebe5d2..d9420e0 100644 --- a/src/formats/rson.rs +++ b/src/formats/rson.rs @@ -1,21 +1,19 @@ // This module deals with converting the notification object into rson format, which can be used instead of json if preferred use crate::notification::Notification; -use rson_rs::ser::to_string; -use rson_rs::value::Value; -use rson_rs::value::Value::Map; +use rson_rs::ser::to_string as rson_string; impl Notification { - pub fn actions_rson(&self) -> Value { + pub fn actions_rson(&self) -> String { if self.actions().is_empty() { - Value::from_str("{actions: Null}") + String::new() } else { - // Wrap the map into a rson_rs::value::Value - self.actions() - .iter() - .map(|(id, label)| { - (id.clone(), Value::from_str(label)) // Create key-value pairs: id -> label - }) - .collect::>() // Collect into a rson_rs::value::Value::Map + rson_string(&self.actions()).unwrap() } } + pub fn hints_rson(&self) -> String { + rson_string(&self.hints()).unwrap() + } + pub fn rson(&self) -> String { + rson_string(&self).unwrap() + } } diff --git a/src/main.rs b/src/main.rs index b25b0df..753bf17 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1,7 @@ pub mod formats { pub mod json; pub mod plain; - //pub mod rson; + pub mod rson; } mod notification; use notification::{to_notif, Notification}; @@ -32,12 +32,18 @@ fn server_properties() -> HashMap { #[tokio::main] async fn main() -> Result<()> { let args: Vec = env::args().collect(); - let op_format: String = if args.is_empty() || args[1] == "j" { - "j".to_string() // Default value, json format + let op_format: &str = if args.is_empty() || args[1] == "j" { + "j" // Default value, json format + } else if args[1] == "p" { + "p" // Plain format + } else if args[1] == "r" { + "r" // rson format } else { - "p".to_string() // Plain format + "j" }; + let verbose: bool = (args.len() > 2) && (args[2] == "v"); + let connection = Connection::session().await?; connection .request_name(NOTIF_INTERFACE) // Requesting dbus for this service name. Any other services/procs using this name should be stopped/disabled before this @@ -64,9 +70,13 @@ async fn main() -> Result<()> { let properties = server_properties(); // Reply with the properties connection.reply(&msg, &properties).await?; - println!("GetAll request received for interface: {interface_name}"); + if verbose { + println!("GetAll request received for interface: {interface_name}"); + } } else { - println!("Unknown interface requested: {interface_name}"); + if verbose { + println!("Unknown interface requested: {interface_name}"); + } // Reply with an error connection .reply_error( @@ -81,15 +91,19 @@ async fn main() -> Result<()> { // Client requested server information. Respond with: (Server_name, author, software_version, dbus_spec_version) let response = (SERVER_NAME, VENDOR, VERSION, SPEC_VERSION); connection.reply(&msg, &response).await?; - println!("Request received: {member}\n\tName: {SERVER_NAME}, Vendor: {VENDOR}, Version: {VERSION}, DBus spec version: {SPEC_VERSION}"); - // Remove this LATER + if verbose { + println!("Request received: {member}\n\tName: {SERVER_NAME}, Vendor: {VENDOR}, Version: {VERSION}, DBus spec version: {SPEC_VERSION}"); + // Remove this LATER + } } "GetCapabilities" => { // Client requested server capabilities. Respond with the supported capabilities let capabilities = vec!["actions", "body", "body-hyperlinks"]; // Add more LATER connection.reply(&msg, &capabilities).await?; - println!("Request received: {member}\n\tCapabilities: {capabilities:?}"); - // Remove this LATER + if verbose { + println!("Request received: {member}\n\tCapabilities: {capabilities:?}"); + // Remove this LATER + } } "Notify" => { // New notification received. Now, respond to the client with a notification ID @@ -102,10 +116,19 @@ async fn main() -> Result<()> { // Convert the msg body to a Notification object let notif: Notification = to_notif(&msg_body)?; // Handle the notif - if op_format == "j" { - println!("JSON!\n{}\n", ¬if.json()); // Print the json version - } else { - println!("New notification!\n{}\n", ¬if.plain()); // Print the plain version + match op_format { + "j" => { + println!("{}", ¬if.json()); // Print the json version + } + "r" => { + println!("{}", ¬if.rson()); // Print the plain version + } + "p" => { + println!("{}\n", ¬if.plain()); // Print the plain version + } + _ => { + println!("Onkown output format."); + } } } "CloseNotification" => { @@ -114,13 +137,17 @@ async fn main() -> Result<()> { // Tracking notifications by their IDs, closing them, and other features may be implemented later // close_notification(notification_id); - println!("Closing notification with ID: {notification_id}"); + if verbose { + println!("Closing notification with ID: {notification_id}"); + } // Respond to the client, acknowledging the closure connection.reply(&msg, &()).await?; } _ => { - println!("Unhandled method: {member}"); // Other methods are either irrelevant or unhandled at this stage of development + if verbose { + println!("Unhandled method: {member}"); // Other methods are either irrelevant or unhandled at this stage of development + } } } } diff --git a/src/notification.rs b/src/notification.rs index 299e42d..95d6d5f 100644 --- a/src/notification.rs +++ b/src/notification.rs @@ -1,10 +1,10 @@ -// use serde::Serialize; +use serde::Serialize; use std::collections::HashMap; use zbus::{message::Body, Result}; use zvariant::OwnedValue; // A notificaion object -// #[derive(Serialize)] // To help with json +#[derive(Serialize)] // To help with json, rson pub struct Notification { // The application that sent the notification app_name: String,