asimov_dataset_cli/ui/
prepare.rs

1// This is free and unencumbered software released into the public domain.
2
3use std::{collections::VecDeque, path::PathBuf};
4
5/// Prepare contains the UI state of preparation progress.
6#[derive(Debug, Default)]
7pub struct PrepareState {
8    pub current_file: Option<PathBuf>,
9    pub current_file_size: usize,
10    pub current_read_bytes: usize,
11
12    pub queued_files: VecDeque<(PathBuf, usize)>,
13    pub total_bytes: usize,
14
15    pub read_bytes: usize,
16    pub read_files: Vec<PathBuf>,
17    pub read_statements: usize,
18
19    pub prepared_bytes: usize,
20    pub prepared_files: Vec<PathBuf>,
21    pub prepared_statements: usize,
22    pub skipped_statemets: usize,
23}
24
25impl PrepareState {
26    pub fn update_reader_state(&mut self, progress: ReaderProgress) {
27        match self.current_file {
28            Some(ref curr) if *curr == progress.filename => {
29                self.current_read_bytes += progress.bytes;
30            }
31            _ => {
32                let size = self
33                    .queued_files
34                    .iter()
35                    .find(|(name, _size)| *name == progress.filename)
36                    .unwrap()
37                    .1;
38                self.current_file = Some(progress.filename.clone());
39                self.current_file_size = size;
40                self.current_read_bytes = progress.bytes;
41            }
42        }
43
44        self.read_bytes += progress.bytes;
45        self.read_statements += progress.statement_count;
46
47        if progress.finished {
48            self.queued_files
49                .retain(|(name, _size)| *name != progress.filename);
50            self.read_files.push(progress.filename);
51            self.current_file = None;
52        }
53    }
54
55    pub fn update_prepare_state(&mut self, progress: PrepareProgress) {
56        self.prepared_bytes += progress.bytes;
57        self.prepared_statements += progress.statement_count;
58        self.skipped_statemets += progress.skipped_statements;
59        self.prepared_files.push(progress.filename);
60    }
61}
62
63#[derive(Debug, Default)]
64pub struct ReaderProgress {
65    pub filename: PathBuf,
66    pub bytes: usize,
67    pub statement_count: usize,
68    pub finished: bool,
69}
70
71#[derive(Debug, Default)]
72pub struct PrepareProgress {
73    pub filename: PathBuf,
74    pub bytes: usize,
75    pub statement_count: usize,
76    pub skipped_statements: usize,
77}