use serde::Serialize;
use std::collections::HashMap;
use crate::AnkiRequest;
#[derive(Default, Debug, Clone, PartialEq, Eq, Serialize)]
pub struct CanAddNotesRequest {
pub notes: Vec<CanAddNotesEntry>,
}
#[derive(Default, Debug, Clone, PartialEq, Eq, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct CanAddNotesEntry {
pub deck_name: String,
pub model_name: String,
#[serde(serialize_with = "crate::serialize::hashmap")]
pub fields: HashMap<String, String>,
pub tags: Vec<String>,
}
impl AnkiRequest for CanAddNotesRequest {
type Response = Vec<bool>;
const ACTION: &'static str = "canAddNotes";
const VERSION: u8 = 6;
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_serialize() {
let request = CanAddNotesRequest {
notes: vec![
CanAddNotesEntry {
deck_name: "Default".to_string(),
model_name: "Basic".to_string(),
fields: HashMap::from([
(
"Front".to_string(),
"Why do programmers prefer dark mode?".to_string(),
),
(
"Back".to_string(),
"Because light attracts bugs".to_string(),
),
]),
tags: vec!["yomichan".to_string()],
},
CanAddNotesEntry {
deck_name: "Default".to_string(),
model_name: "Basic".to_string(),
fields: HashMap::from([
(
"Front".to_string(),
"What do you call a cat that writes code?".to_string(),
),
("Back".to_string(), "A purr-ogrammer".to_string()),
]),
tags: vec!["yomichan".to_string()],
},
],
};
let json = serde_json::to_string_pretty(&request).unwrap();
assert_eq!(
json,
r#"{
"notes": [
{
"deckName": "Default",
"modelName": "Basic",
"fields": {
"Back": "Because light attracts bugs",
"Front": "Why do programmers prefer dark mode?"
},
"tags": [
"yomichan"
]
},
{
"deckName": "Default",
"modelName": "Basic",
"fields": {
"Back": "A purr-ogrammer",
"Front": "What do you call a cat that writes code?"
},
"tags": [
"yomichan"
]
}
]
}"#
);
}
#[test]
fn test_deserialize() {
let json = "[true, false]";
let response: <CanAddNotesRequest as AnkiRequest>::Response =
serde_json::from_str(json).unwrap();
assert_eq!(response, vec![true, false]);
}
}