Skip to main content

ankit/types/
deck.rs

1//! Deck-related types.
2
3use serde::{Deserialize, Serialize};
4
5/// Statistics for a deck.
6///
7/// Note: The deck ID is provided as the key in the HashMap returned by
8/// [`DeckActions::stats()`](crate::actions::DeckActions::stats), not as a field here.
9#[derive(Debug, Clone, Deserialize)]
10pub struct DeckStats {
11    /// The deck name.
12    pub name: String,
13    /// Number of new cards.
14    #[serde(default, alias = "newCount", alias = "new_count")]
15    pub new_count: i64,
16    /// Number of cards in learning.
17    #[serde(default, alias = "learnCount", alias = "learn_count")]
18    pub learn_count: i64,
19    /// Number of cards due for review.
20    #[serde(default, alias = "reviewCount", alias = "review_count")]
21    pub review_count: i64,
22    /// Total number of cards in the deck.
23    #[serde(default, alias = "totalInDeck", alias = "total_in_deck")]
24    pub total_in_deck: i64,
25}
26
27/// Configuration for a deck.
28///
29/// This represents the study options for a deck, including settings for
30/// new cards, reviews, and lapses.
31#[derive(Debug, Clone, Serialize, Deserialize)]
32#[serde(rename_all = "camelCase")]
33pub struct DeckConfig {
34    /// The config ID.
35    pub id: i64,
36    /// The config name.
37    pub name: String,
38    /// Maximum reviews per day.
39    #[serde(default)]
40    pub max_taken: i64,
41    /// Whether to replay question audio when showing answer.
42    #[serde(default)]
43    pub replayq: bool,
44    /// Whether this is the autoplay setting.
45    #[serde(default)]
46    pub autoplay: bool,
47    /// Timer setting.
48    #[serde(default)]
49    pub timer: i64,
50    /// New card settings.
51    pub new: NewCardConfig,
52    /// Review settings.
53    pub rev: ReviewConfig,
54    /// Lapse settings.
55    pub lapse: LapseConfig,
56}
57
58/// Configuration for new cards.
59#[derive(Debug, Clone, Serialize, Deserialize)]
60#[serde(rename_all = "camelCase")]
61pub struct NewCardConfig {
62    /// Learning steps in minutes.
63    #[serde(default)]
64    pub delays: Vec<f64>,
65    /// Order of new cards (0 = random, 1 = due).
66    #[serde(default)]
67    pub order: i64,
68    /// Initial ease factor (as integer, e.g., 2500 = 250%).
69    #[serde(default)]
70    pub initial_factor: i64,
71    /// Whether to separate new cards by day.
72    #[serde(default)]
73    pub separate: bool,
74    /// Graduating interval in days.
75    #[serde(default)]
76    pub ints: Vec<i64>,
77    /// Maximum new cards per day.
78    #[serde(default)]
79    pub per_day: i64,
80}
81
82/// Configuration for reviews.
83#[derive(Debug, Clone, Serialize, Deserialize)]
84#[serde(rename_all = "camelCase")]
85pub struct ReviewConfig {
86    /// Maximum reviews per day.
87    #[serde(default)]
88    pub per_day: i64,
89    /// Easy bonus multiplier.
90    #[serde(default)]
91    pub ease4: f64,
92    /// Interval modifier.
93    #[serde(default)]
94    pub fuzz: f64,
95    /// Minimum interval.
96    #[serde(default)]
97    pub min_space: i64,
98    /// Maximum interval in days.
99    #[serde(default)]
100    pub max_ivl: i64,
101    /// Whether to bury related reviews.
102    #[serde(default)]
103    pub bury: bool,
104    /// Hard interval multiplier.
105    #[serde(default)]
106    pub hard_factor: f64,
107}
108
109/// Configuration for lapses.
110#[derive(Debug, Clone, Serialize, Deserialize)]
111#[serde(rename_all = "camelCase")]
112pub struct LapseConfig {
113    /// Relearning steps in minutes.
114    #[serde(default)]
115    pub delays: Vec<f64>,
116    /// Leech threshold.
117    #[serde(default)]
118    pub leech_fails: i64,
119    /// Leech action (0 = suspend, 1 = tag only).
120    #[serde(default)]
121    pub leech_action: i64,
122    /// Minimum interval after lapse.
123    #[serde(default)]
124    pub min_int: i64,
125    /// New interval multiplier after lapse.
126    #[serde(default)]
127    pub mult: f64,
128}