type Inet struct {
IPNet *net .IPNet
Status Status
}
func (dst *Inet ) Set (src interface {}) error {
if src == nil {
*dst = Inet {Status : Null }
return nil
}
if value , ok := src .(interface { Get () interface {} }); ok {
value2 := value .Get ()
if value2 != value {
return dst .Set (value2 )
}
}
switch value := src .(type ) {
case net .IPNet :
*dst = Inet {IPNet : &value , Status : Present }
case net .IP :
if len (value ) == 0 {
*dst = Inet {Status : Null }
} else {
bitCount := len (value ) * 8
mask := net .CIDRMask (bitCount , bitCount )
*dst = Inet {IPNet : &net .IPNet {Mask : mask , IP : value }, Status : Present }
}
case string :
_ , ipnet , err := net .ParseCIDR (value )
if err != nil {
return err
}
*dst = Inet {IPNet : ipnet , Status : Present }
case *net .IPNet :
if value == nil {
*dst = Inet {Status : Null }
} else {
return dst .Set (*value )
}
case *net .IP :
if value == nil {
*dst = Inet {Status : Null }
} else {
return dst .Set (*value )
}
case *string :
if value == nil {
*dst = Inet {Status : Null }
} else {
return dst .Set (*value )
}
default :
if originalSrc , ok := underlyingPtrType (src ); ok {
return dst .Set (originalSrc )
}
return fmt .Errorf ("cannot convert %v to Inet" , value )
}
return nil
}
func (dst Inet ) Get () interface {} {
switch dst .Status {
case Present :
return dst .IPNet
case Null :
return nil
default :
return dst .Status
}
}
func (src *Inet ) AssignTo (dst interface {}) error {
switch src .Status {
case Present :
switch v := dst .(type ) {
case *net .IPNet :
*v = net .IPNet {
IP : make (net .IP , len (src .IPNet .IP )),
Mask : make (net .IPMask , len (src .IPNet .Mask )),
}
copy (v .IP , src .IPNet .IP )
copy (v .Mask , src .IPNet .Mask )
return nil
case *net .IP :
if oneCount , bitCount := src .IPNet .Mask .Size (); oneCount != bitCount {
return fmt .Errorf ("cannot assign %v to %T" , src , dst )
}
*v = make (net .IP , len (src .IPNet .IP ))
copy (*v , src .IPNet .IP )
return nil
default :
if nextDst , retry := GetAssignToDstType (dst ); retry {
return src .AssignTo (nextDst )
}
return fmt .Errorf ("unable to assign to %T" , dst )
}
case Null :
return NullAssignTo (dst )
}
return fmt .Errorf ("cannot decode %#v into %T" , src , dst )
}
func (dst *Inet ) DecodeText (ci *ConnInfo , src []byte ) error {
if src == nil {
*dst = Inet {Status : Null }
return nil
}
var ipnet *net .IPNet
var err error
if ip := net .ParseIP (string (src )); ip != nil {
ipv4 := ip .To4 ()
if ipv4 != nil {
ip = ipv4
}
bitCount := len (ip ) * 8
mask := net .CIDRMask (bitCount , bitCount )
ipnet = &net .IPNet {Mask : mask , IP : ip }
} else {
_, ipnet , err = net .ParseCIDR (string (src ))
if err != nil {
return err
}
}
*dst = Inet {IPNet : ipnet , Status : Present }
return nil
}
func (dst *Inet ) DecodeBinary (ci *ConnInfo , src []byte ) error {
if src == nil {
*dst = Inet {Status : Null }
return nil
}
if len (src ) != 8 && len (src ) != 20 {
return fmt .Errorf ("Received an invalid size for a inet: %d" , len (src ))
}