thedes_app/root/
game_creation.rs

1use thedes_domain::game::Game;
2use thedes_tui::{core::App, progress_bar};
3use thiserror::Error;
4
5#[derive(Debug, Error)]
6pub enum Error {
7    #[error("Failed to initialize game generator")]
8    Init(
9        #[source]
10        #[from]
11        thedes_gen::InitError,
12    ),
13    #[error("Failed to execute game generator")]
14    Run(
15        #[source]
16        #[from]
17        thedes_gen::Error,
18    ),
19    #[error("Failed to run progress bar")]
20    Bar(
21        #[source]
22        #[from]
23        progress_bar::Error,
24    ),
25}
26
27#[derive(Debug, Clone)]
28pub struct Component {
29    bar: progress_bar::Component,
30}
31
32impl Component {
33    pub fn new() -> Self {
34        Self { bar: progress_bar::Component::new("Creating Game...") }
35    }
36
37    pub async fn run(
38        &self,
39        app: &mut App,
40        config: thedes_gen::Config,
41    ) -> Result<Option<Game>, Error> {
42        let generator = config.finish()?;
43        let monitor = generator.progress_monitor();
44
45        let maybe_game = self
46            .bar
47            .run(app, monitor, async move { generator.execute().await })
48            .await?
49            .transpose()?;
50        Ok(maybe_game)
51    }
52}