#![allow(clippy::from_over_into)]
use std::ops::{BitOr, BitXor};
use crate::{menu::MenuOption, shims::constants};
#[derive(Copy, Clone, Debug, Default, PartialEq, Eq, Hash)]
pub struct MenuOptions {
raw: i32
}
impl MenuOptions {
option_getter!(is_one_value, O_ONEVALUE);
option_setter!(set_one_value, O_ONEVALUE);
option_getter!(is_show_description, O_SHOWDESC);
option_setter!(set_show_description, O_SHOWDESC);
option_getter!(is_row_major, O_ROWMAJOR);
option_setter!(set_row_major, O_ROWMAJOR);
option_getter!(is_ignore_case, O_IGNORECASE);
option_setter!(set_ignore_case, O_IGNORECASE);
option_getter!(is_show_match, O_SHOWMATCH);
option_setter!(set_show_match, O_SHOWMATCH);
option_getter!(is_non_cyclic, O_NONCYCLIC);
option_setter!(set_non_cyclic, O_NONCYCLIC);
option_getter!(is_mouse_menu, O_MOUSE_MENU);
option_setter!(set_mouse_menu, O_MOUSE_MENU);
}
impl BitOr for MenuOptions {
type Output = Self;
fn bitor(self, rhs: Self) -> Self::Output {
Self { raw: self.raw | rhs.raw }
}
}
impl BitXor for MenuOptions {
type Output = Self;
fn bitxor(self, rhs: Self) -> Self::Output {
Self { raw: self.raw ^ rhs.raw }
}
}
impl BitOr<MenuOption> for MenuOptions {
type Output = Self;
fn bitor(self, rhs: MenuOption) -> Self::Output {
match rhs {
MenuOption::OneValue => self.set_one_value(true),
MenuOption::ShowDescription => self.set_show_description(true),
MenuOption::RowMajor => self.set_row_major(true),
MenuOption::IgnoreCase => self.set_ignore_case(true),
MenuOption::ShowMatch => self.set_show_match(true),
MenuOption::NonCyclic => self.set_non_cyclic(true),
MenuOption::MouseMenu => self.set_mouse_menu(true)
}
}
}
impl BitXor<MenuOption> for MenuOptions {
type Output = Self;
fn bitxor(self, rhs: MenuOption) -> Self::Output {
match rhs {
MenuOption::OneValue => self.set_one_value(false),
MenuOption::ShowDescription => self.set_show_description(false),
MenuOption::RowMajor => self.set_row_major(false),
MenuOption::IgnoreCase => self.set_ignore_case(false),
MenuOption::ShowMatch => self.set_show_match(false),
MenuOption::NonCyclic => self.set_non_cyclic(false),
MenuOption::MouseMenu => self.set_mouse_menu(false)
}
}
}
impl From<MenuOption> for MenuOptions {
fn from(menu_option: MenuOption) -> Self {
Self::default() | menu_option
}
}
impl From<i32> for MenuOptions {
fn from(raw: i32) -> Self {
Self { raw }
}
}
impl Into<i32> for MenuOptions {
fn into(self) -> i32 {
self.raw
}
}