use serde::Serialize;
use std::collections::HashMap;
use crate::AnkiRequest;
use crate::entities::{NoteId, NoteMedia};
#[derive(Default, Debug, Clone, PartialEq, Eq, Serialize)]
pub struct UpdateNoteFieldsRequest {
pub note: UpdateNoteFieldsEntry,
}
#[derive(Default, Debug, Clone, PartialEq, Eq, Serialize)]
pub struct UpdateNoteFieldsEntry {
pub id: NoteId,
#[serde(serialize_with = "crate::serialize::hashmap")]
pub fields: HashMap<String, String>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub audio: Vec<NoteMedia>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub video: Vec<NoteMedia>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub picture: Vec<NoteMedia>,
}
impl AnkiRequest for UpdateNoteFieldsRequest {
type Response = ();
const ACTION: &'static str = "updateNoteFields";
const VERSION: u8 = 6;
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_serialize() {
let request = UpdateNoteFieldsRequest {
note: UpdateNoteFieldsEntry {
id: 1514547547030,
fields: HashMap::from([
("Front".to_string(), "new front content".to_string()),
("Back".to_string(), "new back content".to_string()),
]),
audio: vec![
NoteMedia {
filename: "yomichan_ねこ_猫.mp3".to_string(),
data: None,
path: None,
url: Some("https://assets.languagepod101.com/dictionary/japanese/audiomp3.php?kanji=猫&kana=ねこ".to_string()),
skip_hash: Some("7e2c2f954ef6051373ba916f000168dc".to_string()),
fields: vec![
"Front".to_string()
],
}
],
video: vec![
NoteMedia {
filename: "countdown.mp4".to_string(),
data: None,
path: None,
url: Some("https://cdn.videvo.net/videvo_files/video/free/2015-06/small_watermarked/Contador_Glam_preview.mp4".to_string()),
skip_hash: Some("4117e8aab0d37534d9c8eac362388bbe".to_string()),
fields: vec![
"Back".to_string()
],
}
],
picture: vec![
NoteMedia {
filename: "black_cat.jpg".to_string(),
data: None,
path: None,
url: Some("https://upload.wikimedia.org/wikipedia/commons/thumb/c/c7/A_black_cat_named_Tilly.jpg/220px-A_black_cat_named_Tilly.jpg".to_string()),
skip_hash: Some("8d6e4646dfae812bf39651b59d7429ce".to_string()),
fields: vec![
"Back".to_string()
],
}
],
},
};
let json = serde_json::to_string_pretty(&request).unwrap();
assert_eq!(
json,
r#"{
"note": {
"id": 1514547547030,
"fields": {
"Back": "new back content",
"Front": "new front content"
},
"audio": [
{
"filename": "yomichan_ねこ_猫.mp3",
"fields": [
"Front"
],
"url": "https://assets.languagepod101.com/dictionary/japanese/audiomp3.php?kanji=猫&kana=ねこ",
"skipHash": "7e2c2f954ef6051373ba916f000168dc"
}
],
"video": [
{
"filename": "countdown.mp4",
"fields": [
"Back"
],
"url": "https://cdn.videvo.net/videvo_files/video/free/2015-06/small_watermarked/Contador_Glam_preview.mp4",
"skipHash": "4117e8aab0d37534d9c8eac362388bbe"
}
],
"picture": [
{
"filename": "black_cat.jpg",
"fields": [
"Back"
],
"url": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c7/A_black_cat_named_Tilly.jpg/220px-A_black_cat_named_Tilly.jpg",
"skipHash": "8d6e4646dfae812bf39651b59d7429ce"
}
]
}
}"#
);
}
#[test]
fn test_serialize_no_media() {
let request = UpdateNoteFieldsRequest {
note: UpdateNoteFieldsEntry {
id: 1514547547030,
..Default::default()
},
};
let json = serde_json::to_string_pretty(&request).unwrap();
assert_eq!(
json,
r#"{
"note": {
"id": 1514547547030,
"fields": {}
}
}"#
);
}
}