Dependencies:
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
My code:
use serde::{Deserialize, Serialize};
use serde_json::{Result, Value};
use std::collections::HashMap;
use serde::de::Error;
#[derive(Debug)]
pub struct Log {
pub string_map: HashMap<String, Option<String>>,
pub number_map: HashMap<String, Option<f64>>,
pub bool_map: HashMap<String, Option<bool>>,
}
struct Maps {
string_map: HashMap<String, Option<String>>,
number_map: HashMap<String, Option<f64>>,
bool_map: HashMap<String, Option<bool>>,
}
impl Log {
fn from_value(value: &Value) -> Option<Self> {
let mut maps = Maps {
string_map: HashMap::new(),
number_map: HashMap::new(),
bool_map: HashMap::new(),
};
if let Value::Object(map) = value {
for (key, value) in map.into_iter() {
if let Value::Number(number) = value {
if let Some(f) = number.as_f64() {
maps.number_map.insert(key.to_owned(), Some(f));
}
} else if let Value::Bool(b) = value {
maps.bool_map.insert(key.to_owned(), Some(b.to_owned()));
} else if let Value::String(s) = value {
maps.string_map.insert(key.to_owned(), Some(s.to_owned()));
}
}
}
Some(Log {
string_map: maps.string_map,
number_map: maps.number_map,
bool_map: maps.bool_map,
})
}
}
impl<'de> Deserialize<'de> for Log {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
let value: Value = serde::de::Deserialize::deserialize(deserializer)?;
match Log::from_value(&value) {
Some(log) => Ok(log),
None => Err(Error::custom("Failed to parse log")),
}
}
}
The problem here is in the deserialize implementation for Log. I am getting this error.
error[E0107]: type alias takes 1 generic argument but 2 generic arguments were supplied
src/main.rs:49:43
|
49 | fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
help: remove this generic argument
|
| expected 1 generic argument
|
note: type alias defined here, with 1 generic parameter: `T`
use serde_json::{Result, Value};
You import Result
from serde_json
here which overrides your default prelude of std::result::Result
. Either remove the import or alias it, for example: use serde_json::Result as SerdeJsonResult;