///|
/// Controls how a class of input characters is handled.
pub(all) enum CharacterPolicy {
  Keep
  Drop
  Reject
} derive(Eq, Debug)

///|
/// Controls ASCII case conversion after character normalization.
pub(all) enum CasePolicy {
  Preserve
  Upper
  Lower
} derive(Eq, Debug)

///|
/// Selects whole-input or token-aware matching.
pub(all) enum TokenPolicy {
  WholeInput
  BestTokenPairs
} derive(Eq, Debug)

///|
/// Configures deterministic name normalization.
pub(all) struct NormalizationConfig {
  case_policy : CasePolicy
  punctuation : CharacterPolicy
  whitespace : CharacterPolicy
  hyphen : CharacterPolicy
  apostrophe : CharacterPolicy
  digits : CharacterPolicy
  fold_latin_diacritics : Bool
  max_input_length : Int
} derive(Eq, Debug)

///|
/// Describes a non-fatal transformation applied during normalization.
pub(all) enum NormalizationNotice {
  CharactersDropped(Int)
  DiacriticsFolded(Int)
  InputTruncated(Int)
} derive(Eq, Debug)

///|
/// Reports invalid configuration or unsupported input.
pub(all) enum NormalizationError {
  InvalidMaximumLength(Int)
  InputTooLong(Int, Int)
  RejectedCharacter(Int, UInt16)
  EmptyNormalizedInput
} derive(Eq, Debug)

///|
/// Contains normalized text, tokens, and transformation evidence.
pub(all) struct NormalizationResult {
  original : String
  normalized : String
  tokens : Array[String]
  notices : Array[NormalizationNotice]
  truncated : Bool
} derive(Eq, Debug)