Make config objects Serializable with serde

master
Manos Pitsidianakis 2019-08-25 21:44:19 +03:00
parent 02b0f69e14
commit 1328f994f3
Signed by: Manos Pitsidianakis
GPG Key ID: 73627C2F690DF710
5 changed files with 54 additions and 9 deletions

View File

@ -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,

View File

@ -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<String>,
#[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<String, FileAccount>,
#[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<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
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
*/

View File

@ -24,7 +24,7 @@ fn none() -> Option<String> {
}
/// 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

View File

@ -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 {

View File

@ -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<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
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
))),
}
}
}