///|
/// A single Prometheus label pair.
pub(all) struct Label {
  name : String
  value : String
} derive(Debug, Eq, Hash)

///|
/// Errors shared by metric constructors and update operations.
pub(all) suberror MetricError {
  InvalidName(String)
  InvalidLabelName(String)
  DuplicateLabelName(String)
  ReservedLabelName(String)
  InvalidHelp(String)
  InvalidUnit(String)
  NegativeCounterDelta(Double)
  NonFiniteCounterDelta(Double)
  InvalidBucketOrder
  InvalidBucketBoundary(Double)
  NonFiniteObservation
} derive(Debug, Eq)

///|
pub fn validate_metric_name(name : String) -> Unit raise MetricError {
  if !is_valid_metric_name(name) {
    raise InvalidName(name)
  }
}

///|
pub fn validate_help(help : String) -> Unit raise MetricError {
  if help.contains("\n") || help.contains("\r") {
    raise InvalidHelp("HELP text cannot contain a line break")
  }
}

///|
pub fn validate_unit(unit : String) -> Unit raise MetricError {
  if !is_valid_identifier(unit, false) {
    raise InvalidUnit(unit)
  }
}