diff --git a/melib/src/backends.rs b/melib/src/backends.rs index 7b8f40ab..9456a3ac 100644 --- a/melib/src/backends.rs +++ b/melib/src/backends.rs @@ -245,7 +245,7 @@ impl BackendOp for ReadOnlyOp { } } -#[derive(Debug, Copy, Hash, Eq, Clone, Deserialize, PartialEq)] +#[derive(Debug, Copy, Hash, Eq, Clone, Serialize, Deserialize, PartialEq)] pub enum SpecialUseMailbox { Normal, Inbox, diff --git a/ui/src/conf.rs b/ui/src/conf.rs index 69022c10..f141559a 100644 --- a/ui/src/conf.rs +++ b/ui/src/conf.rs @@ -41,7 +41,8 @@ use melib::backends::SpecialUseMailbox; use melib::conf::AccountSettings; use melib::error::*; -use self::serde::{de, Deserialize, Deserializer}; +use serde::{de, Deserialize, Deserializer, Serialize, Serializer}; + use std::collections::HashMap; use std::env; use std::fs::{File, OpenOptions}; @@ -88,7 +89,7 @@ impl ToggleFlag { } } -#[derive(Debug, Clone, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize)] pub struct FolderConf { rename: Option, #[serde(default = "true_val")] @@ -119,7 +120,7 @@ impl FolderConf { } } -#[derive(Debug, Clone, Default, Deserialize)] +#[derive(Debug, Clone, Default, Serialize, Deserialize)] pub struct FileAccount { root_folder: String, format: String, @@ -247,7 +248,7 @@ impl FileAccount { } } -#[derive(Debug, Clone, Default, Deserialize)] +#[derive(Debug, Clone, Default, Serialize, Deserialize)] struct FileSettings { accounts: HashMap, #[serde(default)] @@ -376,7 +377,7 @@ impl Settings { } } -#[derive(Copy, Debug, Clone, Deserialize)] +#[derive(Copy, Debug, Clone, Serialize, Deserialize)] pub enum IndexStyle { Plain, Threaded, @@ -426,6 +427,19 @@ where }) } +impl Serialize for ToggleFlag { + fn serialize(&self, serializer: S) -> std::result::Result + where + S: Serializer, + { + match self { + ToggleFlag::Unset | ToggleFlag::InternalVal(_) => serializer.serialize_none(), + ToggleFlag::False => serializer.serialize_bool(false), + ToggleFlag::True => serializer.serialize_bool(true), + } + } +} + /* * Deserialize default functions */ diff --git a/ui/src/conf/notifications.rs b/ui/src/conf/notifications.rs index 96c75499..663ab7cf 100644 --- a/ui/src/conf/notifications.rs +++ b/ui/src/conf/notifications.rs @@ -24,7 +24,7 @@ fn none() -> Option { } /// Settings for the notifications function. -#[derive(Debug, Deserialize, Clone, Default)] +#[derive(Debug, Serialize, Deserialize, Clone, Default)] pub struct NotificationsSettings { /// A command to pipe notifications through /// Default: None diff --git a/ui/src/conf/shortcuts.rs b/ui/src/conf/shortcuts.rs index ae7c534a..6ff569cb 100644 --- a/ui/src/conf/shortcuts.rs +++ b/ui/src/conf/shortcuts.rs @@ -2,7 +2,7 @@ use crate::terminal::Key; //use std::any::TypeId; use fnv::FnvHashMap; -#[derive(Debug, Clone, Default, Deserialize)] +#[derive(Debug, Clone, Default, Serialize, Deserialize)] pub struct Shortcuts { #[serde(flatten)] pub listing: ListingShortcuts, @@ -22,7 +22,7 @@ macro_rules! shortcut_key_values { $(#[$outer:meta])* pub struct $name:ident { $($fname:ident : Key |> $fdesc:expr),* }) => { $(#[$outer])* - #[derive(Debug, Clone, Deserialize)] + #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(default)] #[serde(rename = $cname)] pub struct $name { diff --git a/ui/src/terminal/keys.rs b/ui/src/terminal/keys.rs index dd90e94b..fc431870 100644 --- a/ui/src/terminal/keys.rs +++ b/ui/src/terminal/keys.rs @@ -21,6 +21,7 @@ use super::*; use chan; +use serde::{Serialize, Serializer}; use std::fmt; use std::io; use termion::event::Event as TermionEvent; @@ -285,3 +286,33 @@ impl<'de> Deserialize<'de> for Key { deserializer.deserialize_identifier(KeyVisitor) } } + +impl Serialize for Key { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + match self { + Key::Backspace => serializer.serialize_str("Backspace"), + Key::Left => serializer.serialize_str("Left"), + Key::Right => serializer.serialize_str("Right"), + Key::Up => serializer.serialize_str("Up"), + Key::Down => serializer.serialize_str("Down"), + Key::Home => serializer.serialize_str("Home"), + Key::End => serializer.serialize_str("End"), + Key::PageUp => serializer.serialize_str("PageUp"), + Key::PageDown => serializer.serialize_str("PageDown"), + Key::Delete => serializer.serialize_str("Delete"), + Key::Insert => serializer.serialize_str("Insert"), + Key::Esc => serializer.serialize_str("Esc"), + Key::Char(c) => serializer.serialize_char(*c), + Key::F(n) => serializer.serialize_str(&format!("F{}", n)), + Key::Alt(c) => serializer.serialize_str(&format!("M-{}", c)), + Key::Ctrl(c) => serializer.serialize_str(&format!("C-{}", c)), + v => Err(serde::ser::Error::custom(format!( + "`{}` is not a valid key", + v + ))), + } + } +}