use std::path::PathBuf;
use serde_json::Value;
use shep_core::protocol::EnvValue;
#[cfg(doc)]
use super::ConfigPane;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum PaneTarget {
Sheep {
name: String,
},
Dog {
name: String,
adopted_path: Option<PathBuf>,
},
SheepDog {
sheep: String,
dog: String,
},
}
impl PaneTarget {
#[must_use]
pub fn name(&self) -> &str {
match self {
Self::Sheep { name } | Self::Dog { name, .. } => name,
Self::SheepDog { sheep, .. } => sheep,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Lock {
Refused,
NoWidget,
SubScreen,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum PaneRow {
Field(usize),
Env(usize),
AddEnv,
}
#[derive(Clone, PartialEq, Eq)]
pub struct FieldValue(Value);
impl FieldValue {
#[must_use]
pub fn as_value(&self) -> &Value {
&self.0
}
#[must_use]
pub fn safe_summary(&self) -> Option<String> {
match &self.0 {
Value::Bool(value) => Some(value.to_string()),
Value::Number(value) => Some(value.to_string()),
Value::Null | Value::String(_) | Value::Array(_) | Value::Object(_) => None,
}
}
}
impl From<Value> for FieldValue {
fn from(value: Value) -> Self {
Self(value)
}
}
impl core::fmt::Debug for FieldValue {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
let kind = match &self.0 {
Value::Null => "null",
Value::Bool(_) => "bool",
Value::Number(_) => "number",
Value::String(_) => "string",
Value::Array(_) => "array",
Value::Object(_) => "object",
};
write!(f, "FieldValue(<{kind}>)")
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum PaneEdit {
Set {
key: String,
value: FieldValue,
},
SetEnv {
key: String,
value: Option<EnvValue>,
},
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn a_field_values_debug_names_no_value() {
for (value, want) in [
(serde_json::json!("/home/ada/secret-project"), "<string>"),
(serde_json::json!(40), "<number>"),
(serde_json::json!(false), "<bool>"),
(serde_json::json!(null), "<null>"),
(serde_json::json!(["--token", "hunter2"]), "<array>"),
(serde_json::json!({ "a": 1 }), "<object>"),
] {
let wrapped: FieldValue = value.into();
assert_eq!(format!("{wrapped:?}"), format!("FieldValue({want})"));
}
}
#[test]
fn a_pane_edits_debug_names_no_value() {
let set = PaneEdit::Set {
key: "cwd".into(),
value: serde_json::json!("/home/ada/secret-project").into(),
};
assert_eq!(
format!("{set:?}"),
r#"Set { key: "cwd", value: FieldValue(<string>) }"#
);
let env = PaneEdit::SetEnv {
key: "DB_PASSWORD".into(),
value: Some("hunter2".to_owned().into()),
};
assert_eq!(
format!("{env:?}"),
r#"SetEnv { key: "DB_PASSWORD", value: Some(EnvValue(<7 bytes>)) }"#
);
}
}