use std::fmt::Display; use chrono::prelude::*; use serde::{Deserialize, Serialize}; #[derive(Serialize, Deserialize, Debug)] pub struct SwaybarHeader { pub version: u32, #[serde(skip_serializing_if = "Option::is_none")] pub click_events: Option, #[serde(skip_serializing_if = "Option::is_none")] pub cont_signal: Option, #[serde(skip_serializing_if = "Option::is_none")] pub stop_signal: Option, } #[derive(Serialize, Deserialize, Debug)] pub struct SwaybarObject { pub full_text: String, #[serde(skip_serializing_if = "Option::is_none")] pub short_text: Option, #[serde(skip_serializing_if = "Option::is_none")] pub color: Option, #[serde(skip_serializing_if = "Option::is_none")] pub background: Option, #[serde(skip_serializing_if = "Option::is_none")] pub border: Option, #[serde(skip_serializing_if = "Option::is_none")] pub border_top: Option, #[serde(skip_serializing_if = "Option::is_none")] pub border_bottom: Option, #[serde(skip_serializing_if = "Option::is_none")] pub border_left: Option, #[serde(skip_serializing_if = "Option::is_none")] pub border_right: Option, #[serde(skip_serializing_if = "Option::is_none")] pub min_width: Option, #[serde(skip_serializing_if = "Option::is_none")] pub align: Option, #[serde(skip_serializing_if = "Option::is_none")] pub name: Option, #[serde(skip_serializing_if = "Option::is_none")] pub instance: Option, #[serde(skip_serializing_if = "Option::is_none")] pub urgent: Option, #[serde(skip_serializing_if = "Option::is_none")] pub separator: Option, #[serde(skip_serializing_if = "Option::is_none")] pub separator_block_width: Option, #[serde(skip_serializing_if = "Option::is_none")] pub markup: Option, } #[derive(Serialize, Deserialize, Debug)] pub struct SwaybarArray { objects: Vec, } impl SwaybarHeader { pub fn new() -> Self { Self { version: 1, click_events: None, cont_signal: None, stop_signal: None, } } } impl SwaybarObject { pub fn new() -> Self { Self { full_text: String::new(), short_text: None, color: None, background: None, border: None, border_top: None, border_bottom: None, border_left: None, border_right: None, min_width: None, align: None, name: None, instance: None, urgent: None, separator: None, separator_block_width: None, markup: None, } } pub fn from_string(string: String) -> Self { Self { full_text: string, short_text: None, color: None, background: None, border: None, border_top: None, border_bottom: None, border_left: None, border_right: None, min_width: None, align: None, name: None, instance: None, urgent: None, separator: None, separator_block_width: None, markup: None, } } } impl Default for SwaybarObject { fn default() -> Self { let current_time: DateTime = Local::now(); let current_time = current_time.format("%F %r"); Self { full_text: current_time.to_string(), short_text: None, color: None, background: None, border: None, border_top: None, border_bottom: None, border_left: None, border_right: None, min_width: None, align: None, name: None, instance: None, urgent: None, separator: None, separator_block_width: None, markup: None, } } } impl SwaybarArray { pub fn new() -> Self { Self { objects: Vec::new(), } } pub fn push_object(&mut self, object: SwaybarObject) { self.objects.push(object); } } impl Display for SwaybarArray { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { let mut s = serde_json::to_string(&self.objects) .expect("Should be able to serialize SwaybarArray::objects"); s.push(','); f.write_str(&s) } }