use std::fs::create_dir_all;
use std::process::exit;
use std::{env, thread, time};
use clap::{Parser, ValueEnum};
use crate::session::*;
#[derive(Copy, Clone, PartialEq, ValueEnum)]
enum Mode {
Default,
SaveOnly,
SaveAndExit,
LoadAndExit,
}
#[derive(Parser)]
#[command(version, about, long_about = None)]
struct Args {
#[arg(long, value_enum, default_value_t = Mode::Default)]
mode: Mode,
#[arg(long, default_value_t = false)]
save_duplicate_pids: bool,
#[arg(short = 'i', long, default_value_t = 60)]
save_interval: u64,
#[arg(short = 's', long)]
session_path: Option<String>,
#[arg(short = 'l', long, default_value_t = 30)]
load_time: u64,
#[arg(long, default_value_t = false)]
simulate: bool,
}
pub fn main() -> hyprland::Result<()> {
let args = Args::parse();
let mode = args.mode;
let save_interval = args.save_interval;
let default_path = env::var("HOME").unwrap() + "/.local/share/hyprsession";
let session_path = args.session_path.unwrap_or(default_path);
let sessions = LocalSession {
base_path: session_path.clone(),
adjust_clients_only: false,
load_time: 30,
simulate: args.simulate,
save_duplicate_pids: args.save_duplicate_pids,
};
if args.save_interval == 0 {
eprintln!("Error: save-interval of 0 is invalid");
exit(1);
}
create_dir_all(&session_path).expect(&format!("Failed to create session dir: {session_path}"));
match mode {
Mode::Default | Mode::LoadAndExit => sessions.load(""),
Mode::SaveAndExit | Mode::SaveOnly => sessions.save(""),
}?;
if mode == Mode::LoadAndExit {
std::thread::sleep(time::Duration::from_secs(args.load_time + 5));
}
if mode == Mode::LoadAndExit || mode == Mode::SaveAndExit {
exit(0);
}
loop {
sessions.save("")?;
thread::sleep(time::Duration::from_secs(save_interval));
}
}