///|
pub struct ValidationPolicy {
  require_catalog_membership : Bool
} derive(Debug, Eq, ToJson)

///|
pub fn ValidationPolicy::permissive() -> ValidationPolicy {
  { require_catalog_membership: false }
}

///|
pub fn ValidationPolicy::strict() -> ValidationPolicy {
  { require_catalog_membership: true }
}

///|
pub fn validate_with_policy(
  catalog : Catalog,
  input : String,
  policy : ValidationPolicy,
) -> ValidationReport {
  let report = validate_against(catalog, input)
  if policy.require_catalog_membership && report.status is Unknown {
    {
      input: report.input,
      normalized: report.normalized,
      status: Invalid,
      chapter: report.chapter,
      entry: report.entry,
      issues: report.issues +
      [
        {
          code: report.normalized.unwrap_or(report.input),
          message: "catalog membership is required by this validation policy",
          hint: "load an authorized catalog containing this code",
        },
      ],
    }
  } else {
    report
  }
}