use std::path::Path;
use anyhow::Result;
use crate::config::Config;
use crate::project::ProjectLayout;
use crate::store::Store;
use crate::store::hierarchy::Hierarchy;
mod app;
mod commands;
mod export;
mod focus;
mod interview;
mod map;
mod prompt;
mod render;
mod session;
pub struct WorldbuilderInvocation {
pub session: Option<String>,
pub interview: bool,
pub from_map: bool,
}
pub(crate) fn run(project: &Path, inv: WorldbuilderInvocation) -> Result<()> {
let layout = ProjectLayout::new(project);
layout.require_initialized().map_err(anyhow::Error::from)?;
let cfg = Config::load_layered(&layout.config_path()).map_err(anyhow::Error::from)?;
let store = Store::open(layout.clone(), &cfg).map_err(anyhow::Error::from)?;
let hierarchy = Hierarchy::load(&store).map_err(anyhow::Error::from)?;
launch_tui(layout, cfg, store, hierarchy, inv)
}
fn launch_tui(
layout: ProjectLayout,
cfg: Config,
store: Store,
hierarchy: Hierarchy,
inv: WorldbuilderInvocation,
) -> Result<()> {
crate::tui_host::with_terminal(|terminal| {
use crossterm::event::{DisableMouseCapture, EnableMouseCapture};
let _ = crossterm::execute!(terminal.backend_mut(), EnableMouseCapture);
let mut app = app::WorldbuilderApp::new(layout, cfg, store, hierarchy, inv)?;
let result = app.run(terminal);
let _ = crossterm::execute!(terminal.backend_mut(), DisableMouseCapture);
result
})
}