# Copyright (c) 2023 Yuki Kimoto
# MIT License

class Sys::Socket::Sockaddr : pointer {
  version_from Sys;
  use Sys::Socket::Constant as SOCKET;
  use Sys::Socket::Sockaddr::In;
  use Sys::Socket::Sockaddr::In6;
  use Sys::Socket::Sockaddr::Un;
  
  # Interfaces
  interface Cloneable;
  
  # Class methods
  native static method new : Sys::Socket::Sockaddr ();
  
  static method new_with_family : Sys::Socket::Sockaddr ($family : int) {
    
    my $addr = (Sys::Socket::Sockaddr)undef;
    
    if ($family == SOCKET->AF_INET) {
      $addr = Sys::Socket::Sockaddr::In->new;
    }
    elsif ($family == SOCKET->AF_INET6) {
      $addr = Sys::Socket::Sockaddr::In6->new;
    }
    elsif ($family == SOCKET->AF_UNIX) {
      $addr = Sys::Socket::Sockaddr::Un->new;
    }
    else {
      die "The address family $family is not available.";
    }
    
    return $addr;
  }
  
  # Instance methods
  native method DESTROY : void ();
  
  native method sa_family : int ();
  
  native method set_sa_family : void ($family : int);
  
  method size : int () { die "Not implemented."; }
  
  method clone : Sys::Socket::Sockaddr () { die "Not implemented."; }
  
  native method upgrade : Sys::Socket::Sockaddr ();
  
}