1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
use crate::paths;
use crate::settings::{load_app_settings, SharedAppSettings};
use factorio_bot_core::miette::{IntoDiagnostic, Result};
use factorio_bot_core::process::process_control::{FactorioInstance, SharedFactorioInstance};
use std::fs::create_dir_all;
use std::sync::Arc;
use tokio::sync::RwLock;
use tokio::task::JoinHandle;

pub type SharedJoinShandle<T> = Arc<RwLock<Option<JoinHandle<T>>>>;
pub type SharedRestApiHandle = SharedJoinShandle<Result<()>>;

#[derive(Clone)]
pub struct Context {
  pub instance_state: SharedFactorioInstance,
  pub app_settings: SharedAppSettings,
  pub restapi_handle: SharedRestApiHandle,
}

impl Context {
  pub fn new() -> Result<Self> {
    color_eyre::install().expect("failed to colorize panics");
    #[cfg(feature = "tokio-console")]
    {
      console_subscriber::init();
    }

    create_dir_all(paths::data_local_dir()).into_diagnostic()?;
    create_dir_all(paths::workspace_dir()).into_diagnostic()?;

    let context = Context {
      instance_state: FactorioInstance::new_shared(),
      restapi_handle: Arc::new(RwLock::new(None)),
      app_settings: load_app_settings()?.into_shared(),
    };

    Ok(context)
  }
}