pub mod absolute;
pub mod comms;
pub mod config;
pub mod convert;
pub mod geometry;
pub mod info;
pub mod parse;
pub mod relative;
use std::collections::BTreeMap;
use clap::{ArgAction, Parser};
use config::{Config, LayoutDesc};
use eyre::{Context, ContextCompat, Result};
pub type Map<K, V> = BTreeMap<K, V>;
#[derive(Debug, Parser)]
pub struct Args {
#[allow(rustdoc::bare_urls)]
desc: Option<LayoutDesc>,
#[arg(short = 'n', long = "no-apply", action = ArgAction::SetFalse)]
apply: bool,
}
pub fn run() -> Result<()> {
let args = Args::parse();
let desc = args.desc.map_or_else(desc_from_config, Ok)?;
let relative: relative::Layout = desc
.parse()
.context("Could not parse relative layout description")?;
let mut comms = comms::establish().context("Could not establish connection to WM")?;
let layout = relative
.to_absolute(comms.as_mut())
.context("Could not absolutize layout")?;
if args.apply {
comms
.set_layout(&layout)
.context("Could not set layout in WM")?;
} else {
for cmd in layout.to_sway_commands() {
println!("{cmd}");
}
}
Ok(())
}
pub fn desc_from_config() -> Result<LayoutDesc> {
let config = Config::new()?;
let desc = config
.machine_layout()
.context("Could not determine hostname to decide which layout to load")?
.context("Config file does not define layout for this machine")?;
Ok(desc.to_string())
}