///|
/// Parse `moon.pkg` source into the post-processed configuration AST.
pub fn parse_moon_pkg(
  name? : String = "moon.pkg",
  source : String,
) -> (Ast, Array[Report]) {
  let (ast, diagnostics) = parse_string(source, name~)
  (post_process_moon_pkg(ast, diagnostics), diagnostics)
}

///|
/// Parse `moon.mod` source into the post-processed configuration AST.
pub fn parse_moon_mod(
  name? : String = "moon.mod",
  source : String,
) -> (Ast, Array[Report]) {
  let (ast, diagnostics) = parse_string(source, name~)
  (post_process_moon_mod(ast, diagnostics), diagnostics)
}

///|
/// Parse `moon.work` source into the configuration AST.
pub fn parse_moon_work(
  name? : String = "moon.work",
  source : String,
) -> (Ast, Array[Report]) {
  let (ast, diagnostics) = parse_string(source, name~)
  (post_process_moon_work(ast, diagnostics), diagnostics)
}

///|
/// Validate a post-processed `moon.mod` `Ast`.
///
/// Source-level checks that need raw keys, such as duplicate `options(...)`
/// blocks, are handled by `parse_moon_mod`.
pub fn validate_moon_mod(ast : Ast) -> Array[Report] {
  let report = []
  _validate_moon_mod(ast, report)
  return report
}

///|
/// Validate a post-processed `moon.pkg` `Ast`.
///
/// Source-level checks that need raw keys, such as duplicate `options(...)`
/// blocks, are handled by `parse_moon_pkg`.
pub fn validate_moon_pkg(ast : Ast) -> Array[Report] {
  let report = []
  _validate_moon_pkg(ast, report)
  return report
}

///|
/// Validate a `moon.work` `Ast`.
pub fn validate_moon_work(ast : Ast) -> Array[Report] {
  let report = []
  _validate_moon_work(ast, report)
  return report
}