use serde::Serialize;
use crate::client::AnkiClient;
use crate::error::Result;
use crate::types::{CardAnswer, CardInfo, CardModTime};
#[derive(Debug)]
pub struct CardActions<'a> {
pub(crate) client: &'a AnkiClient,
}
#[derive(Serialize)]
struct FindCardsParams<'a> {
query: &'a str,
}
#[derive(Serialize)]
struct CardsInfoParams<'a> {
cards: &'a [i64],
}
#[derive(Serialize)]
struct SuspendParams<'a> {
cards: &'a [i64],
}
#[derive(Serialize)]
struct SuspendedParams {
card: i64,
}
#[derive(Serialize)]
struct GetIntervalsParams<'a> {
cards: &'a [i64],
complete: bool,
}
#[derive(Serialize)]
#[serde(rename_all = "camelCase")]
struct SetEaseFactorsParams<'a> {
cards: &'a [i64],
ease_factors: &'a [i64],
}
#[derive(Serialize)]
struct AnswerCardsParams<'a> {
answers: &'a [CardAnswer],
}
#[derive(Serialize)]
struct SetDueDateParams<'a> {
cards: &'a [i64],
days: &'a str,
}
#[derive(Serialize)]
#[serde(rename_all = "camelCase")]
struct SetSpecificValueParams<'a> {
card: i64,
keys: &'a [&'a str],
new_values: &'a [&'a str],
warning_check: bool,
}
impl<'a> CardActions<'a> {
pub async fn find(&self, query: &str) -> Result<Vec<i64>> {
self.client
.invoke("findCards", FindCardsParams { query })
.await
}
pub async fn info(&self, card_ids: &[i64]) -> Result<Vec<CardInfo>> {
self.client
.invoke("cardsInfo", CardsInfoParams { cards: card_ids })
.await
}
pub async fn to_notes(&self, card_ids: &[i64]) -> Result<Vec<i64>> {
self.client
.invoke("cardsToNotes", CardsInfoParams { cards: card_ids })
.await
}
pub async fn mod_time(&self, card_ids: &[i64]) -> Result<Vec<CardModTime>> {
self.client
.invoke("cardsModTime", CardsInfoParams { cards: card_ids })
.await
}
pub async fn suspend(&self, card_ids: &[i64]) -> Result<bool> {
self.client
.invoke("suspend", SuspendParams { cards: card_ids })
.await
}
pub async fn unsuspend(&self, card_ids: &[i64]) -> Result<bool> {
self.client
.invoke("unsuspend", SuspendParams { cards: card_ids })
.await
}
pub async fn is_suspended(&self, card_id: i64) -> Result<bool> {
self.client
.invoke("suspended", SuspendedParams { card: card_id })
.await
}
pub async fn are_suspended(&self, card_ids: &[i64]) -> Result<Vec<Option<bool>>> {
self.client
.invoke("areSuspended", CardsInfoParams { cards: card_ids })
.await
}
pub async fn are_due(&self, card_ids: &[i64]) -> Result<Vec<bool>> {
self.client
.invoke("areDue", CardsInfoParams { cards: card_ids })
.await
}
pub async fn intervals(
&self,
card_ids: &[i64],
complete: bool,
) -> Result<Vec<serde_json::Value>> {
self.client
.invoke(
"getIntervals",
GetIntervalsParams {
cards: card_ids,
complete,
},
)
.await
}
pub async fn get_ease(&self, card_ids: &[i64]) -> Result<Vec<i64>> {
self.client
.invoke("getEaseFactors", CardsInfoParams { cards: card_ids })
.await
}
pub async fn set_ease(&self, card_ids: &[i64], ease_factors: &[i64]) -> Result<Vec<bool>> {
self.client
.invoke(
"setEaseFactors",
SetEaseFactorsParams {
cards: card_ids,
ease_factors,
},
)
.await
}
pub async fn forget(&self, card_ids: &[i64]) -> Result<()> {
self.client
.invoke_void("forgetCards", CardsInfoParams { cards: card_ids })
.await
}
pub async fn relearn(&self, card_ids: &[i64]) -> Result<()> {
self.client
.invoke_void("relearnCards", CardsInfoParams { cards: card_ids })
.await
}
pub async fn answer(&self, answers: &[CardAnswer]) -> Result<Vec<bool>> {
self.client
.invoke("answerCards", AnswerCardsParams { answers })
.await
}
pub async fn set_due_date(&self, card_ids: &[i64], days: &str) -> Result<bool> {
self.client
.invoke(
"setDueDate",
SetDueDateParams {
cards: card_ids,
days,
},
)
.await
}
pub async fn set_specific_value(
&self,
card_id: i64,
keys: &[&str],
values: &[&str],
warning_check: bool,
) -> Result<Vec<bool>> {
self.client
.invoke(
"setSpecificValueOfCard",
SetSpecificValueParams {
card: card_id,
keys,
new_values: values,
warning_check,
},
)
.await
}
}