///|
/// Missing is different from Absent. TooSmallToMeasure means the reader has
/// explicitly identified a visible target without a reproducible measurement.
pub(all) enum Observation {
  Measured(Int)
  Absent
  TooSmallToMeasure
  Missing
  NotEvaluable(String)
} derive(Debug, Eq)

///|
pub(all) struct Measurement {
  lesion_id : String
  observation : Observation
} derive(Debug, Eq)

///|
/// Visits must be in strictly increasing Gregorian YYYY-MM-DD order.
pub(all) struct Visit {
  id : String
  date : String
  technique_id : String
  measurements : Array[Measurement]
} derive(Debug, Eq)