Skip to content

Commit 47db0bb

Browse files
committed
Move lesson to state
compare with is_empty instead of "" tmp
1 parent f410a3f commit 47db0bb

File tree

3 files changed

+61
-39
lines changed

3 files changed

+61
-39
lines changed

src/config.rs

Lines changed: 8 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use thiserror::Error;
1010
use crate::{environment, Result};
1111
pub use index::IndexRecord;
1212
pub use lesson::Exercise;
13-
use lesson::{Lesson, LessonPage};
13+
pub use lesson::Lesson;
1414

1515
#[derive(Deserialize, Serialize, Default)]
1616
pub struct Configuration {
@@ -26,12 +26,11 @@ pub struct Configuration {
2626

2727
#[derive(Debug, Clone, Default)]
2828
pub struct Config {
29-
pub lesson: Lesson,
3029
pub index: Index,
3130
pub current_keyboard: String,
32-
current_lesson: String,
33-
current_page: usize,
34-
current_exercise: usize,
31+
pub current_lesson: String,
32+
pub current_page: usize,
33+
pub current_exercise: usize,
3534
}
3635

3736
impl Config {
@@ -67,15 +66,13 @@ impl Config {
6766
} else {
6867
Configuration {
6968
current_keyboard: "querty".to_string(),
70-
current_lesson: "l01_intro".to_string(),
69+
current_lesson: "".to_string(),
7170
..Configuration::default()
7271
}
7372
};
7473

75-
let lesson = Lesson::load(Self::data_dir().join(format!("{}.yaml", current_lesson)))?;
7674
let index = Index::load(Self::data_dir().join("index.yaml"))?;
7775
Ok(Config {
78-
lesson,
7976
index,
8077
current_keyboard,
8178
current_lesson,
@@ -100,30 +97,19 @@ impl Config {
10097
Ok(())
10198
}
10299

103-
pub fn get_page(&self) -> Option<&LessonPage> {
104-
self.lesson.pages.get(self.current_page)
105-
}
106-
107100
// If current_page goes out of index, lesson is considered finished
108101
// and index page is shown.
109102
pub fn next_page(&mut self) {
110103
self.current_exercise = 0;
111104
self.current_page += 1;
112105
}
113106

114-
pub fn load_lesson(&mut self, file_name: &str) -> Result<()> {
115-
self.lesson = Lesson::load(Self::data_dir().join(format!("{}.yaml", file_name)))?;
107+
pub fn load_lesson(&mut self, file_name: &str) -> Result<Lesson> {
108+
let lesson = Lesson::load(Self::data_dir().join(format!("{}.yaml", file_name)))?;
116109
self.current_lesson = file_name.to_string();
117110
self.current_exercise = 0;
118111
self.current_page = 0;
119-
Ok(())
120-
}
121-
122-
pub fn get_exercise(&self) -> Option<&Exercise> {
123-
match self.get_page() {
124-
Some(page) => page.exercises.get(self.current_exercise),
125-
None => None,
126-
}
112+
Ok(lesson)
127113
}
128114
}
129115

src/config/lesson.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,17 @@ impl Lesson {
3333
serde_yaml::from_str(&content).map_err(|e| Error::Parse(e.to_string()))?;
3434
Ok(lesson)
3535
}
36+
37+
pub fn get_page(&self, page_index: usize) -> Option<&LessonPage> {
38+
self.pages.get(page_index)
39+
}
40+
41+
pub fn get_exercise(&self, current_page: usize, current_exercise: usize) -> Option<&Exercise> {
42+
match self.get_page(current_page) {
43+
Some(page) => page.exercises.get(current_exercise),
44+
None => None,
45+
}
46+
}
3647
}
3748

3849
#[derive(Debug, Error, Clone)]

src/main.rs

Lines changed: 42 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use iced::{
1616
};
1717
use serde_json::json;
1818

19-
use crate::keyboard_config::KeyboardConfig;
19+
use crate::{config::Lesson, keyboard_config::KeyboardConfig};
2020

2121
mod config;
2222
mod environment;
@@ -44,6 +44,7 @@ fn main() -> iced::Result {
4444
#[derive(Default)]
4545
struct Raiti {
4646
config: Config,
47+
lesson: Option<Lesson>,
4748
exercise: Vec<Exercise>,
4849
was_errors: u64,
4950
was_wpm: f64,
@@ -73,9 +74,19 @@ impl Raiti {
7374
)
7475
.expect("Error loading keyboard config");
7576

77+
let lesson = if !config.current_lesson.is_empty() {
78+
Some(
79+
Lesson::load(Config::data_dir().join(format!("{}.yaml", config.current_lesson)))
80+
.expect("Error loading lesson"),
81+
)
82+
} else {
83+
None
84+
};
85+
7686
(
7787
Self {
7888
config: config.clone(),
89+
lesson,
7990
exercise: vec![],
8091
keyboard: KeyboardComponent::new(keyboard_config),
8192
..Default::default()
@@ -155,7 +166,11 @@ impl Raiti {
155166
}
156167
Message::LessonSelected(lesson) => {
157168
// TODO: find a way to fail lesson load without unwrap
158-
self.config.load_lesson(&lesson.file).unwrap();
169+
self.lesson = Some(
170+
self.config
171+
.load_lesson(&lesson.file)
172+
.expect("Error loading lesson"),
173+
);
159174
Task::none()
160175
}
161176
Message::Confirm => self.exit_with_save(),
@@ -183,7 +198,10 @@ impl Raiti {
183198
.center_y(Length::Fill)
184199
.into();
185200
}
186-
if let Some(page) = self.config.get_page() {
201+
if let Some(lesson) = &self.lesson {
202+
let page = lesson
203+
.get_page(self.config.current_page)
204+
.expect("No page found");
187205
let title = text(&page.title).size(25);
188206
let mut page_content = column![title];
189207
let reg = Handlebars::new();
@@ -243,30 +261,37 @@ impl Raiti {
243261
self.exercise.clear();
244262
self.keyboard.update(keyboard_component::Message::ClearKeys);
245263
self.config.next_page();
246-
if let Some(page) = self.config.get_page() {
264+
if let Some(lesson) = &self.lesson {
265+
let page = lesson
266+
.get_page(self.config.current_page)
267+
.expect("No page found");
247268
if !page.show_keys.is_empty() {
248269
self.keyboard
249270
.update(keyboard_component::Message::SetShowKeys(
250271
page.show_keys.clone(),
251272
))
252273
}
253274
}
254-
if let Some(ex) = self.config.get_exercise() {
255-
match ex {
256-
config::Exercise::None => {}
257-
config::Exercise::OneLineNoEnter(line) => {
258-
self.exercise.push(Exercise::new(line));
259-
}
260-
config::Exercise::Multiline(lines) => {
261-
for line in lines.lines() {
262-
let mut ex = Exercise::new(line);
263-
if self.exercise.is_empty() {
264-
ex.update(exercise::Message::SetFocus(true))
275+
if let Some(lesson) = &self.lesson {
276+
if let Some(ex) =
277+
lesson.get_exercise(self.config.current_page, self.config.current_exercise)
278+
{
279+
match ex {
280+
config::Exercise::None => {}
281+
config::Exercise::OneLineNoEnter(line) => {
282+
self.exercise.push(Exercise::new(line));
283+
}
284+
config::Exercise::Multiline(lines) => {
285+
for line in lines.lines() {
286+
let mut ex = Exercise::new(line);
287+
if self.exercise.is_empty() {
288+
ex.update(exercise::Message::SetFocus(true))
289+
}
290+
self.exercise.push(ex);
265291
}
266-
self.exercise.push(ex);
267292
}
268293
}
269-
}
294+
};
270295
}
271296
}
272297

0 commit comments

Comments
 (0)