use serde::{Deserialize, Deserializer, Serialize};
use crate::AnkiRequest;
use crate::entities::DeckConfigId;
#[derive(Default, Debug, Clone, PartialEq, Eq, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct CloneDeckConfigIdRequest {
pub name: String,
pub clone_from: DeckConfigId,
}
#[derive(Default, Debug, Clone, PartialEq, Eq)]
pub struct CloneDeckConfigIdResponse {
pub new_deck_config_id: Option<DeckConfigId>,
}
impl<'de> Deserialize<'de> for CloneDeckConfigIdResponse {
fn deserialize<D>(deserializer: D) -> Result<CloneDeckConfigIdResponse, D::Error>
where
D: Deserializer<'de>,
{
let value: serde_json::Value = Deserialize::deserialize(deserializer)?;
let new_deck_config_id = match value {
serde_json::Value::Number(num) => num.as_i64(),
_ => None,
};
Ok(Self { new_deck_config_id })
}
}
impl AnkiRequest for CloneDeckConfigIdRequest {
type Response = CloneDeckConfigIdResponse;
const ACTION: &'static str = "cloneDeckConfigId";
const VERSION: u8 = 6;
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_serialize() {
let request = CloneDeckConfigIdRequest {
name: "Copy of Default".to_string(),
clone_from: 1,
};
let json = serde_json::to_string_pretty(&request).unwrap();
assert_eq!(
json,
r#"{
"name": "Copy of Default",
"cloneFrom": 1
}"#
);
}
#[test]
fn test_deserialize_success() {
let json = "1502972374573";
let response: <CloneDeckConfigIdRequest as AnkiRequest>::Response =
serde_json::from_str(json).unwrap();
assert_eq!(
response,
CloneDeckConfigIdResponse {
new_deck_config_id: Some(1502972374573)
}
);
}
#[test]
fn test_deserialize_missing_config() {
let json = "false";
let response: <CloneDeckConfigIdRequest as AnkiRequest>::Response =
serde_json::from_str(json).unwrap();
assert_eq!(
response,
CloneDeckConfigIdResponse {
new_deck_config_id: None
}
);
}
}