use serde_json::{Map, Value};
use shep_core::config::{AppConfig, ApplyGroup, GROUP_ORDER, apply_group, flockfile_schema_json};
use shep_core::values::{MemSize, UpDuration};
use super::super::field::{FieldSet, ValueKind};
#[cfg(doc)]
use super::ConfigPane;
pub(super) fn render_json(value: &Value) -> String {
match value {
Value::Null => "(unset)".to_owned(),
Value::String(text) => text.clone(),
Value::Bool(flag) => flag.to_string(),
Value::Number(number) => number.to_string(),
other => other.to_string(),
}
}
pub(crate) fn sheep_fields(config: &AppConfig) -> (FieldSet, Map<String, Value>) {
let schema = flockfile_schema_json().to_value();
let defs = schema
.get("$defs")
.and_then(Value::as_object)
.cloned()
.unwrap_or_default();
let properties = defs
.get("AppConfig")
.and_then(|app| app.get("properties"))
.and_then(Value::as_object)
.cloned()
.unwrap_or_default();
let set = FieldSet::from_properties(&properties, &defs, GROUP_ORDER);
let fields = FieldSet::from_fields(
set.fields()
.iter()
.cloned()
.map(|mut field| {
if apply_group(&field.key) == ApplyGroup::Structural {
field.editable = false;
}
field
})
.collect(),
GROUP_ORDER,
);
let values = serde_json::to_value(config)
.ok()
.and_then(|value| value.as_object().cloned())
.unwrap_or_default();
(fields, values)
}
pub(crate) fn resolved_display(fields: &FieldSet, key: &str, raw: &str) -> String {
if raw.is_empty() || !raw.bytes().all(|byte| byte.is_ascii_digit()) {
return raw.to_owned();
}
match fields.by_key(key).and_then(|field| field.value_kind) {
Some(ValueKind::MemSize) => raw
.parse::<MemSize>()
.map_or_else(|_| raw.to_owned(), |_| format!("{raw} B")),
Some(ValueKind::UpDuration) => raw
.parse::<UpDuration>()
.map_or_else(|_| raw.to_owned(), |_| format!("{raw}ms")),
None => raw.to_owned(),
}
}