///|
pub fn build(country : String, bban : String) -> Result[Iban, IbanError] {
  let cc = compact_text(country)
  let bb = compact_text(bban)
  if cc.length() != 2 || !is_letter(cc[0]) || !is_letter(cc[1]) {
    return Err(InvalidCountry(cc))
  }
  match charset_offset(bb) {
    Some(offset) => return Err(InvalidCharset(offset))
    None => ()
  }
  match country_spec(cc) {
    None => Err(UnknownCountry(cc))
    Some(spec) => {
      let total = 4 + bb.length()
      if total != spec.length {
        return Err(LengthMismatch(cc, spec.length, total))
      }
      match match_bban_pattern(bb, spec.bban_pattern) {
        Some(offset) => Err(BbanPattern(cc, offset))
        None => {
          let probe = cc + "00" + bb
          let digits = check_digits_from_remainder(remainder97(probe))
          parse(cc + digits + bb)
        }
      }
    }
  }
}

///|
pub fn check_digits_for(
  country : String,
  bban : String,
) -> Result[String, IbanError] {
  match build(country, bban) {
    Ok(iban) => Ok(iban.check_digits)
    Err(err) => Err(err)
  }
}