conf/shortcuts.rs: implement DotAddressable for Shortcuts
parent
1cc1b0604c
commit
7fd511e149
|
@ -651,13 +651,27 @@ define_commands!([
|
|||
desc: "print ACCOUNT SETTING",
|
||||
tokens: &[One(Literal("print")), One(AccountName), One(QuotedStringValue)],
|
||||
parser:(
|
||||
fn print_setting(input: &[u8]) -> IResult<&[u8], Action> {
|
||||
fn print_account_setting(input: &[u8]) -> IResult<&[u8], Action> {
|
||||
let (input, _) = tag("print")(input.trim())?;
|
||||
let (input, _) = is_a(" ")(input)?;
|
||||
let (input, account) = quoted_argument(input)?;
|
||||
let (input, _) = is_a(" ")(input)?;
|
||||
let (input, setting) = quoted_argument(input)?;
|
||||
Ok((input, AccountAction(account.to_string(), PrintSetting(setting.to_string()))))
|
||||
let (input, _) = eof(input)?;
|
||||
Ok((input, AccountAction(account.to_string(), PrintAccountSetting(setting.to_string()))))
|
||||
}
|
||||
)
|
||||
},
|
||||
{ tags: ["print "],
|
||||
desc: "print SETTING",
|
||||
tokens: &[One(Literal("print")), One(QuotedStringValue)],
|
||||
parser:(
|
||||
fn print_setting(input: &[u8]) -> IResult<&[u8], Action> {
|
||||
let (input, _) = tag("print")(input.trim())?;
|
||||
let (input, _) = is_a(" ")(input)?;
|
||||
let (input, setting) = quoted_argument(input)?;
|
||||
let (input, _) = eof(input)?;
|
||||
Ok((input, PrintSetting(setting.to_string())))
|
||||
}
|
||||
)
|
||||
}
|
||||
|
@ -719,7 +733,7 @@ fn compose_action(input: &[u8]) -> IResult<&[u8], Action> {
|
|||
}
|
||||
|
||||
fn account_action(input: &[u8]) -> IResult<&[u8], Action> {
|
||||
alt((reindex, print_setting))(input)
|
||||
alt((reindex, print_account_setting))(input)
|
||||
}
|
||||
|
||||
fn view(input: &[u8]) -> IResult<&[u8], Action> {
|
||||
|
@ -744,6 +758,7 @@ pub fn parse_command(input: &[u8]) -> Result<Action, MeliError> {
|
|||
delete_mailbox,
|
||||
rename_mailbox,
|
||||
account_action,
|
||||
print_setting,
|
||||
))(input)
|
||||
.map(|(_, v)| v)
|
||||
.map_err(|err| err.into())
|
||||
|
|
|
@ -91,7 +91,7 @@ pub enum ComposeAction {
|
|||
#[derive(Debug)]
|
||||
pub enum AccountAction {
|
||||
ReIndex,
|
||||
PrintSetting(String),
|
||||
PrintAccountSetting(String),
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
|
@ -120,6 +120,7 @@ pub enum Action {
|
|||
Compose(ComposeAction),
|
||||
Mailbox(AccountName, MailboxOperation),
|
||||
AccountAction(AccountName, AccountAction),
|
||||
PrintSetting(String),
|
||||
}
|
||||
|
||||
impl Action {
|
||||
|
@ -138,6 +139,7 @@ impl Action {
|
|||
Action::Compose(_) => false,
|
||||
Action::Mailbox(_, _) => true,
|
||||
Action::AccountAction(_, _) => false,
|
||||
Action::PrintSetting(_) => false,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -849,6 +849,7 @@ impl DotAddressable for IndexStyle {}
|
|||
impl DotAddressable for u64 {}
|
||||
impl DotAddressable for crate::terminal::Color {}
|
||||
impl DotAddressable for crate::terminal::Attr {}
|
||||
impl DotAddressable for crate::terminal::Key {}
|
||||
impl DotAddressable for usize {}
|
||||
impl DotAddressable for Query {}
|
||||
impl DotAddressable for melib::LoggingLevel {}
|
||||
|
@ -880,6 +881,7 @@ impl DotAddressable for LogSettings {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl DotAddressable for Settings {
|
||||
fn lookup(&self, parent_field: &str, path: &[&str]) -> Result<String> {
|
||||
match path.first() {
|
||||
|
@ -890,7 +892,7 @@ impl DotAddressable for Settings {
|
|||
"pager" => self.pager.lookup(field, tail),
|
||||
"listing" => self.listing.lookup(field, tail),
|
||||
"notifications" => Err(MeliError::new("unimplemented")),
|
||||
"shortcuts" => Err(MeliError::new("unimplemented")),
|
||||
"shortcuts" => self.shortcuts.lookup(field, tail),
|
||||
"tags" => Err(MeliError::new("unimplemented")),
|
||||
"composing" => Err(MeliError::new("unimplemented")),
|
||||
"pgp" => Err(MeliError::new("unimplemented")),
|
||||
|
|
|
@ -19,7 +19,9 @@
|
|||
* along with meli. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
use super::DotAddressable;
|
||||
use crate::terminal::Key;
|
||||
use melib::{MeliError, Result};
|
||||
use std::collections::HashMap;
|
||||
|
||||
#[macro_export]
|
||||
|
@ -67,6 +69,33 @@ impl Default for Shortcuts {
|
|||
}
|
||||
}
|
||||
|
||||
impl DotAddressable for Shortcuts {
|
||||
fn lookup(&self, parent_field: &str, path: &[&str]) -> Result<String> {
|
||||
match path.first() {
|
||||
Some(field) => {
|
||||
let tail = &path[1..];
|
||||
match *field {
|
||||
"general" => self.general.lookup(field, tail),
|
||||
"listing" => self.listing.lookup(field, tail),
|
||||
"composing" => self.composing.lookup(field, tail),
|
||||
"compact_listing" | "compact-listing" => {
|
||||
self.compact_listing.lookup(field, tail)
|
||||
}
|
||||
"contact_list" | "contact-list" => self.contact_list.lookup(field, tail),
|
||||
"envelope_view" | "envelope-view" => self.envelope_view.lookup(field, tail),
|
||||
"thread_view" | "thread-view" => self.thread_view.lookup(field, tail),
|
||||
"pager" => self.pager.lookup(field, tail),
|
||||
other => Err(MeliError::new(format!(
|
||||
"{} has no field named {}",
|
||||
parent_field, other
|
||||
))),
|
||||
}
|
||||
}
|
||||
None => Ok(toml::to_string(self).map_err(|err| err.to_string())?),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Create a struct holding all of a Component's shortcuts.
|
||||
#[macro_export]
|
||||
macro_rules! shortcut_key_values {
|
||||
|
@ -105,6 +134,24 @@ macro_rules! shortcut_key_values {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl DotAddressable for $name {
|
||||
fn lookup(&self, parent_field: &str, path: &[&str]) -> Result<String> {
|
||||
match path.first() {
|
||||
Some(field) => {
|
||||
let tail = &path[1..];
|
||||
match *field {
|
||||
$(stringify!($fname) => self.$fname.lookup(field, tail),)*
|
||||
other => Err(MeliError::new(format!(
|
||||
"{} has no field named {}",
|
||||
parent_field, other
|
||||
))),
|
||||
}
|
||||
}
|
||||
None => Ok(toml::to_string(self).map_err(|err| err.to_string())?),
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
30
src/state.rs
30
src/state.rs
|
@ -931,7 +931,35 @@ impl State {
|
|||
Some(NotificationType::ERROR),
|
||||
));
|
||||
}
|
||||
AccountAction(ref _account_name, PrintSetting(ref setting)) => {
|
||||
AccountAction(ref account_name, PrintAccountSetting(ref setting)) => {
|
||||
/*
|
||||
let path = setting.split(".").collect::<SmallVec<[&str; 16]>>();
|
||||
if let Some(pos) = self
|
||||
.context
|
||||
.accounts
|
||||
.iter()
|
||||
.position(|a| a.name() == account_name)
|
||||
{
|
||||
self.context.replies.push_back(UIEvent::StatusEvent(
|
||||
StatusEvent::UpdateStatus(format!(
|
||||
"{}",
|
||||
self.context.accounts[pos]
|
||||
.settings
|
||||
.lookup("settings", &path)
|
||||
.unwrap_or_else(|err| err.to_string())
|
||||
)),
|
||||
));
|
||||
} else {
|
||||
self.context.replies.push_back(UIEvent::Notification(
|
||||
None,
|
||||
format!("Account {} was not found.", account_name),
|
||||
Some(NotificationType::ERROR),
|
||||
));
|
||||
return;
|
||||
}
|
||||
*/
|
||||
}
|
||||
PrintSetting(ref setting) => {
|
||||
let path = setting.split(".").collect::<SmallVec<[&str; 16]>>();
|
||||
self.context
|
||||
.replies
|
||||
|
|
Loading…
Reference in New Issue