use super::dependency_display::{DEP_ID_LIMIT, DepSummary, dependency_legend, format_ids};
mod keymap;
mod layout;
mod runtime;
mod text;
mod view;
pub(crate) use layout::{DisplayRow, PopupContent};
pub(crate) use runtime::ExitMode;
pub(crate) use text::{display_width, wrap};
pub(crate) use view::{BoardView, InputMode, InputSubmission, InputValidation, MIN_COLUMN_WIDTH};
#[cfg(test)]
use layout::column_display_rows;
#[cfg(test)]
use pinto::backlog::ItemId;
#[cfg(test)]
use pinto::service::ReorderTarget;
#[cfg(test)]
use std::collections::HashSet;
pub(crate) async fn run(
columns: Option<&[String]>,
maximize: bool,
search: Option<pinto::service::SearchFilter>,
) -> anyhow::Result<ExitMode> {
let dir = std::env::current_dir()?;
let settings = pinto::service::tui_settings(&dir).await?;
let workflow = settings.workflow;
let display_columns = resolve_display_columns(&workflow, &settings.hidden_columns, columns)?;
let initial_column = columns
.and_then(|columns| columns.first())
.map(String::as_str);
runtime::run(runtime::RunOptions {
dir,
confirm_quit: settings.confirm_quit,
bindings: settings.key_bindings,
markdown: settings.markdown,
timezone: settings.timezone,
display_columns,
initial_column: initial_column.map(str::to_owned),
maximize,
search,
})
.await
}
fn resolve_display_columns(
workflow: &[String],
hidden_columns: &[String],
requested: Option<&[String]>,
) -> anyhow::Result<Vec<String>> {
if let Some(requested) = requested {
if let Some(unknown) = requested
.iter()
.find(|column| !workflow.iter().any(|known| known == *column))
{
anyhow::bail!("column not found: {unknown}");
}
return Ok(workflow
.iter()
.filter(|column| requested.iter().any(|wanted| wanted == *column))
.cloned()
.collect());
}
Ok(workflow
.iter()
.filter(|column| !hidden_columns.iter().any(|hidden| hidden == *column))
.cloned()
.collect())
}
#[cfg(test)]
mod tests;