// Generic JSON helpers for CLI metadata validation.

///|
fn json_exact_object(
  value : Json,
  allowed : Array[String],
  required : Array[String],
  label : String,
) -> Result[Map[String, Json], String] {
  guard value is Object(fields) else {
    return Err(label + " must be an object")
  }
  for key, _ in fields {
    if !allowed.contains(key) {
      return Err(label + " contains unknown field: " + key)
    }
  }
  for key in required {
    if !fields.contains(key) {
      return Err(label + " is missing required field: " + key)
    }
  }
  Ok(fields)
}

///|
fn json_required_string(
  fields : Map[String, Json],
  key : String,
  label : String,
) -> Result[String, String] {
  match fields.get(key) {
    Some(String(value)) if value.trim() != "" => Ok(value)
    _ => Err(label + "." + key + " must be a non-empty string")
  }
}

///|
fn json_required_int(
  fields : Map[String, Json],
  key : String,
  label : String,
) -> Result[Int, String] {
  match fields.get(key) {
    Some(Number(value, repr=_)) if value.to_int().to_double() == value =>
      Ok(value.to_int())
    _ => Err(label + "." + key + " must be an integer")
  }
}

///|