mirror of
https://github.com/alacritty/alacritty.git
synced 2024-11-25 14:05:41 -05:00
60 lines
1.4 KiB
Rust
60 lines
1.4 KiB
Rust
use std::collections::HashMap;
|
|
use std::error::Error;
|
|
|
|
use log::LevelFilter;
|
|
use serde::Deserialize;
|
|
use toml::Value;
|
|
|
|
pub trait SerdeReplace {
|
|
fn replace(&mut self, value: Value) -> Result<(), Box<dyn Error>>;
|
|
}
|
|
|
|
macro_rules! impl_replace {
|
|
($($ty:ty),*$(,)*) => {
|
|
$(
|
|
impl SerdeReplace for $ty {
|
|
fn replace(&mut self, value: Value) -> Result<(), Box<dyn Error>> {
|
|
replace_simple(self, value)
|
|
}
|
|
}
|
|
)*
|
|
};
|
|
}
|
|
|
|
#[rustfmt::skip]
|
|
impl_replace!(
|
|
usize, u8, u16, u32, u64, u128,
|
|
isize, i8, i16, i32, i64, i128,
|
|
f32, f64,
|
|
bool,
|
|
char,
|
|
String,
|
|
LevelFilter,
|
|
);
|
|
|
|
fn replace_simple<'de, D>(data: &mut D, value: Value) -> Result<(), Box<dyn Error>>
|
|
where
|
|
D: Deserialize<'de>,
|
|
{
|
|
*data = D::deserialize(value)?;
|
|
|
|
Ok(())
|
|
}
|
|
|
|
impl<'de, T: Deserialize<'de>> SerdeReplace for Vec<T> {
|
|
fn replace(&mut self, value: Value) -> Result<(), Box<dyn Error>> {
|
|
replace_simple(self, value)
|
|
}
|
|
}
|
|
|
|
impl<'de, T: Deserialize<'de>> SerdeReplace for Option<T> {
|
|
fn replace(&mut self, value: Value) -> Result<(), Box<dyn Error>> {
|
|
replace_simple(self, value)
|
|
}
|
|
}
|
|
|
|
impl<'de, T: Deserialize<'de>> SerdeReplace for HashMap<String, T> {
|
|
fn replace(&mut self, value: Value) -> Result<(), Box<dyn Error>> {
|
|
replace_simple(self, value)
|
|
}
|
|
}
|