Skip to content

Commit 3ab2b74

Browse files
authored
Merge pull request #14 from youknowedo/dev
dev
2 parents 591a4c8 + 0e5d86d commit 3ab2b74

File tree

16 files changed

+475
-302
lines changed

16 files changed

+475
-302
lines changed

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Deck files
22
deck.json
3-
.logs.json
3+
.log.json
44
.progress.json
55

66
# Added by cargo

src/commands/add.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use clap::Parser;
44
use cursive::views::Dialog;
55
use inquire::Confirm;
66

7-
use crate::config::Config;
7+
use crate::config::{Config, DeckEntry};
88

99
#[derive(Parser, Debug, Clone)]
1010
pub struct AddArgs {
@@ -66,10 +66,7 @@ fn terminal(args: AddArgs) {
6666
}
6767
}
6868

69-
config.decks.push(crate::config::DeckEntry {
70-
id,
71-
path: path.to_str().unwrap().to_string(),
72-
});
69+
config.decks.push(DeckEntry::new(id.clone(), path.clone()));
7370
match config.save() {
7471
Ok(_) => {}
7572
Err(err) => panic!("Could not save config: {}", err),

src/commands/decks/add.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
1-
use std::{fs, path::Path};
1+
use std::fs;
22

33
use clap::Parser;
44
use cursive::views::Dialog;
55
use inquire::{Select, Text};
66

7-
use crate::{config::Config, deck::{Card, Deck}};
7+
use crate::{
8+
config::Config,
9+
deck::{Card, Deck},
10+
};
811

912
#[derive(Parser, Debug, Clone)]
1013
pub struct AddArgs {
@@ -48,7 +51,7 @@ fn terminal(_deck_id: Option<String>, args: AddArgs) {
4851
let deck_entry = config.decks.iter().find(|deck| deck.id == deck_id).unwrap();
4952

5053
// Check if the deck is in path
51-
let deck_path = Path::new(deck_entry.path.as_str()).join("deck.json");
54+
let deck_path = deck_entry.path.join("deck.json");
5255
if !deck_path.exists() {
5356
panic!("Deck not found in path: {}", deck_path.display());
5457
}

src/commands/decks/remove.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use std::{fs, path::Path};
1+
use std::fs;
22

33
use clap::Parser;
44
use cursive::views::Dialog;
@@ -43,7 +43,7 @@ fn terminal(_deck_id: Option<String>, args: RemoveArgs) {
4343
let deck_entry = config.decks.iter().find(|deck| deck.id == deck_id).unwrap();
4444

4545
// Check if the deck is in path
46-
let deck_path = Path::new(deck_entry.path.as_str()).join("deck.json");
46+
let deck_path = deck_entry.path.join("deck.json");
4747
if !deck_path.exists() {
4848
panic!("Deck not found in path: {}", deck_path.display());
4949
}

src/commands/decks/undo.rs

Lines changed: 19 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
1-
use std::{fs, path::Path};
2-
31
use cursive::views::Dialog;
42
use inquire::Select;
53

6-
use crate::{config::Config, deck::Log, progress::Progress};
4+
use crate::{config::Config, deck::Deck};
75

86
pub fn run(_deck_id: Option<String>, siv: &mut Option<&mut cursive::Cursive>) {
97
match siv {
@@ -19,13 +17,7 @@ fn terminal(_deck_id: Option<String>) {
1917
};
2018

2119
let deck_id = match _deck_id {
22-
Some(id) => {
23-
if !config.decks.iter().any(|deck| deck.id == id) {
24-
panic!("Deck not found: {}", id);
25-
}
26-
27-
id
28-
}
20+
Some(id) => id,
2921
None => match Select::new("Select a deck", config.decks.clone()).prompt() {
3022
Ok(selection) => selection.id,
3123
Err(err) => {
@@ -34,65 +26,37 @@ fn terminal(_deck_id: Option<String>) {
3426
},
3527
};
3628

37-
let deck_entry = config.decks.iter().find(|deck| deck.id == deck_id).unwrap();
38-
39-
let progress_path = Path::new(deck_entry.path.as_str()).join(".progress.json");
40-
if !progress_path.exists() {
41-
panic!(
42-
"Progress file not found in path: {}",
43-
progress_path.display()
44-
);
45-
}
46-
let logs_path = Path::new(deck_entry.path.as_str()).join(".logs.json");
47-
if !logs_path.exists() {
48-
panic!("Logs file not found in path: {}", logs_path.display());
49-
}
29+
let deck = match Deck::get(deck_id.clone()) {
30+
Ok(deck) => deck,
31+
Err(err) => {
32+
panic!("Could not get deck: {}", err);
33+
}
34+
};
5035

51-
let mut new_progress = match fs::read_to_string(&progress_path) {
52-
Ok(contents) => match serde_json::from_str::<Progress>(&contents) {
53-
Ok(deck) => deck,
54-
Err(err) => {
55-
panic!("Could not parse deck file: {}", err);
56-
}
57-
},
36+
let mut progress = match deck.progress() {
37+
Ok(progress) => progress,
5838
Err(err) => {
59-
panic!("Could not read deck file: {}", err);
39+
panic!("Could not get progress: {}", err);
6040
}
6141
};
62-
let mut new_logs = match fs::read_to_string(&logs_path) {
63-
Ok(contents) => match serde_json::from_str::<Vec<Log>>(&contents) {
64-
Ok(deck) => deck,
65-
Err(err) => {
66-
panic!("Could not parse deck file: {}", err);
67-
}
68-
},
42+
let mut log = match deck.log() {
43+
Ok(log) => log,
6944
Err(err) => {
70-
panic!("Could not read deck file: {}", err);
45+
panic!("Could not get log: {}", err);
7146
}
7247
};
7348

74-
let last_log = new_logs.pop().unwrap();
49+
let last_log = log.entries.pop().unwrap();
7550
let last_card = last_log.last_card;
7651

7752
// Replace last_progress.card where id == last_card.id with last_card
78-
let last_progress_card_index = new_progress
53+
let last_progress_card_index: usize = progress
7954
.cards
8055
.iter_mut()
8156
.position(|card| card.id == last_card.id)
8257
.unwrap();
83-
new_progress.cards[last_progress_card_index] = last_card;
58+
progress.cards[last_progress_card_index] = last_card;
8459

85-
// write
86-
match fs::write(progress_path, serde_json::to_string(&new_progress).unwrap()) {
87-
Ok(_) => {}
88-
Err(err) => {
89-
panic!("Could not write progress file: {}", err);
90-
}
91-
}
92-
match fs::write(logs_path, serde_json::to_string(&new_logs).unwrap()) {
93-
Ok(_) => {}
94-
Err(err) => {
95-
panic!("Could not write logs file: {}", err);
96-
}
97-
}
60+
progress.save();
61+
log.save();
9862
}

src/commands/init.rs

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use std::{env::current_dir, fs::create_dir_all};
33
use clap::Parser;
44
use inquire::{Confirm, Text};
55

6-
use crate::{config::Config, tui::init_deck::run as tui};
6+
use crate::{config::Config, deck::Deck, tui::init_deck::run as tui};
77

88
#[derive(Parser, Debug, Clone)]
99
pub struct InitArgs {
@@ -93,27 +93,21 @@ fn terminal(args: InitArgs) {
9393
}
9494
}
9595

96-
let deck = crate::deck::Deck {
97-
config: Some(config.clone()),
98-
id: id.clone(),
99-
description: match Text::new("What description should the new deck have?").prompt() {
96+
let deck = Deck::new(
97+
id.clone(),
98+
path.clone(),
99+
match Text::new("What description should the new deck have?").prompt() {
100100
Ok(description) => description,
101101
Err(err) => panic!("Could not read description: {}", err),
102102
},
103-
cards: Vec::new(),
104-
};
103+
);
105104

106-
match deck.save() {
105+
match deck.save() {
107106
Ok(_) => {}
108107
Err(err) => panic!("Could not save deck: {}", err),
109-
};
110-
111-
let deck_entry = crate::config::DeckEntry {
112-
id,
113-
path: path.to_str().unwrap().to_string(),
114108
};
115109

116-
config.decks.push(deck_entry);
110+
config.decks.push(deck.to_entry());
117111

118112
match config.save() {
119113
Ok(_) => {}

src/commands/list.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::{config::Config, tui::deck_select};
1+
use crate::{config::Config, deck::Deck, tui::deck_select};
22

33
pub fn run(siv: &mut Option<&mut cursive::Cursive>) {
44
let config = match Config::get() {
@@ -21,7 +21,10 @@ pub fn run(siv: &mut Option<&mut cursive::Cursive>) {
2121
});
2222
}
2323
None => {
24-
println!("{}", deck.id);
24+
let deck = Deck::get(deck.id).unwrap();
25+
26+
27+
println!("{}: {}", deck.id, deck.cards.len());
2528
}
2629
}
2730
}

src/commands/study.rs

Lines changed: 35 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
1-
use std::{fs, path::Path};
1+
use std::fs;
22

33
use chrono::Utc;
44
use clap::Parser;
55
use inquire::{Select, Text};
66
use rs_fsrs::{Card as FSRSCard, Rating as FSRSRating, FSRS};
77

88
use crate::config::Config;
9-
use crate::deck::{Deck, Log};
10-
use crate::progress::{Progress, ProgressCard, Rating};
9+
use crate::deck::log::LogEntry;
10+
use crate::deck::{
11+
progress::{Progress, ProgressCard, Rating},
12+
Deck,
13+
};
1114
use rand::seq::SliceRandom;
1215

1316
use crate::tui::study::run as tui;
@@ -58,15 +61,11 @@ fn terminal(args: StudyArgs) {
5861
}
5962
},
6063
};
61-
let deck_path = Path::new(deck_entry.path.as_str());
64+
let deck_path = deck_entry.path;
6265

6366
let deck: Deck = match fs::read_to_string(deck_path.join("deck.json")) {
6467
Ok(contents) => match serde_json::from_str::<Deck>(&contents) {
65-
Ok(mut deck) => {
66-
deck.config = Some(config);
67-
68-
deck
69-
}
68+
Ok(deck) => deck,
7069
Err(err) => {
7170
panic!("Could not parse deck file: {}", err);
7271
}
@@ -82,7 +81,7 @@ fn terminal(args: StudyArgs) {
8281

8382
let progress_path = deck_path.join(".progress.json");
8483

85-
let mut new_progress: Progress = match fs::read_to_string(&progress_path) {
84+
let mut progress: Progress = match fs::read_to_string(&progress_path) {
8685
Ok(contents) => match serde_json::from_str(&contents) {
8786
Ok(progress) => progress,
8887
Err(err) => {
@@ -91,23 +90,28 @@ fn terminal(args: StudyArgs) {
9190
},
9291
Err(err) => {
9392
if err.kind() == std::io::ErrorKind::NotFound {
94-
Progress { cards: Vec::new() }
93+
match Progress::get(&deck) {
94+
Ok(progress) => progress,
95+
Err(err) => {
96+
panic!("Could not get progress: {}", err);
97+
}
98+
}
9599
} else {
96100
panic!("Could not read progress file: {}", err);
97101
}
98102
}
99103
};
100104

101105
// Remove any cards that have been removed from the deck by checking ids
102-
new_progress.cards.retain(|progress_card| {
106+
progress.cards.retain(|progress_card| {
103107
deck.cards
104108
.iter()
105109
.find(|card| card.id == progress_card.id)
106110
.is_some()
107111
});
108112

109113
// Get cards from progress whose due date is before now
110-
let mut cards = new_progress
114+
let mut cards = progress
111115
.cards
112116
.iter()
113117
.filter(|progress_card| progress_card.fsrs.due.clone() < now)
@@ -116,7 +120,7 @@ fn terminal(args: StudyArgs) {
116120

117121
// Add any new cards to the progress file
118122
for card in deck.cards.iter() {
119-
if new_progress
123+
if progress
120124
.cards
121125
.iter()
122126
.find(|progress_card| progress_card.id == card.id)
@@ -127,12 +131,12 @@ fn terminal(args: StudyArgs) {
127131
fsrs: FSRSCard::default(),
128132
};
129133

130-
new_progress.cards.push(progress_card.clone());
134+
progress.cards.push(progress_card.clone());
131135
cards.push(progress_card);
132136
}
133137
}
134138

135-
let progress_json = serde_json::to_string_pretty(&new_progress).unwrap();
139+
let progress_json = serde_json::to_string_pretty(&progress).unwrap();
136140
fs::write(&progress_path, progress_json).unwrap();
137141

138142
if cards.is_empty() {
@@ -176,22 +180,27 @@ fn terminal(args: StudyArgs) {
176180
let new_schedule = schedules[&FSRSRating::from(rating)].clone();
177181

178182
// Update card in progress
179-
new_progress
183+
progress
180184
.cards
181185
.iter_mut()
182186
.find(|progress_card| progress_card.id == card.id)
183187
.unwrap()
184188
.fsrs = new_schedule.card;
185189

186-
let progress_json = serde_json::to_string_pretty(&new_progress).unwrap();
187-
fs::write(&progress_path, progress_json).unwrap();
190+
progress.save();
191+
192+
let mut log = match deck.log() {
193+
Ok(log) => log,
194+
Err(err) => {
195+
panic!("Could not get log: {}", err);
196+
}
197+
};
198+
199+
log.entries.push(LogEntry {
200+
last_card: card.clone(),
201+
log: new_schedule.review_log,
202+
});
188203

189-
deck.add_log(
190-
deck.id.clone(),
191-
Log {
192-
last_card: card.clone(),
193-
log: new_schedule.review_log,
194-
},
195-
);
204+
log.save();
196205
}
197206
}

0 commit comments

Comments
 (0)