use super::*;
use crate::lookout::pane::UNSET;
impl Settings {
pub(in crate::lookout::app) fn editor_at_cursor(&self) -> Option<(Target, String)> {
let shape = shep_toml_shape();
let fields = shape.fields.fields();
match self.cursor()? {
SettingsRow::Field(index) => {
let field = &fields[index];
if !field.editable || !is_typed(&field.kind) {
return None;
}
let path = shape.paths.get(&field.key)?.clone();
let kind = Shape::of(&field.kind)?;
Some((
Target::Value { path, shape: kind },
self.snapshot.seed(field),
))
}
SettingsRow::Entry { map, index } => {
let key = &fields[map].key;
let (name, value) = self.snapshot.entries(key).into_iter().nth(index)?;
Some((
Target::Value {
path: vec![key.clone(), name],
shape: Shape::Text,
},
value,
))
}
SettingsRow::AddEntry(map) => Some((
Target::NewEntry {
path: shape.paths.get(&fields[map].key)?.clone(),
},
String::new(),
)),
SettingsRow::DogField { dog, row } => {
let (name, key, seed, secret) = self.dog_field_editor(dog, row)?;
Some((
Target::DogValue {
name,
key,
row,
secret,
},
seed,
))
}
SettingsRow::Table(_)
| SettingsRow::Dog(_)
| SettingsRow::DogKey { .. }
| SettingsRow::DogGrant { .. }
| SettingsRow::DogEnv(_)
| SettingsRow::DogEnvKey { .. }
| SettingsRow::DogEnvNew(_) => None,
}
}
fn dog_field_editor(&self, dog: usize, row: usize) -> Option<(String, String, String, bool)> {
let name = self.snapshot.dogs.get(dog)?.name.clone();
let pane = self.dog_tree(dog)?.pane()?;
let PaneRow::Field(index) = pane.rows().get(row)?.to_owned() else {
return None;
};
let field = pane.fields().fields().get(index)?;
if !field.editable || !is_typed(&field.kind) || pane.lock(&field.key).is_some() {
return None;
}
let shown = pane.value(&field.key);
let seed = if field.secret || shown == UNSET {
String::new()
} else {
shown
};
Some((name, field.key.clone(), seed, field.secret))
}
pub(in crate::lookout::app) fn removal_at_cursor(&self) -> Option<SettingEdit> {
let shape = shep_toml_shape();
let fields = shape.fields.fields();
match self.cursor()? {
SettingsRow::Field(index) => {
let field = &fields[index];
self.snapshot.file_value(&field.key)?;
Some(SettingEdit::Unset {
path: shape.paths.get(&field.key)?.clone(),
})
}
SettingsRow::Entry { map, index } => {
let key = &fields[map].key;
let (name, _) = self.snapshot.entries(key).into_iter().nth(index)?;
Some(SettingEdit::Unset {
path: vec![key.clone(), name],
})
}
SettingsRow::Table(_)
| SettingsRow::AddEntry(_)
| SettingsRow::Dog(_)
| SettingsRow::DogKey { .. }
| SettingsRow::DogGrant { .. }
| SettingsRow::DogEnv(_)
| SettingsRow::DogEnvKey { .. }
| SettingsRow::DogEnvNew(_)
| SettingsRow::DogField { .. } => None,
}
}
}