mirror of
https://github.com/yusing/godoxy.git
synced 2025-05-20 12:42:34 +02:00
38 lines
748 B
Go
38 lines
748 B
Go
package types
|
|
|
|
import (
|
|
"net"
|
|
"strings"
|
|
|
|
E "github.com/yusing/go-proxy/internal/error"
|
|
)
|
|
|
|
type CIDR net.IPNet
|
|
|
|
func (*CIDR) ConvertFrom(val any) (any, E.NestedError) {
|
|
cidr, ok := val.(string)
|
|
if !ok {
|
|
return nil, E.TypeMismatch[string](val)
|
|
}
|
|
|
|
if !strings.Contains(cidr, "/") {
|
|
cidr += "/32" // single IP
|
|
}
|
|
_, ipnet, err := net.ParseCIDR(cidr)
|
|
if err != nil {
|
|
return nil, E.Invalid("CIDR", cidr)
|
|
}
|
|
return (*CIDR)(ipnet), nil
|
|
}
|
|
|
|
func (cidr *CIDR) Contains(ip net.IP) bool {
|
|
return (*net.IPNet)(cidr).Contains(ip)
|
|
}
|
|
|
|
func (cidr *CIDR) String() string {
|
|
return (*net.IPNet)(cidr).String()
|
|
}
|
|
|
|
func (cidr *CIDR) Equals(other *CIDR) bool {
|
|
return (*net.IPNet)(cidr).IP.Equal(other.IP) && cidr.Mask.String() == other.Mask.String()
|
|
}
|