///|
fn slice_bban(bban : String, start : Int, len : Int) -> String? {
  if len <= 0 || start < 0 || start + len > bban.length() {
    None
  } else {
    Some(bban[start:start + len].to_owned())
  }
}

///|
pub fn Iban::bank(self : Iban) -> String? {
  match country_spec(self.country) {
    None => None
    Some(spec) => slice_bban(self.bban, 0, spec.bank)
  }
}

///|
pub fn Iban::branch(self : Iban) -> String? {
  match country_spec(self.country) {
    None => None
    Some(spec) => slice_bban(self.bban, spec.bank, spec.branch)
  }
}

///|
pub fn Iban::account(self : Iban) -> String? {
  match country_spec(self.country) {
    None => None
    Some(spec) => {
      let start = spec.bank + spec.branch
      slice_bban(self.bban, start, spec.account)
    }
  }
}

///|
pub fn Iban::spec(self : Iban) -> CountrySpec? {
  country_spec(self.country)
}