housekeeping

This commit is contained in:
Penelope Gwen 2025-09-21 01:26:00 -07:00
parent 7faced1b8c
commit 8324b8f62f
4 changed files with 77 additions and 71 deletions

View file

@ -1,9 +1,12 @@
use crate::{config::Config, profile::{active_profile,profile_from_index}, ErrorMessage, ProfileGetCommand}; use crate::{config::Config, profile::{active_profile_index,profile_from_index}, ErrorMessage, ProfileGetCommand};
//use crate::utils::config::c;
use serde_json::json; use serde_json::json;
use watchexec::Watchexec;
use watchexec_events::Tag;
use miette::{IntoDiagnostic, Result};
pub fn profile_info(config: Config,info: ProfileGetCommand) -> Result<String,ErrorMessage> {
pub fn print(config: Config,info: &ProfileGetCommand) -> Result<String,ErrorMessage> { match active_profile_index() {
match active_profile() {
Ok(i) => { Ok(i) => {
match profile_from_index(config, i) { match profile_from_index(config, i) {
Ok(p) => { Ok(p) => {
@ -12,24 +15,6 @@ pub fn print(config: Config,info: &ProfileGetCommand) -> Result<String,ErrorMess
ProfileGetCommand::Name => Ok(p.name), ProfileGetCommand::Name => Ok(p.name),
ProfileGetCommand::Icon => Ok(p.icon), ProfileGetCommand::Icon => Ok(p.icon),
} }
/* Ok(if monitor {
let xdg_directories = BaseDirectories::new();
let config = notify::Config::default().with_compare_contents(true).with_compare_contents(true).with_poll_interval(Duration::from_secs_f32(0.5));
let (tx, rx) = std::sync::mpsc::channel();
let mut watcher = PollWatcher::new(tx, config).unwrap();
watcher.watch(xdg_directories.runtime_dir.unwrap().join("sway-profiles-rs/active-profile.json").as_path(),RecursiveMode::Recursive);
for _res in rx {
match info {
ProfileGetCommand::Json => println!("{}",json!(p).to_string()),
ProfileGetCommand::Name => println!("{}",p.name),
ProfileGetCommand::Icon => println!("{}",p.icon),
};
match res {
Ok(event) => println!("changed: {:?}", event),
Err(e) => println!("watch error: {:?}", e),
};
}
})*/
} }
Err(e) => Err(e), Err(e) => Err(e),
} }
@ -37,3 +22,26 @@ pub fn print(config: Config,info: &ProfileGetCommand) -> Result<String,ErrorMess
Err(e) => Err(e), Err(e) => Err(e),
} }
} }
#[tokio::main]
pub async fn watch(config: Config,info: ProfileGetCommand,watch_path: String) -> Result<()> {
let wx = Watchexec::new(move |mut action| {
//yeah, this is... fine
action.events.iter().find(|_event|_event.tags.iter().any(|tag| match tag {
Tag::FileEventKind(watchexec_events::filekind::FileEventKind::Access(watchexec_events::filekind::AccessKind::Close(watchexec_events::filekind::AccessMode::Write))) => {
println!("{}",profile_info(config.clone(),info).unwrap());
true
},
_ => false
}));
if action.signals().next().is_some() {
println!("Quitting");
action.quit();
}
action
})?;
let main = wx.main();
wx.config.pathset([watch_path]);
let _ = main.await.into_diagnostic();
Ok(())
}

View file

@ -73,7 +73,7 @@ pub fn switch_by_name(config: Config,name: String,sway_connection: Connection) -
} */ } */
} }
pub fn active_profile() -> Result<usize,ErrorMessage> { pub fn active_profile_index() -> Result<usize,ErrorMessage> {
let base_directories = BaseDirectories::new(); let base_directories = BaseDirectories::new();
let active_profile_cache_json = base_directories.get_runtime_directory().unwrap().join("sway-profiles-rs/active-profile.json"); let active_profile_cache_json = base_directories.get_runtime_directory().unwrap().join("sway-profiles-rs/active-profile.json");
match active_profile_cache_json.exists() { match active_profile_cache_json.exists() {
@ -94,8 +94,19 @@ pub fn active_profile() -> Result<usize,ErrorMessage> {
} }
} }
pub fn active_profile(profiles: Vec<Profile>) -> Result<Profile,ErrorMessage> {
//let active_profile_index =
match active_profile_index() {
Ok(i) => match profiles.get(i) {
Some(p) => Ok(p.clone()),
None => Err(ErrorMessage { message: Some("Could not get profile by index".to_string()), code: Some(1) }),
},
Err(e) => Err(e),
}
}
pub fn next(config: Config, sway_connection: Connection) -> Result<(),ErrorMessage> { pub fn next(config: Config, sway_connection: Connection) -> Result<(),ErrorMessage> {
match active_profile() { match active_profile_index() {
Ok(u) => { Ok(u) => {
let profile_count = config.profiles.len(); let profile_count = config.profiles.len();
let mut next_profile = u + 1; let mut next_profile = u + 1;
@ -115,7 +126,7 @@ pub fn next(config: Config, sway_connection: Connection) -> Result<(),ErrorMessa
} }
pub fn previous(config: Config, sway_connection: Connection) -> Result<(),ErrorMessage> { pub fn previous(config: Config, sway_connection: Connection) -> Result<(),ErrorMessage> {
match active_profile() { match active_profile_index() {
Ok(u) => { Ok(u) => {
let prev_profile: usize = if u.eq(&0) { let prev_profile: usize = if u.eq(&0) {
config.profiles.len() - 1 config.profiles.len() - 1

View file

@ -1,6 +1,5 @@
use swayipc::Connection; use swayipc::{Connection, EventType};
use crate::{config::Config, windows::print_window_title, workspaces::print_workspace_array, Cli, ErrorMessage};
use crate::ErrorMessage;
pub fn run_sway_command(sway_connection: &mut Connection,payload: String) -> Result<(),ErrorMessage> { pub fn run_sway_command(sway_connection: &mut Connection,payload: String) -> Result<(),ErrorMessage> {
match sway_connection.run_command(&payload) { match sway_connection.run_command(&payload) {
@ -11,3 +10,22 @@ pub fn run_sway_command(sway_connection: &mut Connection,payload: String) -> Res
Err(e) => Err(ErrorMessage{ message: Some(e.to_string()), code: Some(2) }), Err(e) => Err(ErrorMessage{ message: Some(e.to_string()), code: Some(2) }),
} }
} }
pub fn monitor_events(event_type: EventType, cli: Cli, config: Config) {
let sway_connection = Connection::new().unwrap();
for event in sway_connection.subscribe([event_type]).unwrap() {
let e = event.unwrap();
match e {
swayipc::Event::Window(w) => {
print_window_title(w.container, &cli, &config);
},
swayipc::Event::Workspace(_) => {
print_workspace_array(self::Connection::get_workspaces(&mut self::Connection::new().unwrap()).unwrap());
},
swayipc::Event::Tick(w) => {
println!("{}",w.payload);
},
_ => unreachable!(),
}
}
}

View file

@ -1,10 +1,9 @@
#![deny(unused_crate_dependencies)] #![warn(unused_crate_dependencies)]
use std::{process::exit, time::Duration}; use std::process::exit;
use clap::{ArgAction, Parser, Subcommand}; use clap::{ArgAction, Parser, Subcommand};
use swayipc::{Connection, Event, EventType, Fallible}; use swayipc::{Connection, EventType, Fallible};
use notify::{PollWatcher, RecursiveMode, Watcher};
mod config; mod config;
#[path = "lib/windows.rs"] #[path = "lib/windows.rs"]
@ -27,7 +26,6 @@ mod profile;
#[path = "lib/get.rs"] #[path = "lib/get.rs"]
mod get; mod get;
use config::Config;
use xdg::BaseDirectories; use xdg::BaseDirectories;
use crate::profile::switch_by_index; use crate::profile::switch_by_index;
@ -125,6 +123,7 @@ enum ProfileSwitchCommand {
} }
} }
#[derive(Clone, Copy)]
#[derive(Subcommand)] #[derive(Subcommand)]
enum ProfileGetCommand { enum ProfileGetCommand {
/// get profile json /// get profile json
@ -157,10 +156,8 @@ pub fn setup_runtime_dir(xdg_directories: BaseDirectories) {
} }
fn main() -> Fallible<()> { fn main() -> Fallible<()> {
//let xdg_dirs = BaseDirectories::with_prefix("sway-profiles-rs");
let xdg_directories = BaseDirectories::new(); let xdg_directories = BaseDirectories::new();
let cli = Cli::parse(); let cli = Cli::parse();
// let config = config::parse_config();
let config = confy::load("sway-profiles-rs", "config").unwrap(); let config = confy::load("sway-profiles-rs", "config").unwrap();
let mut sway_connection = Connection::new()?; let mut sway_connection = Connection::new()?;
@ -168,17 +165,18 @@ fn main() -> Fallible<()> {
Commands::Windows => { Commands::Windows => {
print_window_title(sway_connection.get_tree().unwrap().iter().find(|&x | x.focused).unwrap().clone(), &cli, &config); print_window_title(sway_connection.get_tree().unwrap().iter().find(|&x | x.focused).unwrap().clone(), &cli, &config);
if cli.monitor.unwrap() { if cli.monitor.unwrap() {
monitor_sway_events(EventType::Window, cli, config); sway::monitor_events(EventType::Window, cli, config);
} }
} }
Commands::Workspaces => { Commands::Workspaces => {
print_workspace_array(sway_connection.get_workspaces().unwrap()); print_workspace_array(sway_connection.get_workspaces().unwrap());
if cli.monitor.unwrap() { if cli.monitor.unwrap() {
monitor_sway_events(EventType::Workspace, cli, config); sway::monitor_events(EventType::Workspace, cli, config);
} }
} }
Commands::Launch { program } => { Commands::Launch { program } => {
match profile_launch(config.programs, program) { println!("{:?}",config.programs);
match profile_launch(config.profiles,config.programs, program) {
Ok(p) => { Ok(p) => {
match run_sway_command(&mut sway_connection,p) { match run_sway_command(&mut sway_connection,p) {
Ok(_) => todo!(), Ok(_) => todo!(),
@ -271,20 +269,10 @@ fn main() -> Fallible<()> {
}, },
ProfileCommand::Get { get_command, monitor } => { ProfileCommand::Get { get_command, monitor } => {
match Some(get_command) { match Some(get_command) {
Some(g) => { Some(&g) => {
println!("{}",get::print(config.clone(),g).unwrap()); println!("{}",get::profile_info(config.clone(),g).unwrap());
if monitor.unwrap() { if monitor.unwrap() {
let notify_config = notify::Config::default().with_compare_contents(true).with_poll_interval(Duration::from_millis(500)); let _ = get::watch(config, g,xdg_directories.runtime_dir.unwrap().join("sway-profiles-rs/active-profile.json").to_str().unwrap().to_string());
let (tx, rx) = std::sync::mpsc::channel();
let mut watcher = PollWatcher::new(tx, notify_config).unwrap();
match watcher.watch(xdg_directories.runtime_dir.unwrap().join("sway-profiles-rs/active-profile.json").as_path(),RecursiveMode::Recursive) {
Ok(_) => {
for _res in rx {
println!("{}",get::print(config.clone(),g).unwrap());
}
},
Err(_) => error_handler(ErrorMessage { message: Some("Watcher failed".to_string()), code: Some(1) }),
};
} }
}, },
None => error_handler(ErrorMessage { message: Some("No matching Profile Detail".to_string()), code: Some(4) }), None => error_handler(ErrorMessage { message: Some("No matching Profile Detail".to_string()), code: Some(4) }),
@ -298,22 +286,3 @@ fn main() -> Fallible<()> {
} }
exit(0); exit(0);
} }
pub fn monitor_sway_events(event_type: EventType, cli: Cli, config: Config) {
let sway_connection = Connection::new().unwrap();
for event in sway_connection.subscribe([event_type]).unwrap() {
let e = event.unwrap();
match e {
Event::Window(w) => {
print_window_title(w.container, &cli, &config);
},
Event::Workspace(_) => {
print_workspace_array(self::Connection::get_workspaces(&mut self::Connection::new().unwrap()).unwrap());
},
Event::Tick(w) => {
println!("{}",w.payload);
},
_ => unreachable!(),
}
}
}