use core::fmt;
use crate::prompt::{self, PromptResult};
#[derive(Clone, Debug)]
pub struct ReviewRow {
pub name: String,
pub line: String,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum ReviewAction {
Continue,
Change(usize),
}
pub fn prompt(rows: &[ReviewRow]) -> PromptResult<ReviewAction> {
let width = rows
.iter()
.map(|row| row.name.chars().count())
.max()
.unwrap_or_default();
for row in rows {
eprintln!("{:<width$} {}", row.name, row.line);
}
let mut items = vec![Item {
action: ReviewAction::Continue,
label: String::from("Continue"),
}];
items.extend(rows.iter().enumerate().map(|(index, row)| Item {
action: ReviewAction::Change(index),
label: format!("Change {}", row.name.to_lowercase()),
}));
let item = prompt::item("What next?", items, None)?;
Ok(item.action)
}
#[derive(Eq, PartialEq)]
struct Item {
action: ReviewAction,
label: String,
}
impl fmt::Display for Item {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str(&self.label)
}
}