use crate::core::app::Page;
use crate::core::config::Config;
use crate::git::domain::repository::Repo;
use anyhow::{anyhow, Result};
use ratatui_image::picker::Picker;
use std::path::{Path, PathBuf};
pub fn build_pages(
cfg: &Config,
cwd: &Path,
mut picker: Option<Picker>,
) -> Result<(Vec<Page>, PathBuf)> {
let workdir = Repo::discover(cwd)?.workdir().to_path_buf();
let mut pages = Vec::new();
for name in cfg.pages()? {
let page = match name.as_str() {
"git" => crate::git::page::new_page(cwd, cfg)?.0,
"github" => crate::github::page::new_page(cfg)?,
"files" => crate::files::page::new_page(&workdir, cfg, picker.take())?,
"docker" => crate::docker::page::new_page(cfg)?,
"procs" => crate::procs::page::new_page(cfg)?,
"worktrees" => crate::worktrees::page::new_page(&workdir, cfg)?,
"projects" => crate::projects::page::new_page(cfg)?,
other => {
return Err(anyhow!(
"page {other:?} is configured but has no implementation"
));
}
};
debug_assert_eq!(page.id(), name, "page id must match its config name");
pages.push(page);
}
Ok((pages, workdir))
}