use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use crate::AnkiRequest;
use crate::entities::NoteId;
#[derive(Default, Debug, Clone, PartialEq, Eq, Serialize)]
pub struct GuiAddCardsRequest {
pub note: GuiAddCardsNote,
}
#[derive(Default, Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct GuiAddCardsNote {
pub deck_name: String,
pub model_name: String,
#[serde(serialize_with = "crate::serialize::hashmap")]
pub fields: HashMap<String, String>,
pub tags: Vec<String>,
pub audio: Vec<GuiAddCardsNoteMedia>,
pub video: Vec<GuiAddCardsNoteMedia>,
pub picture: Vec<GuiAddCardsNoteMedia>,
}
#[derive(Default, Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct GuiAddCardsNoteMedia {
pub filename: String,
pub fields: Vec<String>,
pub data: Option<String>,
pub path: Option<String>,
pub url: Option<String>,
}
impl AnkiRequest for GuiAddCardsRequest {
type Response = NoteId;
const ACTION: &'static str = "guiAddCards";
const VERSION: u8 = 6;
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_serialize() {
let request = GuiAddCardsRequest {
note: GuiAddCardsNote {
deck_name: "My Deck".into(),
model_name: "My Model".into(),
fields: HashMap::from([
("Text".into(), "暗記".into()),
(
"Meaning".into(),
"memorization; memorisation; learning by heart".into(),
),
]),
tags: vec!["Tag1".into(), "Tag2".into()],
audio: vec![
GuiAddCardsNoteMedia {
filename: "my_audio.mp3".into(),
fields: vec!["Audio".into()],
data: None,
path: None,
url: Some("https://mirrors.edge.kernel.org/pub/linux/kernel/SillySounds/english.ogg".into()),
}
],
video: vec![
GuiAddCardsNoteMedia {
filename: "my_video.mp4".into(),
fields: vec!["Video".into()],
data: None,
path: Some("/tmp/my_video.mp4".into()),
url: None,
}
],
picture: vec![
GuiAddCardsNoteMedia {
filename: "my_picture.mp4".into(),
fields: vec!["Picture".into()],
data: Some("iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX///+/v7+jQ3Y5AAAADklEQVQI12P4AIX8EAgALgAD/aNpbtEAAAAASUVORK5CYII=".into()),
path: None,
url: None,
}],
},
};
let json = serde_json::to_string_pretty(&request).unwrap();
assert_eq!(
json,
r#"{
"note": {
"deckName": "My Deck",
"modelName": "My Model",
"fields": {
"Meaning": "memorization; memorisation; learning by heart",
"Text": "暗記"
},
"tags": [
"Tag1",
"Tag2"
],
"audio": [
{
"filename": "my_audio.mp3",
"fields": [
"Audio"
],
"data": null,
"path": null,
"url": "https://mirrors.edge.kernel.org/pub/linux/kernel/SillySounds/english.ogg"
}
],
"video": [
{
"filename": "my_video.mp4",
"fields": [
"Video"
],
"data": null,
"path": "/tmp/my_video.mp4",
"url": null
}
],
"picture": [
{
"filename": "my_picture.mp4",
"fields": [
"Picture"
],
"data": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX///+/v7+jQ3Y5AAAADklEQVQI12P4AIX8EAgALgAD/aNpbtEAAAAASUVORK5CYII=",
"path": null,
"url": null
}
]
}
}"#
);
}
#[test]
fn test_deserialize() {
let json = "1496198395707";
let response: usize = serde_json::from_str(json).unwrap();
assert_eq!(response, 1496198395707);
}
}