1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
//! Utility macros
/// Quickly create a [crate::Error::Custom]
/// ```
/// # use penrose::custom_error;
/// let err = custom_error!("a simple error message");
///
/// let s = "templated";
/// let err = custom_error!("a {} error message", s);
/// ```
#[macro_export]
macro_rules! custom_error {
($msg:expr) => {
$crate::Error::Custom($msg.to_string())
};
($template:expr, $($arg:expr),+) => {
$crate::Error::Custom(format!($template, $($arg),+))
};
}
/// Make creating a pre-defined HashMap a little less verbose
///
/// ```
/// # use penrose::map;
/// map! {
/// 1 => "one",
/// 2 => "two",
/// 3 => "three",
/// };
/// ```
#[macro_export]
macro_rules! map {
{} => { ::std::collections::HashMap::new() };
{
map_keys: $mapper:expr;
$($key:expr => $value:expr),+,
} => {
{
let mut _map: ::std::collections::HashMap<_, _> = ::std::collections::HashMap::new();
$(_map.insert($mapper($key), $value);)+
_map
}
};
{ $($key:expr => $value:expr),+, } => {
{
let mut _map: ::std::collections::HashMap<_, _> = ::std::collections::HashMap::new();
$(_map.insert($key, $value);)+
_map
}
};
}
/// Compose together a set of ManageHook query/hook rules into a single ManageHook
/// that can be added to your Config.
///
/// ```
/// use penrose::{
/// core::{hooks::ManageHook, Config},
/// extensions::hooks::manage::SetWorkspace,
/// x::query::ClassName,
/// x11rb::RustConn,
/// manage_hooks,
/// };
///
///
/// let my_manage_hook = manage_hooks! {
/// ClassName("discord") => SetWorkspace("9"),
/// ClassName("vlc") => SetWorkspace("5"),
/// };
///
/// let config: Config<RustConn> = Config {
/// manage_hook: Some(my_manage_hook),
/// ..Default::default()
/// };
/// ```
#[macro_export]
macro_rules! manage_hooks {
{ $($query:expr => $hook:expr),+, } => {
{
use $crate::core::hooks::ManageHook as _;
let mut _hooks = vec![];
$(
_hooks.push(
$crate::core::hooks::ManageHook::boxed(($query, $hook))
);
)+
Box::new(_hooks)
}
};
}
// Helper for popping from the middle of a linked list
#[doc(hidden)]
#[macro_export]
macro_rules! pop_where {
($self:ident, $lst:ident, $($pred:tt)+) => {{
let placeholder = ::std::mem::take(&mut $self.$lst);
let mut remaining = ::std::collections::VecDeque::default();
let mut popped = None;
let pred = $($pred)+;
for item in placeholder.into_iter() {
if pred(&item) {
popped = Some(item);
} else {
remaining.push_back(item);
}
}
::std::mem::swap(&mut $self.$lst, &mut remaining);
popped
}};
}