///|
pub enum Ipv6Scope {
  Unspecified6
  Loopback6
  Multicast6
  UniqueLocal6
  LinkLocal6
  Documentation6
  Global6
} derive(Eq, Debug)

///|
pub fn Ipv6Scope::to_string(self : Ipv6Scope) -> String {
  match self {
    Unspecified6 => "unspecified"
    Loopback6 => "loopback"
    Multicast6 => "multicast"
    UniqueLocal6 => "unique-local"
    LinkLocal6 => "link-local"
    Documentation6 => "documentation"
    Global6 => "global"
  }
}

///|
pub fn Ipv6Address::scope(self : Ipv6Address) -> Ipv6Scope {
  if self.is_unspecified() {
    Unspecified6
  } else if self.is_loopback() {
    Loopback6
  } else if self.is_multicast() {
    Multicast6
  } else if self.is_unique_local() {
    UniqueLocal6
  } else if self.is_link_local() {
    LinkLocal6
  } else if self.is_documentation() {
    Documentation6
  } else {
    Global6
  }
}

///|
pub fn Ipv6Address::is_documentation(self : Ipv6Address) -> Bool {
  Ipv6Network::parse("2001:db8::/32").unwrap().contains(self)
}

///|
pub fn Ipv6Address::is_global_unicast(self : Ipv6Address) -> Bool {
  self.scope() == Global6
}

///|
pub fn Ipv6Address::is_special_purpose(self : Ipv6Address) -> Bool {
  self.scope() != Global6
}