use super::TargetWindowExt;
use std::fmt;
#[derive(Default)]
pub struct TargetPaneExt<'a> {
pub target_window: Option<&'a TargetWindowExt<'a>>,
pub target_pane: Option<TargetPane<'a>>,
}
impl<'a> TargetPaneExt<'a> {
pub fn new(target_pane: &'a str) -> Self {
TargetPaneExt {
target_window: None,
target_pane: Some(TargetPane::StartName(target_pane)),
}
}
pub fn token(target_window: Option<&'a TargetWindowExt>, token: TargetPaneToken) -> Self {
TargetPaneExt {
target_window,
target_pane: Some(TargetPane::Token(token)),
}
}
pub fn index(target_window: Option<&'a TargetWindowExt>, index: usize) -> Self {
TargetPaneExt {
target_window,
target_pane: Some(TargetPane::Index(index)),
}
}
pub fn id(target_window: Option<&'a TargetWindowExt>, id: usize) -> Self {
TargetPaneExt {
target_window,
target_pane: Some(TargetPane::Id(id)),
}
}
pub fn exact_name(target_window: Option<&'a TargetWindowExt>, name: &'a str) -> Self {
TargetPaneExt {
target_window,
target_pane: Some(TargetPane::ExactName(name)),
}
}
pub fn start_name(target_window: Option<&'a TargetWindowExt>, name: &'a str) -> Self {
TargetPaneExt {
target_window,
target_pane: Some(TargetPane::StartName(name)),
}
}
pub fn fn_match(target_window: Option<&'a TargetWindowExt>, name: &'a str) -> Self {
TargetPaneExt {
target_window,
target_pane: Some(TargetPane::FnMatch(name)),
}
}
pub fn raw(name: &'a str) -> Self {
TargetPaneExt {
target_window: None,
target_pane: Some(TargetPane::Raw(name)),
}
}
}
impl<'a> fmt::Display for TargetPaneExt<'a> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let mut w = String::new();
let mut p = String::new();
if let Some(ref target_window) = self.target_window {
w = target_window.to_string();
}
if let Some(ref target_pane) = self.target_pane {
p = target_pane.to_string();
}
write!(f, "{}{}", w, p)
}
}
pub enum TargetPane<'a> {
Token(TargetPaneToken),
Index(usize),
Id(usize),
ExactName(&'a str),
StartName(&'a str),
FnMatch(&'a str),
Raw(&'a str),
}
impl<'a> Default for TargetPane<'a> {
fn default() -> Self {
TargetPane::Raw("")
}
}
impl<'a> fmt::Display for TargetPane<'a> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
TargetPane::Token(token) => write!(f, ".{}", token),
TargetPane::Index(i) => write!(f, ".{}", i),
TargetPane::Id(id) => write!(f, "%{}", id),
TargetPane::ExactName(name) => write!(f, ".={}", name),
TargetPane::StartName(name) => write!(f, ".{}", name),
TargetPane::FnMatch(name) => write!(f, ".{}", name),
TargetPane::Raw(raw_str) => write!(f, "{}", raw_str),
}
}
}
pub enum TargetPaneToken {
Next(Option<usize>),
Previous(Option<usize>),
Top,
Bottom,
Left,
Right,
TopLeft,
TopRight,
BottomLeft,
BottomRight,
UpOf,
DownOf,
LeftOf,
RightOf,
}
const TARGET_PANE_TOKEN_NEXT: &str = "+";
const TARGET_PANE_TOKEN_PREVIOUS: &str = "-";
const TARGET_PANE_TOKEN_TOP: &str = "{top}";
const TARGET_PANE_TOKEN_BOTTOM: &str = "{bottom}";
const TARGET_PANE_TOKEN_LEFT: &str = "{left}";
const TARGET_PANE_TOKEN_RIGHT: &str = "{right}";
const TARGET_PANE_TOKEN_TOP_LEFT: &str = "{top-left}";
const TARGET_PANE_TOKEN_TOP_RIGHT: &str = "{top-right}";
const TARGET_PANE_TOKEN_BOTTOM_LEFT: &str = "{bottom-left}";
const TARGET_PANE_TOKEN_BOTTOM_RIGHT: &str = "{bottom-right}";
const TARGET_PANE_TOKEN_UP_OF: &str = "{up-of}";
const TARGET_PANE_TOKEN_DOWN_OF: &str = "{down-of}";
const TARGET_PANE_TOKEN_LEFT_OF: &str = "{left-of}";
const TARGET_PANE_TOKEN_RIGHT_OF: &str = "{right-of}";
impl fmt::Display for TargetPaneToken {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let a;
let s = match self {
TargetPaneToken::Next(offset) => {
if let Some(n) = offset {
a = format!("{}{}", TARGET_PANE_TOKEN_NEXT, n);
&a
} else {
TARGET_PANE_TOKEN_NEXT
}
}
TargetPaneToken::Previous(offset) => {
if let Some(n) = offset {
a = format!("{}{}", TARGET_PANE_TOKEN_PREVIOUS, n);
&a
} else {
TARGET_PANE_TOKEN_PREVIOUS
}
}
TargetPaneToken::Top => TARGET_PANE_TOKEN_TOP,
TargetPaneToken::Bottom => TARGET_PANE_TOKEN_BOTTOM,
TargetPaneToken::Left => TARGET_PANE_TOKEN_LEFT,
TargetPaneToken::Right => TARGET_PANE_TOKEN_RIGHT,
TargetPaneToken::TopLeft => TARGET_PANE_TOKEN_TOP_LEFT,
TargetPaneToken::TopRight => TARGET_PANE_TOKEN_TOP_RIGHT,
TargetPaneToken::BottomLeft => TARGET_PANE_TOKEN_BOTTOM_LEFT,
TargetPaneToken::BottomRight => TARGET_PANE_TOKEN_BOTTOM_RIGHT,
TargetPaneToken::UpOf => TARGET_PANE_TOKEN_UP_OF,
TargetPaneToken::DownOf => TARGET_PANE_TOKEN_DOWN_OF,
TargetPaneToken::LeftOf => TARGET_PANE_TOKEN_LEFT_OF,
TargetPaneToken::RightOf => TARGET_PANE_TOKEN_RIGHT_OF,
};
f.write_str(s)
}
}