thedes_app/root/
game_creation.rs1use 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}