///|
fn is_ice_character(value : UInt16) -> Bool {
  (value >= 'a' && value <= 'z') ||
  (value >= 'A' && value <= 'Z') ||
  (value >= '0' && value <= '9') ||
  value == '+' ||
  value == '/'
}

///|
pub struct IceCredentials {
  username_fragment : String
  password : String
} derive(Debug, Eq)

///|
pub fn IceCredentials::new(
  username_fragment~ : String,
  password~ : String,
) -> IceCredentials raise IceError {
  if username_fragment.length() < 4 || username_fragment.length() > 256 {
    raise InvalidCredentials
  }
  if password.length() < 22 || password.length() > 256 {
    raise InvalidCredentials
  }
  for character in username_fragment.code_units() {
    if !is_ice_character(character) {
      raise InvalidCredentials
    }
  }
  for character in password.code_units() {
    if character < 0x21 || character > 0x7e {
      raise InvalidCredentials
    }
  }
  { username_fragment, password, }
}

///|
pub fn IceCredentials::username_fragment(self : IceCredentials) -> String {
  self.username_fragment
}

///|
pub fn IceCredentials::password(self : IceCredentials) -> String {
  self.password
}