use serde::{Deserialize, Deserializer, Serialize};
use crate::AnkiRequest;
#[derive(Default, Debug, Clone, PartialEq, Eq, Serialize)]
pub struct RetrieveMediaFileRequest {
pub filename: String,
}
#[derive(Default, Debug, Clone, PartialEq, Eq)]
pub struct RetrieveMediaFileResponse {
pub encoded_bytes: Option<String>,
}
impl<'de> Deserialize<'de> for RetrieveMediaFileResponse {
fn deserialize<D>(deserializer: D) -> Result<RetrieveMediaFileResponse, D::Error>
where
D: Deserializer<'de>,
{
let value: serde_json::Value = Deserialize::deserialize(deserializer)?;
let encoded_bytes = match value {
serde_json::Value::String(s) => Some(s),
_ => None,
};
Ok(Self { encoded_bytes })
}
}
impl AnkiRequest for RetrieveMediaFileRequest {
type Response = RetrieveMediaFileResponse;
const ACTION: &'static str = "retrieveMediaFile";
const VERSION: u8 = 6;
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_serialize() {
let request = RetrieveMediaFileRequest {
filename: "_hello.txt".to_string(),
};
let json = serde_json::to_string_pretty(&request).unwrap();
assert_eq!(
json,
r#"{
"filename": "_hello.txt"
}"#
);
}
#[test]
fn test_deserialize() {
let json = "\"SGVsbG8sIHdvcmxkIQ==\"";
let response: <RetrieveMediaFileRequest as AnkiRequest>::Response =
serde_json::from_str(json).unwrap();
assert_eq!(
response,
RetrieveMediaFileResponse {
encoded_bytes: Some("SGVsbG8sIHdvcmxkIQ==".to_string())
}
);
}
#[test]
fn test_deserialize_missing_file() {
let json = "false";
let response: <RetrieveMediaFileRequest as AnkiRequest>::Response =
serde_json::from_str(json).unwrap();
assert_eq!(
response,
RetrieveMediaFileResponse {
encoded_bytes: None
}
);
}
}