use super::super::super::app::{App, SecretsPane};
use crate::lookout::app::{KeyPress, Msg};
use crate::lookout::secrets::SecretsModel;
use crate::lookout::view::fixtures;
use ratatui::buffer::Buffer;
use std::collections::HashSet;
pub(super) fn first_row() -> u16 {
10
}
pub(super) fn row_of(buffer: &Buffer, needle: &str) -> u16 {
let area = buffer.area;
(0..area.height)
.find(|&y| {
let line: String = (0..area.width).map(|x| buffer[(x, y)].symbol()).collect();
line.contains(needle)
})
.unwrap_or_else(|| panic!("{needle:?} is not drawn anywhere"))
}
pub(super) fn heading_row() -> u16 {
7
}
pub(super) fn header_environment_count(buffer: &Buffer) -> usize {
let row = row_of(buffer, "environments in this store");
let line: String = (0..buffer.area.width)
.map(|x| buffer[(x, row)].symbol())
.collect();
line.split("environments")
.next()
.and_then(|prefix| prefix.split_whitespace().next_back())
.and_then(|number| number.parse().ok())
.unwrap_or_else(|| panic!("no leading number in {line:?}"))
}
pub(super) const FIRST_DATA_ROW: &str =
"\u{2588}\u{2588}\u{2588}\u{2588}\u{2588}\u{2588}\u{2588}\u{2588}\u{2588} 9 bytes";
pub(super) fn frame_text(buffer: &Buffer) -> String {
(0..buffer.area.height)
.map(|y| {
let line: String = (0..buffer.area.width)
.map(|x| buffer[(x, y)].symbol())
.collect();
format!("{}\n", line.trim_end())
})
.collect()
}
pub(super) fn pane_with_environments(count: usize, tab: usize) -> SecretsPane {
SecretsPane {
model: Box::new(SecretsModel {
environments: (0..count).map(|n| format!("environment-{n:02}")).collect(),
..SecretsModel::default()
}),
tab,
selected: 0,
collapsed: HashSet::new(),
reveal: None,
pending_reveal: None,
armed: None,
typing: None,
}
}
pub(super) fn app_typing(buffer: &str) -> App {
let mut app = fixtures::app_with_secrets_and_control();
app.update(Msg::Key(KeyPress::Confirm));
for typed in buffer.chars() {
app.update(Msg::Key(KeyPress::TextChar(typed)));
}
app
}