diff --git a/go.mod b/go.mod index 70acf90b..1f5f5a39 100644 --- a/go.mod +++ b/go.mod @@ -18,6 +18,7 @@ require ( github.com/stretchr/testify v1.8.2 github.com/vishvananda/netlink v1.2.1-beta.2 github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a + golang.org/x/exp v0.0.0-20230519143937-03e91628a987 golang.org/x/net v0.10.0 golang.org/x/sys v0.8.0 golang.org/x/text v0.9.0 diff --git a/go.sum b/go.sum index ab7c70e3..37daf5ba 100644 --- a/go.sum +++ b/go.sum @@ -150,6 +150,8 @@ golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5 golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.6.0 h1:qfktjS5LUO+fFKeJXZ+ikTRijMmljikvG68fpMMruSc= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= +golang.org/x/exp v0.0.0-20230519143937-03e91628a987 h1:3xJIFvzUFbu4ls0BTBYcgbCGhA63eAOEMxIHugyXJqA= +golang.org/x/exp v0.0.0-20230519143937-03e91628a987/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= diff --git a/internal/configuration/settings/dns.go b/internal/configuration/settings/dns.go index 003cf936..47ddcc3f 100644 --- a/internal/configuration/settings/dns.go +++ b/internal/configuration/settings/dns.go @@ -40,7 +40,7 @@ func (d DNS) validate() (err error) { func (d *DNS) Copy() (copied DNS) { return DNS{ ServerAddress: d.ServerAddress, - KeepNameserver: helpers.CopyBoolPtr(d.KeepNameserver), + KeepNameserver: helpers.CopyPointer(d.KeepNameserver), DoT: d.DoT.copy(), } } @@ -49,7 +49,7 @@ func (d *DNS) Copy() (copied DNS) { // unset field of the receiver settings object. func (d *DNS) mergeWith(other DNS) { d.ServerAddress = helpers.MergeWithIP(d.ServerAddress, other.ServerAddress) - d.KeepNameserver = helpers.MergeWithBool(d.KeepNameserver, other.KeepNameserver) + d.KeepNameserver = helpers.MergeWithPointer(d.KeepNameserver, other.KeepNameserver) d.DoT.mergeWith(other.DoT) } @@ -58,14 +58,14 @@ func (d *DNS) mergeWith(other DNS) { // settings. func (d *DNS) overrideWith(other DNS) { d.ServerAddress = helpers.OverrideWithIP(d.ServerAddress, other.ServerAddress) - d.KeepNameserver = helpers.OverrideWithBool(d.KeepNameserver, other.KeepNameserver) + d.KeepNameserver = helpers.OverrideWithPointer(d.KeepNameserver, other.KeepNameserver) d.DoT.overrideWith(other.DoT) } func (d *DNS) setDefaults() { localhost := netip.AddrFrom4([4]byte{127, 0, 0, 1}) d.ServerAddress = helpers.DefaultIP(d.ServerAddress, localhost) - d.KeepNameserver = helpers.DefaultBool(d.KeepNameserver, false) + d.KeepNameserver = helpers.DefaultPointer(d.KeepNameserver, false) d.DoT.setDefaults() } diff --git a/internal/configuration/settings/dnsblacklist.go b/internal/configuration/settings/dnsblacklist.go index 13bb8448..1618de0d 100644 --- a/internal/configuration/settings/dnsblacklist.go +++ b/internal/configuration/settings/dnsblacklist.go @@ -23,9 +23,9 @@ type DNSBlacklist struct { } func (b *DNSBlacklist) setDefaults() { - b.BlockMalicious = helpers.DefaultBool(b.BlockMalicious, true) - b.BlockAds = helpers.DefaultBool(b.BlockAds, false) - b.BlockSurveillance = helpers.DefaultBool(b.BlockSurveillance, true) + b.BlockMalicious = helpers.DefaultPointer(b.BlockMalicious, true) + b.BlockAds = helpers.DefaultPointer(b.BlockAds, false) + b.BlockSurveillance = helpers.DefaultPointer(b.BlockSurveillance, true) } var hostRegex = regexp.MustCompile(`^([a-zA-Z0-9]|[a-zA-Z0-9_][a-zA-Z0-9\-_]{0,61}[a-zA-Z0-9_])(\.([a-zA-Z0-9]|[a-zA-Z0-9_][a-zA-Z0-9\-_]{0,61}[a-zA-Z0-9]))*$`) //nolint:lll @@ -53,34 +53,34 @@ func (b DNSBlacklist) validate() (err error) { func (b DNSBlacklist) copy() (copied DNSBlacklist) { return DNSBlacklist{ - BlockMalicious: helpers.CopyBoolPtr(b.BlockMalicious), - BlockAds: helpers.CopyBoolPtr(b.BlockAds), - BlockSurveillance: helpers.CopyBoolPtr(b.BlockSurveillance), - AllowedHosts: helpers.CopyStringSlice(b.AllowedHosts), - AddBlockedHosts: helpers.CopyStringSlice(b.AddBlockedHosts), - AddBlockedIPs: helpers.CopyNetipAddressesSlice(b.AddBlockedIPs), - AddBlockedIPPrefixes: helpers.CopyNetipPrefixesSlice(b.AddBlockedIPPrefixes), + BlockMalicious: helpers.CopyPointer(b.BlockMalicious), + BlockAds: helpers.CopyPointer(b.BlockAds), + BlockSurveillance: helpers.CopyPointer(b.BlockSurveillance), + AllowedHosts: helpers.CopySlice(b.AllowedHosts), + AddBlockedHosts: helpers.CopySlice(b.AddBlockedHosts), + AddBlockedIPs: helpers.CopySlice(b.AddBlockedIPs), + AddBlockedIPPrefixes: helpers.CopySlice(b.AddBlockedIPPrefixes), } } func (b *DNSBlacklist) mergeWith(other DNSBlacklist) { - b.BlockMalicious = helpers.MergeWithBool(b.BlockMalicious, other.BlockMalicious) - b.BlockAds = helpers.MergeWithBool(b.BlockAds, other.BlockAds) - b.BlockSurveillance = helpers.MergeWithBool(b.BlockSurveillance, other.BlockSurveillance) - b.AllowedHosts = helpers.MergeStringSlices(b.AllowedHosts, other.AllowedHosts) - b.AddBlockedHosts = helpers.MergeStringSlices(b.AddBlockedHosts, other.AddBlockedHosts) - b.AddBlockedIPs = helpers.MergeNetipAddressesSlices(b.AddBlockedIPs, other.AddBlockedIPs) - b.AddBlockedIPPrefixes = helpers.MergeNetipPrefixesSlices(b.AddBlockedIPPrefixes, other.AddBlockedIPPrefixes) + b.BlockMalicious = helpers.MergeWithPointer(b.BlockMalicious, other.BlockMalicious) + b.BlockAds = helpers.MergeWithPointer(b.BlockAds, other.BlockAds) + b.BlockSurveillance = helpers.MergeWithPointer(b.BlockSurveillance, other.BlockSurveillance) + b.AllowedHosts = helpers.MergeSlices(b.AllowedHosts, other.AllowedHosts) + b.AddBlockedHosts = helpers.MergeSlices(b.AddBlockedHosts, other.AddBlockedHosts) + b.AddBlockedIPs = helpers.MergeSlices(b.AddBlockedIPs, other.AddBlockedIPs) + b.AddBlockedIPPrefixes = helpers.MergeSlices(b.AddBlockedIPPrefixes, other.AddBlockedIPPrefixes) } func (b *DNSBlacklist) overrideWith(other DNSBlacklist) { - b.BlockMalicious = helpers.OverrideWithBool(b.BlockMalicious, other.BlockMalicious) - b.BlockAds = helpers.OverrideWithBool(b.BlockAds, other.BlockAds) - b.BlockSurveillance = helpers.OverrideWithBool(b.BlockSurveillance, other.BlockSurveillance) - b.AllowedHosts = helpers.OverrideWithStringSlice(b.AllowedHosts, other.AllowedHosts) - b.AddBlockedHosts = helpers.OverrideWithStringSlice(b.AddBlockedHosts, other.AddBlockedHosts) - b.AddBlockedIPs = helpers.OverrideWithNetipAddressesSlice(b.AddBlockedIPs, other.AddBlockedIPs) - b.AddBlockedIPPrefixes = helpers.OverrideWithNetipPrefixesSlice(b.AddBlockedIPPrefixes, other.AddBlockedIPPrefixes) + b.BlockMalicious = helpers.OverrideWithPointer(b.BlockMalicious, other.BlockMalicious) + b.BlockAds = helpers.OverrideWithPointer(b.BlockAds, other.BlockAds) + b.BlockSurveillance = helpers.OverrideWithPointer(b.BlockSurveillance, other.BlockSurveillance) + b.AllowedHosts = helpers.OverrideWithSlice(b.AllowedHosts, other.AllowedHosts) + b.AddBlockedHosts = helpers.OverrideWithSlice(b.AddBlockedHosts, other.AddBlockedHosts) + b.AddBlockedIPs = helpers.OverrideWithSlice(b.AddBlockedIPs, other.AddBlockedIPs) + b.AddBlockedIPPrefixes = helpers.OverrideWithSlice(b.AddBlockedIPPrefixes, other.AddBlockedIPPrefixes) } func (b DNSBlacklist) ToBlacklistFormat() (settings blacklist.BuilderSettings, err error) { diff --git a/internal/configuration/settings/dot.go b/internal/configuration/settings/dot.go index ae2db543..b85355c1 100644 --- a/internal/configuration/settings/dot.go +++ b/internal/configuration/settings/dot.go @@ -54,8 +54,8 @@ func (d DoT) validate() (err error) { func (d *DoT) copy() (copied DoT) { return DoT{ - Enabled: helpers.CopyBoolPtr(d.Enabled), - UpdatePeriod: helpers.CopyDurationPtr(d.UpdatePeriod), + Enabled: helpers.CopyPointer(d.Enabled), + UpdatePeriod: helpers.CopyPointer(d.UpdatePeriod), Unbound: d.Unbound.copy(), Blacklist: d.Blacklist.copy(), } @@ -64,8 +64,8 @@ func (d *DoT) copy() (copied DoT) { // mergeWith merges the other settings into any // unset field of the receiver settings object. func (d *DoT) mergeWith(other DoT) { - d.Enabled = helpers.MergeWithBool(d.Enabled, other.Enabled) - d.UpdatePeriod = helpers.MergeWithDurationPtr(d.UpdatePeriod, other.UpdatePeriod) + d.Enabled = helpers.MergeWithPointer(d.Enabled, other.Enabled) + d.UpdatePeriod = helpers.MergeWithPointer(d.UpdatePeriod, other.UpdatePeriod) d.Unbound.mergeWith(other.Unbound) d.Blacklist.mergeWith(other.Blacklist) } @@ -74,16 +74,16 @@ func (d *DoT) mergeWith(other DoT) { // settings object with any field set in the other // settings. func (d *DoT) overrideWith(other DoT) { - d.Enabled = helpers.OverrideWithBool(d.Enabled, other.Enabled) - d.UpdatePeriod = helpers.OverrideWithDurationPtr(d.UpdatePeriod, other.UpdatePeriod) + d.Enabled = helpers.OverrideWithPointer(d.Enabled, other.Enabled) + d.UpdatePeriod = helpers.OverrideWithPointer(d.UpdatePeriod, other.UpdatePeriod) d.Unbound.overrideWith(other.Unbound) d.Blacklist.overrideWith(other.Blacklist) } func (d *DoT) setDefaults() { - d.Enabled = helpers.DefaultBool(d.Enabled, true) + d.Enabled = helpers.DefaultPointer(d.Enabled, true) const defaultUpdatePeriod = 24 * time.Hour - d.UpdatePeriod = helpers.DefaultDurationPtr(d.UpdatePeriod, defaultUpdatePeriod) + d.UpdatePeriod = helpers.DefaultPointer(d.UpdatePeriod, defaultUpdatePeriod) d.Unbound.setDefaults() d.Blacklist.setDefaults() } diff --git a/internal/configuration/settings/firewall.go b/internal/configuration/settings/firewall.go index e5786a59..6aa6c988 100644 --- a/internal/configuration/settings/firewall.go +++ b/internal/configuration/settings/firewall.go @@ -40,11 +40,11 @@ func hasZeroPort(ports []uint16) (has bool) { func (f *Firewall) copy() (copied Firewall) { return Firewall{ - VPNInputPorts: helpers.CopyUint16Slice(f.VPNInputPorts), - InputPorts: helpers.CopyUint16Slice(f.InputPorts), - OutboundSubnets: helpers.CopyNetipPrefixesSlice(f.OutboundSubnets), - Enabled: helpers.CopyBoolPtr(f.Enabled), - Debug: helpers.CopyBoolPtr(f.Debug), + VPNInputPorts: helpers.CopySlice(f.VPNInputPorts), + InputPorts: helpers.CopySlice(f.InputPorts), + OutboundSubnets: helpers.CopySlice(f.OutboundSubnets), + Enabled: helpers.CopyPointer(f.Enabled), + Debug: helpers.CopyPointer(f.Debug), } } @@ -53,27 +53,27 @@ func (f *Firewall) copy() (copied Firewall) { // It merges values of slices together, even if they // are set in the receiver settings. func (f *Firewall) mergeWith(other Firewall) { - f.VPNInputPorts = helpers.MergeUint16Slices(f.VPNInputPorts, other.VPNInputPorts) - f.InputPorts = helpers.MergeUint16Slices(f.InputPorts, other.InputPorts) - f.OutboundSubnets = helpers.MergeNetipPrefixesSlices(f.OutboundSubnets, other.OutboundSubnets) - f.Enabled = helpers.MergeWithBool(f.Enabled, other.Enabled) - f.Debug = helpers.MergeWithBool(f.Debug, other.Debug) + f.VPNInputPorts = helpers.MergeSlices(f.VPNInputPorts, other.VPNInputPorts) + f.InputPorts = helpers.MergeSlices(f.InputPorts, other.InputPorts) + f.OutboundSubnets = helpers.MergeSlices(f.OutboundSubnets, other.OutboundSubnets) + f.Enabled = helpers.MergeWithPointer(f.Enabled, other.Enabled) + f.Debug = helpers.MergeWithPointer(f.Debug, other.Debug) } // overrideWith overrides fields of the receiver // settings object with any field set in the other // settings. func (f *Firewall) overrideWith(other Firewall) { - f.VPNInputPorts = helpers.OverrideWithUint16Slice(f.VPNInputPorts, other.VPNInputPorts) - f.InputPorts = helpers.OverrideWithUint16Slice(f.InputPorts, other.InputPorts) - f.OutboundSubnets = helpers.OverrideWithNetipPrefixesSlice(f.OutboundSubnets, other.OutboundSubnets) - f.Enabled = helpers.OverrideWithBool(f.Enabled, other.Enabled) - f.Debug = helpers.OverrideWithBool(f.Debug, other.Debug) + f.VPNInputPorts = helpers.OverrideWithSlice(f.VPNInputPorts, other.VPNInputPorts) + f.InputPorts = helpers.OverrideWithSlice(f.InputPorts, other.InputPorts) + f.OutboundSubnets = helpers.OverrideWithSlice(f.OutboundSubnets, other.OutboundSubnets) + f.Enabled = helpers.OverrideWithPointer(f.Enabled, other.Enabled) + f.Debug = helpers.OverrideWithPointer(f.Debug, other.Debug) } func (f *Firewall) setDefaults() { - f.Enabled = helpers.DefaultBool(f.Enabled, true) - f.Debug = helpers.DefaultBool(f.Debug, false) + f.Enabled = helpers.DefaultPointer(f.Enabled, true) + f.Debug = helpers.DefaultPointer(f.Debug, false) } func (f Firewall) String() string { diff --git a/internal/configuration/settings/health.go b/internal/configuration/settings/health.go index 86c84d73..0c279637 100644 --- a/internal/configuration/settings/health.go +++ b/internal/configuration/settings/health.go @@ -66,10 +66,10 @@ func (h *Health) copy() (copied Health) { // unset field of the receiver settings object. func (h *Health) MergeWith(other Health) { h.ServerAddress = helpers.MergeWithString(h.ServerAddress, other.ServerAddress) - h.ReadHeaderTimeout = helpers.MergeWithDuration(h.ReadHeaderTimeout, other.ReadHeaderTimeout) - h.ReadTimeout = helpers.MergeWithDuration(h.ReadTimeout, other.ReadTimeout) + h.ReadHeaderTimeout = helpers.MergeWithNumber(h.ReadHeaderTimeout, other.ReadHeaderTimeout) + h.ReadTimeout = helpers.MergeWithNumber(h.ReadTimeout, other.ReadTimeout) h.TargetAddress = helpers.MergeWithString(h.TargetAddress, other.TargetAddress) - h.SuccessWait = helpers.MergeWithDuration(h.SuccessWait, other.SuccessWait) + h.SuccessWait = helpers.MergeWithNumber(h.SuccessWait, other.SuccessWait) h.VPN.mergeWith(other.VPN) } @@ -78,22 +78,22 @@ func (h *Health) MergeWith(other Health) { // settings. func (h *Health) OverrideWith(other Health) { h.ServerAddress = helpers.OverrideWithString(h.ServerAddress, other.ServerAddress) - h.ReadHeaderTimeout = helpers.OverrideWithDuration(h.ReadHeaderTimeout, other.ReadHeaderTimeout) - h.ReadTimeout = helpers.OverrideWithDuration(h.ReadTimeout, other.ReadTimeout) + h.ReadHeaderTimeout = helpers.OverrideWithNumber(h.ReadHeaderTimeout, other.ReadHeaderTimeout) + h.ReadTimeout = helpers.OverrideWithNumber(h.ReadTimeout, other.ReadTimeout) h.TargetAddress = helpers.OverrideWithString(h.TargetAddress, other.TargetAddress) - h.SuccessWait = helpers.OverrideWithDuration(h.SuccessWait, other.SuccessWait) + h.SuccessWait = helpers.OverrideWithNumber(h.SuccessWait, other.SuccessWait) h.VPN.overrideWith(other.VPN) } func (h *Health) SetDefaults() { h.ServerAddress = helpers.DefaultString(h.ServerAddress, "127.0.0.1:9999") const defaultReadHeaderTimeout = 100 * time.Millisecond - h.ReadHeaderTimeout = helpers.DefaultDuration(h.ReadHeaderTimeout, defaultReadHeaderTimeout) + h.ReadHeaderTimeout = helpers.DefaultNumber(h.ReadHeaderTimeout, defaultReadHeaderTimeout) const defaultReadTimeout = 500 * time.Millisecond - h.ReadTimeout = helpers.DefaultDuration(h.ReadTimeout, defaultReadTimeout) + h.ReadTimeout = helpers.DefaultNumber(h.ReadTimeout, defaultReadTimeout) h.TargetAddress = helpers.DefaultString(h.TargetAddress, "cloudflare.com:443") const defaultSuccessWait = 5 * time.Second - h.SuccessWait = helpers.DefaultDuration(h.SuccessWait, defaultSuccessWait) + h.SuccessWait = helpers.DefaultNumber(h.SuccessWait, defaultSuccessWait) h.VPN.setDefaults() } diff --git a/internal/configuration/settings/healthywait.go b/internal/configuration/settings/healthywait.go index bf3acb31..28bc9888 100644 --- a/internal/configuration/settings/healthywait.go +++ b/internal/configuration/settings/healthywait.go @@ -27,31 +27,31 @@ func (h HealthyWait) validate() (err error) { // unset field of the receiver settings object. func (h *HealthyWait) copy() (copied HealthyWait) { return HealthyWait{ - Initial: helpers.CopyDurationPtr(h.Initial), - Addition: helpers.CopyDurationPtr(h.Addition), + Initial: helpers.CopyPointer(h.Initial), + Addition: helpers.CopyPointer(h.Addition), } } // mergeWith merges the other settings into any // unset field of the receiver settings object. func (h *HealthyWait) mergeWith(other HealthyWait) { - h.Initial = helpers.MergeWithDurationPtr(h.Initial, other.Initial) - h.Addition = helpers.MergeWithDurationPtr(h.Addition, other.Addition) + h.Initial = helpers.MergeWithPointer(h.Initial, other.Initial) + h.Addition = helpers.MergeWithPointer(h.Addition, other.Addition) } // overrideWith overrides fields of the receiver // settings object with any field set in the other // settings. func (h *HealthyWait) overrideWith(other HealthyWait) { - h.Initial = helpers.OverrideWithDurationPtr(h.Initial, other.Initial) - h.Addition = helpers.OverrideWithDurationPtr(h.Addition, other.Addition) + h.Initial = helpers.OverrideWithPointer(h.Initial, other.Initial) + h.Addition = helpers.OverrideWithPointer(h.Addition, other.Addition) } func (h *HealthyWait) setDefaults() { const initialDurationDefault = 6 * time.Second const additionDurationDefault = 5 * time.Second - h.Initial = helpers.DefaultDurationPtr(h.Initial, initialDurationDefault) - h.Addition = helpers.DefaultDurationPtr(h.Addition, additionDurationDefault) + h.Initial = helpers.DefaultPointer(h.Initial, initialDurationDefault) + h.Addition = helpers.DefaultPointer(h.Addition, additionDurationDefault) } func (h HealthyWait) String() string { diff --git a/internal/configuration/settings/helpers/copy.go b/internal/configuration/settings/helpers/copy.go index 25a1b140..13e52eea 100644 --- a/internal/configuration/settings/helpers/copy.go +++ b/internal/configuration/settings/helpers/copy.go @@ -2,119 +2,19 @@ package helpers import ( "net/netip" - "time" - "github.com/qdm12/log" + "golang.org/x/exp/slices" ) -func CopyStringPtr(original *string) (copied *string) { +func CopyPointer[T any](original *T) (copied *T) { if original == nil { return nil } - copied = new(string) + copied = new(T) *copied = *original return copied } -func CopyBoolPtr(original *bool) (copied *bool) { - if original == nil { - return nil - } - copied = new(bool) - *copied = *original - return copied -} - -func CopyUint8Ptr(original *uint8) (copied *uint8) { - if original == nil { - return nil - } - copied = new(uint8) - *copied = *original - return copied -} - -func CopyUint16Ptr(original *uint16) (copied *uint16) { - if original == nil { - return nil - } - copied = new(uint16) - *copied = *original - return copied -} - -func CopyUint32Ptr(original *uint32) (copied *uint32) { - if original == nil { - return nil - } - copied = new(uint32) - *copied = *original - return copied -} - -func CopyIntPtr(original *int) (copied *int) { - if original == nil { - return nil - } - copied = new(int) - *copied = *original - return copied -} - -func CopyDurationPtr(original *time.Duration) (copied *time.Duration) { - if original == nil { - return nil - } - copied = new(time.Duration) - *copied = *original - return copied -} - -func CopyLogLevelPtr(original *log.Level) (copied *log.Level) { - if original == nil { - return nil - } - copied = new(log.Level) - *copied = *original - return copied -} - -func CopyStringSlice(original []string) (copied []string) { - if original == nil { - return nil - } - - copied = make([]string, len(original)) - copy(copied, original) - return copied -} - -func CopyUint16Slice(original []uint16) (copied []uint16) { - if original == nil { - return nil - } - - copied = make([]uint16, len(original)) - copy(copied, original) - return copied -} - -func CopyNetipPrefixesSlice(original []netip.Prefix) (copied []netip.Prefix) { - if original == nil { - return nil - } - - copied = make([]netip.Prefix, len(original)) - copy(copied, original) - return copied -} - -func CopyNetipAddressesSlice(original []netip.Addr) (copied []netip.Addr) { - if original == nil { - return nil - } - - copied = make([]netip.Addr, len(original)) - copy(copied, original) - return copied +func CopySlice[T string | uint16 | netip.Addr | netip.Prefix](original []T) (copied []T) { + return slices.Clone(original) } diff --git a/internal/configuration/settings/helpers/default.go b/internal/configuration/settings/helpers/default.go index 8ee1abd7..91b94e3c 100644 --- a/internal/configuration/settings/helpers/default.go +++ b/internal/configuration/settings/helpers/default.go @@ -2,56 +2,14 @@ package helpers import ( "net/netip" - "time" - - "github.com/qdm12/log" ) -func DefaultInt(existing *int, defaultValue int) ( - result *int) { +func DefaultPointer[T any](existing *T, defaultValue T) ( + result *T) { if existing != nil { return existing } - result = new(int) - *result = defaultValue - return result -} - -func DefaultUint8(existing *uint8, defaultValue uint8) ( - result *uint8) { - if existing != nil { - return existing - } - result = new(uint8) - *result = defaultValue - return result -} - -func DefaultUint16(existing *uint16, defaultValue uint16) ( - result *uint16) { - if existing != nil { - return existing - } - result = new(uint16) - *result = defaultValue - return result -} -func DefaultUint32(existing *uint32, defaultValue uint32) ( - result *uint32) { - if existing != nil { - return existing - } - result = new(uint32) - *result = defaultValue - return result -} - -func DefaultBool(existing *bool, defaultValue bool) ( - result *bool) { - if existing != nil { - return existing - } - result = new(bool) + result = new(T) *result = defaultValue return result } @@ -64,43 +22,14 @@ func DefaultString(existing string, defaultValue string) ( return defaultValue } -func DefaultStringPtr(existing *string, defaultValue string) (result *string) { - if existing != nil { - return existing - } - result = new(string) - *result = defaultValue - return result -} - -func DefaultDuration(existing time.Duration, - defaultValue time.Duration) (result time.Duration) { +func DefaultNumber[T Number](existing T, defaultValue T) ( //nolint:ireturn + result T) { if existing != 0 { return existing } return defaultValue } -func DefaultDurationPtr(existing *time.Duration, - defaultValue time.Duration) (result *time.Duration) { - if existing != nil { - return existing - } - result = new(time.Duration) - *result = defaultValue - return result -} - -func DefaultLogLevel(existing *log.Level, - defaultValue log.Level) (result *log.Level) { - if existing != nil { - return existing - } - result = new(log.Level) - *result = defaultValue - return result -} - func DefaultIP(existing netip.Addr, defaultValue netip.Addr) ( result netip.Addr) { if existing.IsValid() { diff --git a/internal/configuration/settings/helpers/generics.go b/internal/configuration/settings/helpers/generics.go new file mode 100644 index 00000000..3faa86f5 --- /dev/null +++ b/internal/configuration/settings/helpers/generics.go @@ -0,0 +1,10 @@ +package helpers + +import "time" + +type Number interface { + uint8 | uint16 | uint32 | uint64 | uint | + int8 | int16 | int32 | int64 | int | + float32 | float64 | + time.Duration +} diff --git a/internal/configuration/settings/helpers/merge.go b/internal/configuration/settings/helpers/merge.go index 663a41f7..17d096fe 100644 --- a/internal/configuration/settings/helpers/merge.go +++ b/internal/configuration/settings/helpers/merge.go @@ -1,21 +1,17 @@ package helpers import ( - "fmt" "net/http" "net/netip" - "time" - - "github.com/qdm12/log" ) -func MergeWithBool(existing, other *bool) (result *bool) { +func MergeWithPointer[T any](existing, other *T) (result *T) { if existing != nil { return existing } else if other == nil { return nil } - result = new(bool) + result = new(T) *result = *other return result } @@ -27,114 +23,20 @@ func MergeWithString(existing, other string) (result string) { return other } -func MergeWithInt(existing, other int) (result int) { +func MergeWithNumber[T Number](existing, other T) (result T) { //nolint:ireturn if existing != 0 { return existing } return other } -func MergeWithFloat64(existing, other float64) (result float64) { - if existing != 0 { - return existing - } - return other -} - -func MergeWithStringPtr(existing, other *string) (result *string) { - if existing != nil { - return existing - } else if other == nil { - return nil - } - result = new(string) - *result = *other - return result -} - -func MergeWithIntPtr(existing, other *int) (result *int) { - if existing != nil { - return existing - } else if other == nil { - return nil - } - result = new(int) - *result = *other - return result -} - -func MergeWithUint8(existing, other *uint8) (result *uint8) { - if existing != nil { - return existing - } else if other == nil { - return nil - } - result = new(uint8) - *result = *other - return result -} - -func MergeWithUint16(existing, other *uint16) (result *uint16) { - if existing != nil { - return existing - } else if other == nil { - return nil - } - result = new(uint16) - *result = *other - return result -} - -func MergeWithUint32(existing, other *uint32) (result *uint32) { - if existing != nil { - return existing - } else if other == nil { - return nil - } - result = new(uint32) - *result = *other - return result -} - func MergeWithIP(existing, other netip.Addr) (result netip.Addr) { if existing.IsValid() { return existing - } else if !other.IsValid() { - return existing - } - - result, ok := netip.AddrFromSlice(other.AsSlice()) - if !ok { - panic(fmt.Sprintf("failed copying other address: %s", other)) - } - return result -} - -func MergeWithDuration(existing, other time.Duration) (result time.Duration) { - if existing != 0 { - return existing } return other } -func MergeWithDurationPtr(existing, other *time.Duration) (result *time.Duration) { - if existing != nil { - return existing - } - return other -} - -func MergeWithLogLevel(existing, other *log.Level) (result *log.Level) { - if existing != nil { - return existing - } else if other == nil { - return nil - } - result = new(log.Level) - *result = *other - return result -} - func MergeWithHTTPHandler(existing, other http.Handler) (result http.Handler) { if existing != nil { return existing @@ -142,13 +44,13 @@ func MergeWithHTTPHandler(existing, other http.Handler) (result http.Handler) { return other } -func MergeStringSlices(a, b []string) (result []string) { +func MergeSlices[T comparable](a, b []T) (result []T) { if a == nil && b == nil { return nil } - seen := make(map[string]struct{}, len(a)+len(b)) - result = make([]string, 0, len(a)+len(b)) + seen := make(map[T]struct{}, len(a)+len(b)) + result = make([]T, 0, len(a)+len(b)) for _, s := range a { if _, ok := seen[s]; ok { continue // duplicate @@ -165,79 +67,3 @@ func MergeStringSlices(a, b []string) (result []string) { } return result } - -func MergeUint16Slices(a, b []uint16) (result []uint16) { - if a == nil && b == nil { - return nil - } - - seen := make(map[uint16]struct{}, len(a)+len(b)) - result = make([]uint16, 0, len(a)+len(b)) - for _, n := range a { - if _, ok := seen[n]; ok { - continue // duplicate - } - result = append(result, n) - seen[n] = struct{}{} - } - for _, n := range b { - if _, ok := seen[n]; ok { - continue // duplicate - } - result = append(result, n) - seen[n] = struct{}{} - } - return result -} - -func MergeNetipAddressesSlices(a, b []netip.Addr) (result []netip.Addr) { - if a == nil && b == nil { - return nil - } - - seen := make(map[string]struct{}, len(a)+len(b)) - result = make([]netip.Addr, 0, len(a)+len(b)) - for _, ip := range a { - key := ip.String() - if _, ok := seen[key]; ok { - continue // duplicate - } - result = append(result, ip) - seen[key] = struct{}{} - } - for _, ip := range b { - key := ip.String() - if _, ok := seen[key]; ok { - continue // duplicate - } - result = append(result, ip) - seen[key] = struct{}{} - } - return result -} - -func MergeNetipPrefixesSlices(a, b []netip.Prefix) (result []netip.Prefix) { - if a == nil && b == nil { - return nil - } - - seen := make(map[string]struct{}, len(a)+len(b)) - result = make([]netip.Prefix, 0, len(a)+len(b)) - for _, ipPrefix := range a { - key := ipPrefix.String() - if _, ok := seen[key]; ok { - continue // duplicate - } - result = append(result, ipPrefix) - seen[key] = struct{}{} - } - for _, ipPrefix := range b { - key := ipPrefix.String() - if _, ok := seen[key]; ok { - continue // duplicate - } - result = append(result, ipPrefix) - seen[key] = struct{}{} - } - return result -} diff --git a/internal/configuration/settings/helpers/override.go b/internal/configuration/settings/helpers/override.go index 86d7ba08..8bc45446 100644 --- a/internal/configuration/settings/helpers/override.go +++ b/internal/configuration/settings/helpers/override.go @@ -1,19 +1,15 @@ package helpers import ( - "fmt" "net/http" "net/netip" - "time" - - "github.com/qdm12/log" ) -func OverrideWithBool(existing, other *bool) (result *bool) { +func OverrideWithPointer[T any](existing, other *T) (result *T) { if other == nil { return existing } - result = new(bool) + result = new(T) *result = *other return result } @@ -25,103 +21,20 @@ func OverrideWithString(existing, other string) (result string) { return other } -func OverrideWithInt(existing, other int) (result int) { +func OverrideWithNumber[T Number](existing, other T) (result T) { //nolint:ireturn if other == 0 { return existing } return other } -func OverrideWithFloat64(existing, other float64) (result float64) { - if other == 0 { - return existing - } - return other -} - -func OverrideWithStringPtr(existing, other *string) (result *string) { - if other == nil { - return existing - } - result = new(string) - *result = *other - return result -} - -func OverrideWithIntPtr(existing, other *int) (result *int) { - if other == nil { - return existing - } - result = new(int) - *result = *other - return result -} - -func OverrideWithUint8(existing, other *uint8) (result *uint8) { - if other == nil { - return existing - } - result = new(uint8) - *result = *other - return result -} - -func OverrideWithUint16(existing, other *uint16) (result *uint16) { - if other == nil { - return existing - } - result = new(uint16) - *result = *other - return result -} - -func OverrideWithUint32(existing, other *uint32) (result *uint32) { - if other == nil { - return existing - } - result = new(uint32) - *result = *other - return result -} - func OverrideWithIP(existing, other netip.Addr) (result netip.Addr) { if !other.IsValid() { return existing } - result, ok := netip.AddrFromSlice(other.AsSlice()) - if !ok { - panic(fmt.Sprintf("failed copying other address: %s", other)) - } - return result -} - -func OverrideWithDuration(existing, other time.Duration) ( - result time.Duration) { - if other == 0 { - return existing - } return other } -func OverrideWithDurationPtr(existing, other *time.Duration) ( - result *time.Duration) { - if other == nil { - return existing - } - result = new(time.Duration) - *result = *other - return result -} - -func OverrideWithLogLevel(existing, other *log.Level) (result *log.Level) { - if other == nil { - return existing - } - result = new(log.Level) - *result = *other - return result -} - func OverrideWithHTTPHandler(existing, other http.Handler) (result http.Handler) { if other != nil { return other @@ -129,38 +42,11 @@ func OverrideWithHTTPHandler(existing, other http.Handler) (result http.Handler) return existing } -func OverrideWithStringSlice(existing, other []string) (result []string) { +func OverrideWithSlice[T any](existing, other []T) (result []T) { if other == nil { return existing } - result = make([]string, len(other)) - copy(result, other) - return result -} - -func OverrideWithUint16Slice(existing, other []uint16) (result []uint16) { - if other == nil { - return existing - } - result = make([]uint16, len(other)) - copy(result, other) - return result -} - -func OverrideWithNetipAddressesSlice(existing, other []netip.Addr) (result []netip.Addr) { - if other == nil { - return existing - } - result = make([]netip.Addr, len(other)) - copy(result, other) - return result -} - -func OverrideWithNetipPrefixesSlice(existing, other []netip.Prefix) (result []netip.Prefix) { - if other == nil { - return existing - } - result = make([]netip.Prefix, len(other)) + result = make([]T, len(other)) copy(result, other) return result } diff --git a/internal/configuration/settings/httpproxy.go b/internal/configuration/settings/httpproxy.go index 31823442..15954091 100644 --- a/internal/configuration/settings/httpproxy.go +++ b/internal/configuration/settings/httpproxy.go @@ -56,12 +56,12 @@ func (h HTTPProxy) validate() (err error) { func (h *HTTPProxy) copy() (copied HTTPProxy) { return HTTPProxy{ - User: helpers.CopyStringPtr(h.User), - Password: helpers.CopyStringPtr(h.Password), + User: helpers.CopyPointer(h.User), + Password: helpers.CopyPointer(h.Password), ListeningAddress: h.ListeningAddress, - Enabled: helpers.CopyBoolPtr(h.Enabled), - Stealth: helpers.CopyBoolPtr(h.Stealth), - Log: helpers.CopyBoolPtr(h.Log), + Enabled: helpers.CopyPointer(h.Enabled), + Stealth: helpers.CopyPointer(h.Stealth), + Log: helpers.CopyPointer(h.Log), ReadHeaderTimeout: h.ReadHeaderTimeout, ReadTimeout: h.ReadTimeout, } @@ -70,41 +70,41 @@ func (h *HTTPProxy) copy() (copied HTTPProxy) { // mergeWith merges the other settings into any // unset field of the receiver settings object. func (h *HTTPProxy) mergeWith(other HTTPProxy) { - h.User = helpers.MergeWithStringPtr(h.User, other.User) - h.Password = helpers.MergeWithStringPtr(h.Password, other.Password) + h.User = helpers.MergeWithPointer(h.User, other.User) + h.Password = helpers.MergeWithPointer(h.Password, other.Password) h.ListeningAddress = helpers.MergeWithString(h.ListeningAddress, other.ListeningAddress) - h.Enabled = helpers.MergeWithBool(h.Enabled, other.Enabled) - h.Stealth = helpers.MergeWithBool(h.Stealth, other.Stealth) - h.Log = helpers.MergeWithBool(h.Log, other.Log) - h.ReadHeaderTimeout = helpers.MergeWithDuration(h.ReadHeaderTimeout, other.ReadHeaderTimeout) - h.ReadTimeout = helpers.MergeWithDuration(h.ReadTimeout, other.ReadTimeout) + h.Enabled = helpers.MergeWithPointer(h.Enabled, other.Enabled) + h.Stealth = helpers.MergeWithPointer(h.Stealth, other.Stealth) + h.Log = helpers.MergeWithPointer(h.Log, other.Log) + h.ReadHeaderTimeout = helpers.MergeWithNumber(h.ReadHeaderTimeout, other.ReadHeaderTimeout) + h.ReadTimeout = helpers.MergeWithNumber(h.ReadTimeout, other.ReadTimeout) } // overrideWith overrides fields of the receiver // settings object with any field set in the other // settings. func (h *HTTPProxy) overrideWith(other HTTPProxy) { - h.User = helpers.OverrideWithStringPtr(h.User, other.User) - h.Password = helpers.OverrideWithStringPtr(h.Password, other.Password) + h.User = helpers.OverrideWithPointer(h.User, other.User) + h.Password = helpers.OverrideWithPointer(h.Password, other.Password) h.ListeningAddress = helpers.OverrideWithString(h.ListeningAddress, other.ListeningAddress) - h.Enabled = helpers.OverrideWithBool(h.Enabled, other.Enabled) - h.Stealth = helpers.OverrideWithBool(h.Stealth, other.Stealth) - h.Log = helpers.OverrideWithBool(h.Log, other.Log) - h.ReadHeaderTimeout = helpers.OverrideWithDuration(h.ReadHeaderTimeout, other.ReadHeaderTimeout) - h.ReadTimeout = helpers.OverrideWithDuration(h.ReadTimeout, other.ReadTimeout) + h.Enabled = helpers.OverrideWithPointer(h.Enabled, other.Enabled) + h.Stealth = helpers.OverrideWithPointer(h.Stealth, other.Stealth) + h.Log = helpers.OverrideWithPointer(h.Log, other.Log) + h.ReadHeaderTimeout = helpers.OverrideWithNumber(h.ReadHeaderTimeout, other.ReadHeaderTimeout) + h.ReadTimeout = helpers.OverrideWithNumber(h.ReadTimeout, other.ReadTimeout) } func (h *HTTPProxy) setDefaults() { - h.User = helpers.DefaultStringPtr(h.User, "") - h.Password = helpers.DefaultStringPtr(h.Password, "") + h.User = helpers.DefaultPointer(h.User, "") + h.Password = helpers.DefaultPointer(h.Password, "") h.ListeningAddress = helpers.DefaultString(h.ListeningAddress, ":8888") - h.Enabled = helpers.DefaultBool(h.Enabled, false) - h.Stealth = helpers.DefaultBool(h.Stealth, false) - h.Log = helpers.DefaultBool(h.Log, false) + h.Enabled = helpers.DefaultPointer(h.Enabled, false) + h.Stealth = helpers.DefaultPointer(h.Stealth, false) + h.Log = helpers.DefaultPointer(h.Log, false) const defaultReadHeaderTimeout = time.Second - h.ReadHeaderTimeout = helpers.DefaultDuration(h.ReadHeaderTimeout, defaultReadHeaderTimeout) + h.ReadHeaderTimeout = helpers.DefaultNumber(h.ReadHeaderTimeout, defaultReadHeaderTimeout) const defaultReadTimeout = 3 * time.Second - h.ReadTimeout = helpers.DefaultDuration(h.ReadTimeout, defaultReadTimeout) + h.ReadTimeout = helpers.DefaultNumber(h.ReadTimeout, defaultReadTimeout) } func (h HTTPProxy) String() string { diff --git a/internal/configuration/settings/log.go b/internal/configuration/settings/log.go index c4a65759..0f0269eb 100644 --- a/internal/configuration/settings/log.go +++ b/internal/configuration/settings/log.go @@ -19,25 +19,25 @@ func (l Log) validate() (err error) { func (l *Log) copy() (copied Log) { return Log{ - Level: helpers.CopyLogLevelPtr(l.Level), + Level: helpers.CopyPointer(l.Level), } } // mergeWith merges the other settings into any // unset field of the receiver settings object. func (l *Log) mergeWith(other Log) { - l.Level = helpers.MergeWithLogLevel(l.Level, other.Level) + l.Level = helpers.MergeWithPointer(l.Level, other.Level) } // overrideWith overrides fields of the receiver // settings object with any field set in the other // settings. func (l *Log) overrideWith(other Log) { - l.Level = helpers.OverrideWithLogLevel(l.Level, other.Level) + l.Level = helpers.OverrideWithPointer(l.Level, other.Level) } func (l *Log) setDefaults() { - l.Level = helpers.DefaultLogLevel(l.Level, log.LevelInfo) + l.Level = helpers.DefaultPointer(l.Level, log.LevelInfo) } func (l Log) String() string { diff --git a/internal/configuration/settings/openvpn.go b/internal/configuration/settings/openvpn.go index 4291100c..68980eb5 100644 --- a/internal/configuration/settings/openvpn.go +++ b/internal/configuration/settings/openvpn.go @@ -244,21 +244,21 @@ func validateOpenVPNEncryptedKey(vpnProvider, func (o *OpenVPN) copy() (copied OpenVPN) { return OpenVPN{ Version: o.Version, - User: helpers.CopyStringPtr(o.User), - Password: helpers.CopyStringPtr(o.Password), - ConfFile: helpers.CopyStringPtr(o.ConfFile), - Ciphers: helpers.CopyStringSlice(o.Ciphers), - Auth: helpers.CopyStringPtr(o.Auth), - Cert: helpers.CopyStringPtr(o.Cert), - Key: helpers.CopyStringPtr(o.Key), - EncryptedKey: helpers.CopyStringPtr(o.EncryptedKey), - KeyPassphrase: helpers.CopyStringPtr(o.KeyPassphrase), - PIAEncPreset: helpers.CopyStringPtr(o.PIAEncPreset), - MSSFix: helpers.CopyUint16Ptr(o.MSSFix), + User: helpers.CopyPointer(o.User), + Password: helpers.CopyPointer(o.Password), + ConfFile: helpers.CopyPointer(o.ConfFile), + Ciphers: helpers.CopySlice(o.Ciphers), + Auth: helpers.CopyPointer(o.Auth), + Cert: helpers.CopyPointer(o.Cert), + Key: helpers.CopyPointer(o.Key), + EncryptedKey: helpers.CopyPointer(o.EncryptedKey), + KeyPassphrase: helpers.CopyPointer(o.KeyPassphrase), + PIAEncPreset: helpers.CopyPointer(o.PIAEncPreset), + MSSFix: helpers.CopyPointer(o.MSSFix), Interface: o.Interface, ProcessUser: o.ProcessUser, - Verbosity: helpers.CopyIntPtr(o.Verbosity), - Flags: helpers.CopyStringSlice(o.Flags), + Verbosity: helpers.CopyPointer(o.Verbosity), + Flags: helpers.CopySlice(o.Flags), } } @@ -266,21 +266,21 @@ func (o *OpenVPN) copy() (copied OpenVPN) { // unset field of the receiver settings object. func (o *OpenVPN) mergeWith(other OpenVPN) { o.Version = helpers.MergeWithString(o.Version, other.Version) - o.User = helpers.MergeWithStringPtr(o.User, other.User) - o.Password = helpers.MergeWithStringPtr(o.Password, other.Password) - o.ConfFile = helpers.MergeWithStringPtr(o.ConfFile, other.ConfFile) - o.Ciphers = helpers.MergeStringSlices(o.Ciphers, other.Ciphers) - o.Auth = helpers.MergeWithStringPtr(o.Auth, other.Auth) - o.Cert = helpers.MergeWithStringPtr(o.Cert, other.Cert) - o.Key = helpers.MergeWithStringPtr(o.Key, other.Key) - o.EncryptedKey = helpers.MergeWithStringPtr(o.EncryptedKey, other.EncryptedKey) - o.KeyPassphrase = helpers.MergeWithStringPtr(o.KeyPassphrase, other.KeyPassphrase) - o.PIAEncPreset = helpers.MergeWithStringPtr(o.PIAEncPreset, other.PIAEncPreset) - o.MSSFix = helpers.MergeWithUint16(o.MSSFix, other.MSSFix) + o.User = helpers.MergeWithPointer(o.User, other.User) + o.Password = helpers.MergeWithPointer(o.Password, other.Password) + o.ConfFile = helpers.MergeWithPointer(o.ConfFile, other.ConfFile) + o.Ciphers = helpers.MergeSlices(o.Ciphers, other.Ciphers) + o.Auth = helpers.MergeWithPointer(o.Auth, other.Auth) + o.Cert = helpers.MergeWithPointer(o.Cert, other.Cert) + o.Key = helpers.MergeWithPointer(o.Key, other.Key) + o.EncryptedKey = helpers.MergeWithPointer(o.EncryptedKey, other.EncryptedKey) + o.KeyPassphrase = helpers.MergeWithPointer(o.KeyPassphrase, other.KeyPassphrase) + o.PIAEncPreset = helpers.MergeWithPointer(o.PIAEncPreset, other.PIAEncPreset) + o.MSSFix = helpers.MergeWithPointer(o.MSSFix, other.MSSFix) o.Interface = helpers.MergeWithString(o.Interface, other.Interface) o.ProcessUser = helpers.MergeWithString(o.ProcessUser, other.ProcessUser) - o.Verbosity = helpers.MergeWithIntPtr(o.Verbosity, other.Verbosity) - o.Flags = helpers.MergeStringSlices(o.Flags, other.Flags) + o.Verbosity = helpers.MergeWithPointer(o.Verbosity, other.Verbosity) + o.Flags = helpers.MergeSlices(o.Flags, other.Flags) } // overrideWith overrides fields of the receiver @@ -288,48 +288,48 @@ func (o *OpenVPN) mergeWith(other OpenVPN) { // settings. func (o *OpenVPN) overrideWith(other OpenVPN) { o.Version = helpers.OverrideWithString(o.Version, other.Version) - o.User = helpers.OverrideWithStringPtr(o.User, other.User) - o.Password = helpers.OverrideWithStringPtr(o.Password, other.Password) - o.ConfFile = helpers.OverrideWithStringPtr(o.ConfFile, other.ConfFile) - o.Ciphers = helpers.OverrideWithStringSlice(o.Ciphers, other.Ciphers) - o.Auth = helpers.OverrideWithStringPtr(o.Auth, other.Auth) - o.Cert = helpers.OverrideWithStringPtr(o.Cert, other.Cert) - o.Key = helpers.OverrideWithStringPtr(o.Key, other.Key) - o.EncryptedKey = helpers.OverrideWithStringPtr(o.EncryptedKey, other.EncryptedKey) - o.KeyPassphrase = helpers.OverrideWithStringPtr(o.KeyPassphrase, other.KeyPassphrase) - o.PIAEncPreset = helpers.OverrideWithStringPtr(o.PIAEncPreset, other.PIAEncPreset) - o.MSSFix = helpers.OverrideWithUint16(o.MSSFix, other.MSSFix) + o.User = helpers.OverrideWithPointer(o.User, other.User) + o.Password = helpers.OverrideWithPointer(o.Password, other.Password) + o.ConfFile = helpers.OverrideWithPointer(o.ConfFile, other.ConfFile) + o.Ciphers = helpers.OverrideWithSlice(o.Ciphers, other.Ciphers) + o.Auth = helpers.OverrideWithPointer(o.Auth, other.Auth) + o.Cert = helpers.OverrideWithPointer(o.Cert, other.Cert) + o.Key = helpers.OverrideWithPointer(o.Key, other.Key) + o.EncryptedKey = helpers.OverrideWithPointer(o.EncryptedKey, other.EncryptedKey) + o.KeyPassphrase = helpers.OverrideWithPointer(o.KeyPassphrase, other.KeyPassphrase) + o.PIAEncPreset = helpers.OverrideWithPointer(o.PIAEncPreset, other.PIAEncPreset) + o.MSSFix = helpers.OverrideWithPointer(o.MSSFix, other.MSSFix) o.Interface = helpers.OverrideWithString(o.Interface, other.Interface) o.ProcessUser = helpers.OverrideWithString(o.ProcessUser, other.ProcessUser) - o.Verbosity = helpers.OverrideWithIntPtr(o.Verbosity, other.Verbosity) - o.Flags = helpers.OverrideWithStringSlice(o.Flags, other.Flags) + o.Verbosity = helpers.OverrideWithPointer(o.Verbosity, other.Verbosity) + o.Flags = helpers.OverrideWithSlice(o.Flags, other.Flags) } func (o *OpenVPN) setDefaults(vpnProvider string) { o.Version = helpers.DefaultString(o.Version, openvpn.Openvpn25) - o.User = helpers.DefaultStringPtr(o.User, "") + o.User = helpers.DefaultPointer(o.User, "") if vpnProvider == providers.Mullvad { - o.Password = helpers.DefaultStringPtr(o.Password, "m") + o.Password = helpers.DefaultPointer(o.Password, "m") } else { - o.Password = helpers.DefaultStringPtr(o.Password, "") + o.Password = helpers.DefaultPointer(o.Password, "") } - o.ConfFile = helpers.DefaultStringPtr(o.ConfFile, "") - o.Auth = helpers.DefaultStringPtr(o.Auth, "") - o.Cert = helpers.DefaultStringPtr(o.Cert, "") - o.Key = helpers.DefaultStringPtr(o.Key, "") - o.EncryptedKey = helpers.DefaultStringPtr(o.EncryptedKey, "") - o.KeyPassphrase = helpers.DefaultStringPtr(o.KeyPassphrase, "") + o.ConfFile = helpers.DefaultPointer(o.ConfFile, "") + o.Auth = helpers.DefaultPointer(o.Auth, "") + o.Cert = helpers.DefaultPointer(o.Cert, "") + o.Key = helpers.DefaultPointer(o.Key, "") + o.EncryptedKey = helpers.DefaultPointer(o.EncryptedKey, "") + o.KeyPassphrase = helpers.DefaultPointer(o.KeyPassphrase, "") var defaultEncPreset string if vpnProvider == providers.PrivateInternetAccess { defaultEncPreset = presets.Strong } - o.PIAEncPreset = helpers.DefaultStringPtr(o.PIAEncPreset, defaultEncPreset) - o.MSSFix = helpers.DefaultUint16(o.MSSFix, 0) + o.PIAEncPreset = helpers.DefaultPointer(o.PIAEncPreset, defaultEncPreset) + o.MSSFix = helpers.DefaultPointer(o.MSSFix, 0) o.Interface = helpers.DefaultString(o.Interface, "tun0") o.ProcessUser = helpers.DefaultString(o.ProcessUser, "root") - o.Verbosity = helpers.DefaultInt(o.Verbosity, 1) + o.Verbosity = helpers.DefaultPointer(o.Verbosity, 1) } func (o OpenVPN) String() string { diff --git a/internal/configuration/settings/openvpnselection.go b/internal/configuration/settings/openvpnselection.go index 06b8799d..5b4b89bb 100644 --- a/internal/configuration/settings/openvpnselection.go +++ b/internal/configuration/settings/openvpnselection.go @@ -130,37 +130,37 @@ func (o OpenVPNSelection) validate(vpnProvider string) (err error) { func (o *OpenVPNSelection) copy() (copied OpenVPNSelection) { return OpenVPNSelection{ - ConfFile: helpers.CopyStringPtr(o.ConfFile), - TCP: helpers.CopyBoolPtr(o.TCP), - CustomPort: helpers.CopyUint16Ptr(o.CustomPort), - PIAEncPreset: helpers.CopyStringPtr(o.PIAEncPreset), + ConfFile: helpers.CopyPointer(o.ConfFile), + TCP: helpers.CopyPointer(o.TCP), + CustomPort: helpers.CopyPointer(o.CustomPort), + PIAEncPreset: helpers.CopyPointer(o.PIAEncPreset), } } func (o *OpenVPNSelection) mergeWith(other OpenVPNSelection) { - o.ConfFile = helpers.MergeWithStringPtr(o.ConfFile, other.ConfFile) - o.TCP = helpers.MergeWithBool(o.TCP, other.TCP) - o.CustomPort = helpers.MergeWithUint16(o.CustomPort, other.CustomPort) - o.PIAEncPreset = helpers.MergeWithStringPtr(o.PIAEncPreset, other.PIAEncPreset) + o.ConfFile = helpers.MergeWithPointer(o.ConfFile, other.ConfFile) + o.TCP = helpers.MergeWithPointer(o.TCP, other.TCP) + o.CustomPort = helpers.MergeWithPointer(o.CustomPort, other.CustomPort) + o.PIAEncPreset = helpers.MergeWithPointer(o.PIAEncPreset, other.PIAEncPreset) } func (o *OpenVPNSelection) overrideWith(other OpenVPNSelection) { - o.ConfFile = helpers.OverrideWithStringPtr(o.ConfFile, other.ConfFile) - o.TCP = helpers.OverrideWithBool(o.TCP, other.TCP) - o.CustomPort = helpers.OverrideWithUint16(o.CustomPort, other.CustomPort) - o.PIAEncPreset = helpers.OverrideWithStringPtr(o.PIAEncPreset, other.PIAEncPreset) + o.ConfFile = helpers.OverrideWithPointer(o.ConfFile, other.ConfFile) + o.TCP = helpers.OverrideWithPointer(o.TCP, other.TCP) + o.CustomPort = helpers.OverrideWithPointer(o.CustomPort, other.CustomPort) + o.PIAEncPreset = helpers.OverrideWithPointer(o.PIAEncPreset, other.PIAEncPreset) } func (o *OpenVPNSelection) setDefaults(vpnProvider string) { - o.ConfFile = helpers.DefaultStringPtr(o.ConfFile, "") - o.TCP = helpers.DefaultBool(o.TCP, false) - o.CustomPort = helpers.DefaultUint16(o.CustomPort, 0) + o.ConfFile = helpers.DefaultPointer(o.ConfFile, "") + o.TCP = helpers.DefaultPointer(o.TCP, false) + o.CustomPort = helpers.DefaultPointer(o.CustomPort, 0) var defaultEncPreset string if vpnProvider == providers.PrivateInternetAccess { defaultEncPreset = presets.Strong } - o.PIAEncPreset = helpers.DefaultStringPtr(o.PIAEncPreset, defaultEncPreset) + o.PIAEncPreset = helpers.DefaultPointer(o.PIAEncPreset, defaultEncPreset) } func (o OpenVPNSelection) String() string { diff --git a/internal/configuration/settings/portforward.go b/internal/configuration/settings/portforward.go index 42b83a6d..8de12c20 100644 --- a/internal/configuration/settings/portforward.go +++ b/internal/configuration/settings/portforward.go @@ -47,24 +47,24 @@ func (p PortForwarding) validate(vpnProvider string) (err error) { func (p *PortForwarding) copy() (copied PortForwarding) { return PortForwarding{ - Enabled: helpers.CopyBoolPtr(p.Enabled), - Filepath: helpers.CopyStringPtr(p.Filepath), + Enabled: helpers.CopyPointer(p.Enabled), + Filepath: helpers.CopyPointer(p.Filepath), } } func (p *PortForwarding) mergeWith(other PortForwarding) { - p.Enabled = helpers.MergeWithBool(p.Enabled, other.Enabled) - p.Filepath = helpers.MergeWithStringPtr(p.Filepath, other.Filepath) + p.Enabled = helpers.MergeWithPointer(p.Enabled, other.Enabled) + p.Filepath = helpers.MergeWithPointer(p.Filepath, other.Filepath) } func (p *PortForwarding) overrideWith(other PortForwarding) { - p.Enabled = helpers.OverrideWithBool(p.Enabled, other.Enabled) - p.Filepath = helpers.OverrideWithStringPtr(p.Filepath, other.Filepath) + p.Enabled = helpers.OverrideWithPointer(p.Enabled, other.Enabled) + p.Filepath = helpers.OverrideWithPointer(p.Filepath, other.Filepath) } func (p *PortForwarding) setDefaults() { - p.Enabled = helpers.DefaultBool(p.Enabled, false) - p.Filepath = helpers.DefaultStringPtr(p.Filepath, "/tmp/gluetun/forwarded_port") + p.Enabled = helpers.DefaultPointer(p.Enabled, false) + p.Filepath = helpers.DefaultPointer(p.Filepath, "/tmp/gluetun/forwarded_port") } func (p PortForwarding) String() string { diff --git a/internal/configuration/settings/provider.go b/internal/configuration/settings/provider.go index 1b4ca5db..5d5be6f4 100644 --- a/internal/configuration/settings/provider.go +++ b/internal/configuration/settings/provider.go @@ -58,26 +58,26 @@ func (p *Provider) validate(vpnType string, storage Storage) (err error) { func (p *Provider) copy() (copied Provider) { return Provider{ - Name: helpers.CopyStringPtr(p.Name), + Name: helpers.CopyPointer(p.Name), ServerSelection: p.ServerSelection.copy(), PortForwarding: p.PortForwarding.copy(), } } func (p *Provider) mergeWith(other Provider) { - p.Name = helpers.MergeWithStringPtr(p.Name, other.Name) + p.Name = helpers.MergeWithPointer(p.Name, other.Name) p.ServerSelection.mergeWith(other.ServerSelection) p.PortForwarding.mergeWith(other.PortForwarding) } func (p *Provider) overrideWith(other Provider) { - p.Name = helpers.OverrideWithStringPtr(p.Name, other.Name) + p.Name = helpers.OverrideWithPointer(p.Name, other.Name) p.ServerSelection.overrideWith(other.ServerSelection) p.PortForwarding.overrideWith(other.PortForwarding) } func (p *Provider) setDefaults() { - p.Name = helpers.DefaultStringPtr(p.Name, providers.PrivateInternetAccess) + p.Name = helpers.DefaultPointer(p.Name, providers.PrivateInternetAccess) p.ServerSelection.setDefaults(*p.Name) p.PortForwarding.setDefaults() } diff --git a/internal/configuration/settings/publicip.go b/internal/configuration/settings/publicip.go index 5f33ff90..6ec8ece6 100644 --- a/internal/configuration/settings/publicip.go +++ b/internal/configuration/settings/publicip.go @@ -42,25 +42,25 @@ func (p PublicIP) validate() (err error) { func (p *PublicIP) copy() (copied PublicIP) { return PublicIP{ - Period: helpers.CopyDurationPtr(p.Period), - IPFilepath: helpers.CopyStringPtr(p.IPFilepath), + Period: helpers.CopyPointer(p.Period), + IPFilepath: helpers.CopyPointer(p.IPFilepath), } } func (p *PublicIP) mergeWith(other PublicIP) { - p.Period = helpers.MergeWithDurationPtr(p.Period, other.Period) - p.IPFilepath = helpers.MergeWithStringPtr(p.IPFilepath, other.IPFilepath) + p.Period = helpers.MergeWithPointer(p.Period, other.Period) + p.IPFilepath = helpers.MergeWithPointer(p.IPFilepath, other.IPFilepath) } func (p *PublicIP) overrideWith(other PublicIP) { - p.Period = helpers.OverrideWithDurationPtr(p.Period, other.Period) - p.IPFilepath = helpers.OverrideWithStringPtr(p.IPFilepath, other.IPFilepath) + p.Period = helpers.OverrideWithPointer(p.Period, other.Period) + p.IPFilepath = helpers.OverrideWithPointer(p.IPFilepath, other.IPFilepath) } func (p *PublicIP) setDefaults() { const defaultPeriod = 12 * time.Hour - p.Period = helpers.DefaultDurationPtr(p.Period, defaultPeriod) - p.IPFilepath = helpers.DefaultStringPtr(p.IPFilepath, "/tmp/gluetun/ip") + p.Period = helpers.DefaultPointer(p.Period, defaultPeriod) + p.IPFilepath = helpers.DefaultPointer(p.IPFilepath, "/tmp/gluetun/ip") } func (p PublicIP) String() string { diff --git a/internal/configuration/settings/server.go b/internal/configuration/settings/server.go index ee321bfe..1696e2fa 100644 --- a/internal/configuration/settings/server.go +++ b/internal/configuration/settings/server.go @@ -43,29 +43,29 @@ func (c ControlServer) validate() (err error) { func (c *ControlServer) copy() (copied ControlServer) { return ControlServer{ - Address: helpers.CopyStringPtr(c.Address), - Log: helpers.CopyBoolPtr(c.Log), + Address: helpers.CopyPointer(c.Address), + Log: helpers.CopyPointer(c.Log), } } // mergeWith merges the other settings into any // unset field of the receiver settings object. func (c *ControlServer) mergeWith(other ControlServer) { - c.Address = helpers.MergeWithStringPtr(c.Address, other.Address) - c.Log = helpers.MergeWithBool(c.Log, other.Log) + c.Address = helpers.MergeWithPointer(c.Address, other.Address) + c.Log = helpers.MergeWithPointer(c.Log, other.Log) } // overrideWith overrides fields of the receiver // settings object with any field set in the other // settings. func (c *ControlServer) overrideWith(other ControlServer) { - c.Address = helpers.OverrideWithStringPtr(c.Address, other.Address) - c.Log = helpers.OverrideWithBool(c.Log, other.Log) + c.Address = helpers.OverrideWithPointer(c.Address, other.Address) + c.Log = helpers.OverrideWithPointer(c.Log, other.Log) } func (c *ControlServer) setDefaults() { - c.Address = helpers.DefaultStringPtr(c.Address, ":8000") - c.Log = helpers.DefaultBool(c.Log, true) + c.Address = helpers.DefaultPointer(c.Address, ":8000") + c.Log = helpers.DefaultPointer(c.Log, true) } func (c ControlServer) String() string { diff --git a/internal/configuration/settings/serverselection.go b/internal/configuration/settings/serverselection.go index 2bcc2765..1d7d5852 100644 --- a/internal/configuration/settings/serverselection.go +++ b/internal/configuration/settings/serverselection.go @@ -203,18 +203,18 @@ func (ss *ServerSelection) copy() (copied ServerSelection) { return ServerSelection{ VPN: ss.VPN, TargetIP: ss.TargetIP, - Countries: helpers.CopyStringSlice(ss.Countries), - Regions: helpers.CopyStringSlice(ss.Regions), - Cities: helpers.CopyStringSlice(ss.Cities), - ISPs: helpers.CopyStringSlice(ss.ISPs), - Hostnames: helpers.CopyStringSlice(ss.Hostnames), - Names: helpers.CopyStringSlice(ss.Names), - Numbers: helpers.CopyUint16Slice(ss.Numbers), - OwnedOnly: helpers.CopyBoolPtr(ss.OwnedOnly), - FreeOnly: helpers.CopyBoolPtr(ss.FreeOnly), - PremiumOnly: helpers.CopyBoolPtr(ss.PremiumOnly), - StreamOnly: helpers.CopyBoolPtr(ss.StreamOnly), - MultiHopOnly: helpers.CopyBoolPtr(ss.MultiHopOnly), + Countries: helpers.CopySlice(ss.Countries), + Regions: helpers.CopySlice(ss.Regions), + Cities: helpers.CopySlice(ss.Cities), + ISPs: helpers.CopySlice(ss.ISPs), + Hostnames: helpers.CopySlice(ss.Hostnames), + Names: helpers.CopySlice(ss.Names), + Numbers: helpers.CopySlice(ss.Numbers), + OwnedOnly: helpers.CopyPointer(ss.OwnedOnly), + FreeOnly: helpers.CopyPointer(ss.FreeOnly), + PremiumOnly: helpers.CopyPointer(ss.PremiumOnly), + StreamOnly: helpers.CopyPointer(ss.StreamOnly), + MultiHopOnly: helpers.CopyPointer(ss.MultiHopOnly), OpenVPN: ss.OpenVPN.copy(), Wireguard: ss.Wireguard.copy(), } @@ -223,18 +223,18 @@ func (ss *ServerSelection) copy() (copied ServerSelection) { func (ss *ServerSelection) mergeWith(other ServerSelection) { ss.VPN = helpers.MergeWithString(ss.VPN, other.VPN) ss.TargetIP = helpers.MergeWithIP(ss.TargetIP, other.TargetIP) - ss.Countries = helpers.MergeStringSlices(ss.Countries, other.Countries) - ss.Regions = helpers.MergeStringSlices(ss.Regions, other.Regions) - ss.Cities = helpers.MergeStringSlices(ss.Cities, other.Cities) - ss.ISPs = helpers.MergeStringSlices(ss.ISPs, other.ISPs) - ss.Hostnames = helpers.MergeStringSlices(ss.Hostnames, other.Hostnames) - ss.Names = helpers.MergeStringSlices(ss.Names, other.Names) - ss.Numbers = helpers.MergeUint16Slices(ss.Numbers, other.Numbers) - ss.OwnedOnly = helpers.MergeWithBool(ss.OwnedOnly, other.OwnedOnly) - ss.FreeOnly = helpers.MergeWithBool(ss.FreeOnly, other.FreeOnly) - ss.PremiumOnly = helpers.MergeWithBool(ss.PremiumOnly, other.PremiumOnly) - ss.StreamOnly = helpers.MergeWithBool(ss.StreamOnly, other.StreamOnly) - ss.MultiHopOnly = helpers.MergeWithBool(ss.MultiHopOnly, other.MultiHopOnly) + ss.Countries = helpers.MergeSlices(ss.Countries, other.Countries) + ss.Regions = helpers.MergeSlices(ss.Regions, other.Regions) + ss.Cities = helpers.MergeSlices(ss.Cities, other.Cities) + ss.ISPs = helpers.MergeSlices(ss.ISPs, other.ISPs) + ss.Hostnames = helpers.MergeSlices(ss.Hostnames, other.Hostnames) + ss.Names = helpers.MergeSlices(ss.Names, other.Names) + ss.Numbers = helpers.MergeSlices(ss.Numbers, other.Numbers) + ss.OwnedOnly = helpers.MergeWithPointer(ss.OwnedOnly, other.OwnedOnly) + ss.FreeOnly = helpers.MergeWithPointer(ss.FreeOnly, other.FreeOnly) + ss.PremiumOnly = helpers.MergeWithPointer(ss.PremiumOnly, other.PremiumOnly) + ss.StreamOnly = helpers.MergeWithPointer(ss.StreamOnly, other.StreamOnly) + ss.MultiHopOnly = helpers.MergeWithPointer(ss.MultiHopOnly, other.MultiHopOnly) ss.OpenVPN.mergeWith(other.OpenVPN) ss.Wireguard.mergeWith(other.Wireguard) @@ -243,18 +243,18 @@ func (ss *ServerSelection) mergeWith(other ServerSelection) { func (ss *ServerSelection) overrideWith(other ServerSelection) { ss.VPN = helpers.OverrideWithString(ss.VPN, other.VPN) ss.TargetIP = helpers.OverrideWithIP(ss.TargetIP, other.TargetIP) - ss.Countries = helpers.OverrideWithStringSlice(ss.Countries, other.Countries) - ss.Regions = helpers.OverrideWithStringSlice(ss.Regions, other.Regions) - ss.Cities = helpers.OverrideWithStringSlice(ss.Cities, other.Cities) - ss.ISPs = helpers.OverrideWithStringSlice(ss.ISPs, other.ISPs) - ss.Hostnames = helpers.OverrideWithStringSlice(ss.Hostnames, other.Hostnames) - ss.Names = helpers.OverrideWithStringSlice(ss.Names, other.Names) - ss.Numbers = helpers.OverrideWithUint16Slice(ss.Numbers, other.Numbers) - ss.OwnedOnly = helpers.OverrideWithBool(ss.OwnedOnly, other.OwnedOnly) - ss.FreeOnly = helpers.OverrideWithBool(ss.FreeOnly, other.FreeOnly) - ss.PremiumOnly = helpers.OverrideWithBool(ss.PremiumOnly, other.PremiumOnly) - ss.StreamOnly = helpers.OverrideWithBool(ss.StreamOnly, other.StreamOnly) - ss.MultiHopOnly = helpers.OverrideWithBool(ss.MultiHopOnly, other.MultiHopOnly) + ss.Countries = helpers.OverrideWithSlice(ss.Countries, other.Countries) + ss.Regions = helpers.OverrideWithSlice(ss.Regions, other.Regions) + ss.Cities = helpers.OverrideWithSlice(ss.Cities, other.Cities) + ss.ISPs = helpers.OverrideWithSlice(ss.ISPs, other.ISPs) + ss.Hostnames = helpers.OverrideWithSlice(ss.Hostnames, other.Hostnames) + ss.Names = helpers.OverrideWithSlice(ss.Names, other.Names) + ss.Numbers = helpers.OverrideWithSlice(ss.Numbers, other.Numbers) + ss.OwnedOnly = helpers.OverrideWithPointer(ss.OwnedOnly, other.OwnedOnly) + ss.FreeOnly = helpers.OverrideWithPointer(ss.FreeOnly, other.FreeOnly) + ss.PremiumOnly = helpers.OverrideWithPointer(ss.PremiumOnly, other.PremiumOnly) + ss.StreamOnly = helpers.OverrideWithPointer(ss.StreamOnly, other.StreamOnly) + ss.MultiHopOnly = helpers.OverrideWithPointer(ss.MultiHopOnly, other.MultiHopOnly) ss.OpenVPN.overrideWith(other.OpenVPN) ss.Wireguard.overrideWith(other.Wireguard) } @@ -262,11 +262,11 @@ func (ss *ServerSelection) overrideWith(other ServerSelection) { func (ss *ServerSelection) setDefaults(vpnProvider string) { ss.VPN = helpers.DefaultString(ss.VPN, vpn.OpenVPN) ss.TargetIP = helpers.DefaultIP(ss.TargetIP, netip.IPv4Unspecified()) - ss.OwnedOnly = helpers.DefaultBool(ss.OwnedOnly, false) - ss.FreeOnly = helpers.DefaultBool(ss.FreeOnly, false) - ss.PremiumOnly = helpers.DefaultBool(ss.PremiumOnly, false) - ss.StreamOnly = helpers.DefaultBool(ss.StreamOnly, false) - ss.MultiHopOnly = helpers.DefaultBool(ss.MultiHopOnly, false) + ss.OwnedOnly = helpers.DefaultPointer(ss.OwnedOnly, false) + ss.FreeOnly = helpers.DefaultPointer(ss.FreeOnly, false) + ss.PremiumOnly = helpers.DefaultPointer(ss.PremiumOnly, false) + ss.StreamOnly = helpers.DefaultPointer(ss.StreamOnly, false) + ss.MultiHopOnly = helpers.DefaultPointer(ss.MultiHopOnly, false) ss.OpenVPN.setDefaults(vpnProvider) ss.Wireguard.setDefaults() } diff --git a/internal/configuration/settings/shadowsocks.go b/internal/configuration/settings/shadowsocks.go index 4ad3364c..d967579e 100644 --- a/internal/configuration/settings/shadowsocks.go +++ b/internal/configuration/settings/shadowsocks.go @@ -21,7 +21,7 @@ func (s Shadowsocks) validate() (err error) { func (s *Shadowsocks) copy() (copied Shadowsocks) { return Shadowsocks{ - Enabled: helpers.CopyBoolPtr(s.Enabled), + Enabled: helpers.CopyPointer(s.Enabled), Settings: s.Settings.Copy(), } } @@ -29,7 +29,7 @@ func (s *Shadowsocks) copy() (copied Shadowsocks) { // mergeWith merges the other settings into any // unset field of the receiver settings object. func (s *Shadowsocks) mergeWith(other Shadowsocks) { - s.Enabled = helpers.MergeWithBool(s.Enabled, other.Enabled) + s.Enabled = helpers.MergeWithPointer(s.Enabled, other.Enabled) s.Settings.MergeWith(other.Settings) } @@ -37,12 +37,12 @@ func (s *Shadowsocks) mergeWith(other Shadowsocks) { // settings object with any field set in the other // settings. func (s *Shadowsocks) overrideWith(other Shadowsocks) { - s.Enabled = helpers.OverrideWithBool(s.Enabled, other.Enabled) + s.Enabled = helpers.OverrideWithPointer(s.Enabled, other.Enabled) s.Settings.OverrideWith(other.Settings) } func (s *Shadowsocks) setDefaults() { - s.Enabled = helpers.DefaultBool(s.Enabled, false) + s.Enabled = helpers.DefaultPointer(s.Enabled, false) s.Settings.SetDefaults() } diff --git a/internal/configuration/settings/system.go b/internal/configuration/settings/system.go index a4ec4a9f..52bb87db 100644 --- a/internal/configuration/settings/system.go +++ b/internal/configuration/settings/system.go @@ -19,28 +19,28 @@ func (s System) validate() (err error) { func (s *System) copy() (copied System) { return System{ - PUID: helpers.CopyUint32Ptr(s.PUID), - PGID: helpers.CopyUint32Ptr(s.PGID), + PUID: helpers.CopyPointer(s.PUID), + PGID: helpers.CopyPointer(s.PGID), Timezone: s.Timezone, } } func (s *System) mergeWith(other System) { - s.PUID = helpers.MergeWithUint32(s.PUID, other.PUID) - s.PGID = helpers.MergeWithUint32(s.PGID, other.PGID) + s.PUID = helpers.MergeWithPointer(s.PUID, other.PUID) + s.PGID = helpers.MergeWithPointer(s.PGID, other.PGID) s.Timezone = helpers.MergeWithString(s.Timezone, other.Timezone) } func (s *System) overrideWith(other System) { - s.PUID = helpers.OverrideWithUint32(s.PUID, other.PUID) - s.PGID = helpers.OverrideWithUint32(s.PGID, other.PGID) + s.PUID = helpers.OverrideWithPointer(s.PUID, other.PUID) + s.PGID = helpers.OverrideWithPointer(s.PGID, other.PGID) s.Timezone = helpers.OverrideWithString(s.Timezone, other.Timezone) } func (s *System) setDefaults() { const defaultID = 1000 - s.PUID = helpers.DefaultUint32(s.PUID, defaultID) - s.PGID = helpers.DefaultUint32(s.PGID, defaultID) + s.PUID = helpers.DefaultPointer(s.PUID, defaultID) + s.PGID = helpers.DefaultPointer(s.PGID, defaultID) } func (s System) String() string { diff --git a/internal/configuration/settings/unbound.go b/internal/configuration/settings/unbound.go index 717a2f88..ff3b0fd8 100644 --- a/internal/configuration/settings/unbound.go +++ b/internal/configuration/settings/unbound.go @@ -30,17 +30,17 @@ func (u *Unbound) setDefaults() { } } - u.Caching = helpers.DefaultBool(u.Caching, true) - u.IPv6 = helpers.DefaultBool(u.IPv6, false) + u.Caching = helpers.DefaultPointer(u.Caching, true) + u.IPv6 = helpers.DefaultPointer(u.IPv6, false) const defaultVerbosityLevel = 1 - u.VerbosityLevel = helpers.DefaultUint8(u.VerbosityLevel, defaultVerbosityLevel) + u.VerbosityLevel = helpers.DefaultPointer(u.VerbosityLevel, defaultVerbosityLevel) const defaultVerbosityDetailsLevel = 0 - u.VerbosityDetailsLevel = helpers.DefaultUint8(u.VerbosityDetailsLevel, defaultVerbosityDetailsLevel) + u.VerbosityDetailsLevel = helpers.DefaultPointer(u.VerbosityDetailsLevel, defaultVerbosityDetailsLevel) const defaultValidationLogLevel = 0 - u.ValidationLogLevel = helpers.DefaultUint8(u.ValidationLogLevel, defaultValidationLogLevel) + u.ValidationLogLevel = helpers.DefaultPointer(u.ValidationLogLevel, defaultValidationLogLevel) if u.Allowed == nil { u.Allowed = []netip.Prefix{ @@ -94,37 +94,37 @@ func (u Unbound) validate() (err error) { func (u Unbound) copy() (copied Unbound) { return Unbound{ - Providers: helpers.CopyStringSlice(u.Providers), - Caching: helpers.CopyBoolPtr(u.Caching), - IPv6: helpers.CopyBoolPtr(u.IPv6), - VerbosityLevel: helpers.CopyUint8Ptr(u.VerbosityLevel), - VerbosityDetailsLevel: helpers.CopyUint8Ptr(u.VerbosityDetailsLevel), - ValidationLogLevel: helpers.CopyUint8Ptr(u.ValidationLogLevel), + Providers: helpers.CopySlice(u.Providers), + Caching: helpers.CopyPointer(u.Caching), + IPv6: helpers.CopyPointer(u.IPv6), + VerbosityLevel: helpers.CopyPointer(u.VerbosityLevel), + VerbosityDetailsLevel: helpers.CopyPointer(u.VerbosityDetailsLevel), + ValidationLogLevel: helpers.CopyPointer(u.ValidationLogLevel), Username: u.Username, - Allowed: helpers.CopyNetipPrefixesSlice(u.Allowed), + Allowed: helpers.CopySlice(u.Allowed), } } func (u *Unbound) mergeWith(other Unbound) { - u.Providers = helpers.MergeStringSlices(u.Providers, other.Providers) - u.Caching = helpers.MergeWithBool(u.Caching, other.Caching) - u.IPv6 = helpers.MergeWithBool(u.IPv6, other.IPv6) - u.VerbosityLevel = helpers.MergeWithUint8(u.VerbosityLevel, other.VerbosityLevel) - u.VerbosityDetailsLevel = helpers.MergeWithUint8(u.VerbosityDetailsLevel, other.VerbosityDetailsLevel) - u.ValidationLogLevel = helpers.MergeWithUint8(u.ValidationLogLevel, other.ValidationLogLevel) + u.Providers = helpers.MergeSlices(u.Providers, other.Providers) + u.Caching = helpers.MergeWithPointer(u.Caching, other.Caching) + u.IPv6 = helpers.MergeWithPointer(u.IPv6, other.IPv6) + u.VerbosityLevel = helpers.MergeWithPointer(u.VerbosityLevel, other.VerbosityLevel) + u.VerbosityDetailsLevel = helpers.MergeWithPointer(u.VerbosityDetailsLevel, other.VerbosityDetailsLevel) + u.ValidationLogLevel = helpers.MergeWithPointer(u.ValidationLogLevel, other.ValidationLogLevel) u.Username = helpers.MergeWithString(u.Username, other.Username) - u.Allowed = helpers.MergeNetipPrefixesSlices(u.Allowed, other.Allowed) + u.Allowed = helpers.MergeSlices(u.Allowed, other.Allowed) } func (u *Unbound) overrideWith(other Unbound) { - u.Providers = helpers.OverrideWithStringSlice(u.Providers, other.Providers) - u.Caching = helpers.OverrideWithBool(u.Caching, other.Caching) - u.IPv6 = helpers.OverrideWithBool(u.IPv6, other.IPv6) - u.VerbosityLevel = helpers.OverrideWithUint8(u.VerbosityLevel, other.VerbosityLevel) - u.VerbosityDetailsLevel = helpers.OverrideWithUint8(u.VerbosityDetailsLevel, other.VerbosityDetailsLevel) - u.ValidationLogLevel = helpers.OverrideWithUint8(u.ValidationLogLevel, other.ValidationLogLevel) + u.Providers = helpers.OverrideWithSlice(u.Providers, other.Providers) + u.Caching = helpers.OverrideWithPointer(u.Caching, other.Caching) + u.IPv6 = helpers.OverrideWithPointer(u.IPv6, other.IPv6) + u.VerbosityLevel = helpers.OverrideWithPointer(u.VerbosityLevel, other.VerbosityLevel) + u.VerbosityDetailsLevel = helpers.OverrideWithPointer(u.VerbosityDetailsLevel, other.VerbosityDetailsLevel) + u.ValidationLogLevel = helpers.OverrideWithPointer(u.ValidationLogLevel, other.ValidationLogLevel) u.Username = helpers.OverrideWithString(u.Username, other.Username) - u.Allowed = helpers.OverrideWithNetipPrefixesSlice(u.Allowed, other.Allowed) + u.Allowed = helpers.OverrideWithSlice(u.Allowed, other.Allowed) } func (u Unbound) ToUnboundFormat() (settings unbound.Settings, err error) { diff --git a/internal/configuration/settings/updater.go b/internal/configuration/settings/updater.go index 8b7a2d69..1d3c7561 100644 --- a/internal/configuration/settings/updater.go +++ b/internal/configuration/settings/updater.go @@ -63,34 +63,34 @@ func (u Updater) Validate() (err error) { func (u *Updater) copy() (copied Updater) { return Updater{ - Period: helpers.CopyDurationPtr(u.Period), + Period: helpers.CopyPointer(u.Period), DNSAddress: u.DNSAddress, MinRatio: u.MinRatio, - Providers: helpers.CopyStringSlice(u.Providers), + Providers: helpers.CopySlice(u.Providers), } } // mergeWith merges the other settings into any // unset field of the receiver settings object. func (u *Updater) mergeWith(other Updater) { - u.Period = helpers.MergeWithDurationPtr(u.Period, other.Period) + u.Period = helpers.MergeWithPointer(u.Period, other.Period) u.DNSAddress = helpers.MergeWithString(u.DNSAddress, other.DNSAddress) - u.MinRatio = helpers.MergeWithFloat64(u.MinRatio, other.MinRatio) - u.Providers = helpers.MergeStringSlices(u.Providers, other.Providers) + u.MinRatio = helpers.MergeWithNumber(u.MinRatio, other.MinRatio) + u.Providers = helpers.MergeSlices(u.Providers, other.Providers) } // overrideWith overrides fields of the receiver // settings object with any field set in the other // settings. func (u *Updater) overrideWith(other Updater) { - u.Period = helpers.OverrideWithDurationPtr(u.Period, other.Period) + u.Period = helpers.OverrideWithPointer(u.Period, other.Period) u.DNSAddress = helpers.OverrideWithString(u.DNSAddress, other.DNSAddress) - u.MinRatio = helpers.OverrideWithFloat64(u.MinRatio, other.MinRatio) - u.Providers = helpers.OverrideWithStringSlice(u.Providers, other.Providers) + u.MinRatio = helpers.OverrideWithNumber(u.MinRatio, other.MinRatio) + u.Providers = helpers.OverrideWithSlice(u.Providers, other.Providers) } func (u *Updater) SetDefaults(vpnProvider string) { - u.Period = helpers.DefaultDurationPtr(u.Period, 0) + u.Period = helpers.DefaultPointer(u.Period, 0) u.DNSAddress = helpers.DefaultString(u.DNSAddress, "1.1.1.1:53") if u.MinRatio == 0 { diff --git a/internal/configuration/settings/version.go b/internal/configuration/settings/version.go index 8f481f6d..2cba3ecb 100644 --- a/internal/configuration/settings/version.go +++ b/internal/configuration/settings/version.go @@ -19,25 +19,25 @@ func (v Version) validate() (err error) { func (v *Version) copy() (copied Version) { return Version{ - Enabled: helpers.CopyBoolPtr(v.Enabled), + Enabled: helpers.CopyPointer(v.Enabled), } } // mergeWith merges the other settings into any // unset field of the receiver settings object. func (v *Version) mergeWith(other Version) { - v.Enabled = helpers.MergeWithBool(v.Enabled, other.Enabled) + v.Enabled = helpers.MergeWithPointer(v.Enabled, other.Enabled) } // overrideWith overrides fields of the receiver // settings object with any field set in the other // settings. func (v *Version) overrideWith(other Version) { - v.Enabled = helpers.OverrideWithBool(v.Enabled, other.Enabled) + v.Enabled = helpers.OverrideWithPointer(v.Enabled, other.Enabled) } func (v *Version) setDefaults() { - v.Enabled = helpers.DefaultBool(v.Enabled, true) + v.Enabled = helpers.DefaultPointer(v.Enabled, true) } func (v Version) String() string { diff --git a/internal/configuration/settings/wireguard.go b/internal/configuration/settings/wireguard.go index 82a23fb8..f0aa0c53 100644 --- a/internal/configuration/settings/wireguard.go +++ b/internal/configuration/settings/wireguard.go @@ -106,33 +106,33 @@ func (w Wireguard) validate(vpnProvider string, ipv6Supported bool) (err error) func (w *Wireguard) copy() (copied Wireguard) { return Wireguard{ - PrivateKey: helpers.CopyStringPtr(w.PrivateKey), - PreSharedKey: helpers.CopyStringPtr(w.PreSharedKey), - Addresses: helpers.CopyNetipPrefixesSlice(w.Addresses), + PrivateKey: helpers.CopyPointer(w.PrivateKey), + PreSharedKey: helpers.CopyPointer(w.PreSharedKey), + Addresses: helpers.CopySlice(w.Addresses), Interface: w.Interface, Implementation: w.Implementation, } } func (w *Wireguard) mergeWith(other Wireguard) { - w.PrivateKey = helpers.MergeWithStringPtr(w.PrivateKey, other.PrivateKey) - w.PreSharedKey = helpers.MergeWithStringPtr(w.PreSharedKey, other.PreSharedKey) - w.Addresses = helpers.MergeNetipPrefixesSlices(w.Addresses, other.Addresses) + w.PrivateKey = helpers.MergeWithPointer(w.PrivateKey, other.PrivateKey) + w.PreSharedKey = helpers.MergeWithPointer(w.PreSharedKey, other.PreSharedKey) + w.Addresses = helpers.MergeSlices(w.Addresses, other.Addresses) w.Interface = helpers.MergeWithString(w.Interface, other.Interface) w.Implementation = helpers.MergeWithString(w.Implementation, other.Implementation) } func (w *Wireguard) overrideWith(other Wireguard) { - w.PrivateKey = helpers.OverrideWithStringPtr(w.PrivateKey, other.PrivateKey) - w.PreSharedKey = helpers.OverrideWithStringPtr(w.PreSharedKey, other.PreSharedKey) - w.Addresses = helpers.OverrideWithNetipPrefixesSlice(w.Addresses, other.Addresses) + w.PrivateKey = helpers.OverrideWithPointer(w.PrivateKey, other.PrivateKey) + w.PreSharedKey = helpers.OverrideWithPointer(w.PreSharedKey, other.PreSharedKey) + w.Addresses = helpers.OverrideWithSlice(w.Addresses, other.Addresses) w.Interface = helpers.OverrideWithString(w.Interface, other.Interface) w.Implementation = helpers.OverrideWithString(w.Implementation, other.Implementation) } func (w *Wireguard) setDefaults() { - w.PrivateKey = helpers.DefaultStringPtr(w.PrivateKey, "") - w.PreSharedKey = helpers.DefaultStringPtr(w.PreSharedKey, "") + w.PrivateKey = helpers.DefaultPointer(w.PrivateKey, "") + w.PreSharedKey = helpers.DefaultPointer(w.PreSharedKey, "") w.Interface = helpers.DefaultString(w.Interface, "wg0") w.Implementation = helpers.DefaultString(w.Implementation, "auto") } diff --git a/internal/configuration/settings/wireguardselection.go b/internal/configuration/settings/wireguardselection.go index 43716375..9c138b12 100644 --- a/internal/configuration/settings/wireguardselection.go +++ b/internal/configuration/settings/wireguardselection.go @@ -110,26 +110,26 @@ func (w WireguardSelection) validate(vpnProvider string) (err error) { func (w *WireguardSelection) copy() (copied WireguardSelection) { return WireguardSelection{ EndpointIP: w.EndpointIP, - EndpointPort: helpers.CopyUint16Ptr(w.EndpointPort), + EndpointPort: helpers.CopyPointer(w.EndpointPort), PublicKey: w.PublicKey, } } func (w *WireguardSelection) mergeWith(other WireguardSelection) { w.EndpointIP = helpers.MergeWithIP(w.EndpointIP, other.EndpointIP) - w.EndpointPort = helpers.MergeWithUint16(w.EndpointPort, other.EndpointPort) + w.EndpointPort = helpers.MergeWithPointer(w.EndpointPort, other.EndpointPort) w.PublicKey = helpers.MergeWithString(w.PublicKey, other.PublicKey) } func (w *WireguardSelection) overrideWith(other WireguardSelection) { w.EndpointIP = helpers.OverrideWithIP(w.EndpointIP, other.EndpointIP) - w.EndpointPort = helpers.OverrideWithUint16(w.EndpointPort, other.EndpointPort) + w.EndpointPort = helpers.OverrideWithPointer(w.EndpointPort, other.EndpointPort) w.PublicKey = helpers.OverrideWithString(w.PublicKey, other.PublicKey) } func (w *WireguardSelection) setDefaults() { w.EndpointIP = helpers.DefaultIP(w.EndpointIP, netip.IPv4Unspecified()) - w.EndpointPort = helpers.DefaultUint16(w.EndpointPort, 0) + w.EndpointPort = helpers.DefaultPointer(w.EndpointPort, 0) } func (w WireguardSelection) String() string { diff --git a/internal/httpserver/settings.go b/internal/httpserver/settings.go index 29288234..6d574f62 100644 --- a/internal/httpserver/settings.go +++ b/internal/httpserver/settings.go @@ -36,10 +36,10 @@ type Settings struct { func (s *Settings) SetDefaults() { s.Address = helpers.DefaultString(s.Address, ":8000") const defaultReadTimeout = 3 * time.Second - s.ReadHeaderTimeout = helpers.DefaultDuration(s.ReadHeaderTimeout, defaultReadTimeout) - s.ReadTimeout = helpers.DefaultDuration(s.ReadTimeout, defaultReadTimeout) + s.ReadHeaderTimeout = helpers.DefaultNumber(s.ReadHeaderTimeout, defaultReadTimeout) + s.ReadTimeout = helpers.DefaultNumber(s.ReadTimeout, defaultReadTimeout) const defaultShutdownTimeout = 3 * time.Second - s.ShutdownTimeout = helpers.DefaultDuration(s.ShutdownTimeout, defaultShutdownTimeout) + s.ShutdownTimeout = helpers.DefaultNumber(s.ShutdownTimeout, defaultShutdownTimeout) } func (s Settings) Copy() Settings { @@ -59,9 +59,9 @@ func (s *Settings) MergeWith(other Settings) { if s.Logger == nil { s.Logger = other.Logger } - s.ReadHeaderTimeout = helpers.MergeWithDuration(s.ReadHeaderTimeout, other.ReadHeaderTimeout) - s.ReadTimeout = helpers.MergeWithDuration(s.ReadTimeout, other.ReadTimeout) - s.ShutdownTimeout = helpers.MergeWithDuration(s.ShutdownTimeout, other.ShutdownTimeout) + s.ReadHeaderTimeout = helpers.MergeWithNumber(s.ReadHeaderTimeout, other.ReadHeaderTimeout) + s.ReadTimeout = helpers.MergeWithNumber(s.ReadTimeout, other.ReadTimeout) + s.ShutdownTimeout = helpers.MergeWithNumber(s.ShutdownTimeout, other.ShutdownTimeout) } func (s *Settings) OverrideWith(other Settings) { @@ -70,9 +70,9 @@ func (s *Settings) OverrideWith(other Settings) { if other.Logger != nil { s.Logger = other.Logger } - s.ReadHeaderTimeout = helpers.OverrideWithDuration(s.ReadHeaderTimeout, other.ReadHeaderTimeout) - s.ReadTimeout = helpers.OverrideWithDuration(s.ReadTimeout, other.ReadTimeout) - s.ShutdownTimeout = helpers.OverrideWithDuration(s.ShutdownTimeout, other.ShutdownTimeout) + s.ReadHeaderTimeout = helpers.OverrideWithNumber(s.ReadHeaderTimeout, other.ReadHeaderTimeout) + s.ReadTimeout = helpers.OverrideWithNumber(s.ReadTimeout, other.ReadTimeout) + s.ShutdownTimeout = helpers.OverrideWithNumber(s.ShutdownTimeout, other.ShutdownTimeout) } var ( diff --git a/internal/pprof/settings.go b/internal/pprof/settings.go index 48f5cbe0..914a0e7c 100644 --- a/internal/pprof/settings.go +++ b/internal/pprof/settings.go @@ -27,16 +27,16 @@ type Settings struct { } func (s *Settings) SetDefaults() { - s.Enabled = helpers.DefaultBool(s.Enabled, false) + s.Enabled = helpers.DefaultPointer(s.Enabled, false) s.HTTPServer.Address = helpers.DefaultString(s.HTTPServer.Address, "localhost:6060") const defaultReadTimeout = 5 * time.Minute // for CPU profiling - s.HTTPServer.ReadTimeout = helpers.DefaultDuration(s.HTTPServer.ReadTimeout, defaultReadTimeout) + s.HTTPServer.ReadTimeout = helpers.DefaultNumber(s.HTTPServer.ReadTimeout, defaultReadTimeout) s.HTTPServer.SetDefaults() } func (s Settings) Copy() (copied Settings) { return Settings{ - Enabled: helpers.CopyBoolPtr(s.Enabled), + Enabled: helpers.CopyPointer(s.Enabled), BlockProfileRate: s.BlockProfileRate, MutexProfileRate: s.MutexProfileRate, HTTPServer: s.HTTPServer.Copy(), @@ -44,16 +44,16 @@ func (s Settings) Copy() (copied Settings) { } func (s *Settings) MergeWith(other Settings) { - s.Enabled = helpers.MergeWithBool(s.Enabled, other.Enabled) - s.BlockProfileRate = helpers.MergeWithIntPtr(s.BlockProfileRate, other.BlockProfileRate) - s.MutexProfileRate = helpers.MergeWithIntPtr(s.MutexProfileRate, other.MutexProfileRate) + s.Enabled = helpers.MergeWithPointer(s.Enabled, other.Enabled) + s.BlockProfileRate = helpers.MergeWithPointer(s.BlockProfileRate, other.BlockProfileRate) + s.MutexProfileRate = helpers.MergeWithPointer(s.MutexProfileRate, other.MutexProfileRate) s.HTTPServer.MergeWith(other.HTTPServer) } func (s *Settings) OverrideWith(other Settings) { - s.Enabled = helpers.OverrideWithBool(s.Enabled, other.Enabled) - s.BlockProfileRate = helpers.OverrideWithIntPtr(s.BlockProfileRate, other.BlockProfileRate) - s.MutexProfileRate = helpers.OverrideWithIntPtr(s.MutexProfileRate, other.MutexProfileRate) + s.Enabled = helpers.OverrideWithPointer(s.Enabled, other.Enabled) + s.BlockProfileRate = helpers.OverrideWithPointer(s.BlockProfileRate, other.BlockProfileRate) + s.MutexProfileRate = helpers.OverrideWithPointer(s.MutexProfileRate, other.MutexProfileRate) s.HTTPServer.OverrideWith(other.HTTPServer) } diff --git a/internal/provider/utils/filtering.go b/internal/provider/utils/filtering.go index eb5ab7af..7c0059e2 100644 --- a/internal/provider/utils/filtering.go +++ b/internal/provider/utils/filtering.go @@ -1,6 +1,7 @@ package utils import ( + "fmt" "strings" "github.com/qdm12/gluetun/internal/configuration/settings" @@ -68,7 +69,7 @@ func filterServer(server models.Server, return true } - if filterByPossibilitiesUint16(server.Number, selection.Numbers) { + if filterByPossibilities(server.Number, selection.Numbers) { return true } @@ -85,25 +86,12 @@ func filterServer(server models.Server, return false } -func filterByPossibilities(value string, possibilities []string) (filtered bool) { +func filterByPossibilities[T string | uint16](value T, possibilities []T) (filtered bool) { if len(possibilities) == 0 { return false } for _, possibility := range possibilities { - if strings.EqualFold(value, possibility) { - return false - } - } - return true -} - -// TODO merge with filterByPossibilities with generics in Go 1.18. -func filterByPossibilitiesUint16(value uint16, possibilities []uint16) (filtered bool) { - if len(possibilities) == 0 { - return false - } - for _, possibility := range possibilities { - if value == possibility { + if strings.EqualFold(fmt.Sprint(value), fmt.Sprint(possibility)) { return false } } diff --git a/internal/storage/filter.go b/internal/storage/filter.go index 0f130de9..fa476e0c 100644 --- a/internal/storage/filter.go +++ b/internal/storage/filter.go @@ -1,6 +1,7 @@ package storage import ( + "fmt" "strings" "github.com/qdm12/gluetun/internal/configuration/settings" @@ -89,7 +90,7 @@ func filterServer(server models.Server, return true } - if filterByPossibilitiesUint16(server.Number, selection.Numbers) { + if filterByPossibilities(server.Number, selection.Numbers) { return true } @@ -106,25 +107,12 @@ func filterServer(server models.Server, return false } -func filterByPossibilities(value string, possibilities []string) (filtered bool) { +func filterByPossibilities[T string | uint16](value T, possibilities []T) (filtered bool) { if len(possibilities) == 0 { return false } for _, possibility := range possibilities { - if strings.EqualFold(value, possibility) { - return false - } - } - return true -} - -// TODO merge with filterByPossibilities with generics in Go 1.18. -func filterByPossibilitiesUint16(value uint16, possibilities []uint16) (filtered bool) { - if len(possibilities) == 0 { - return false - } - for _, possibility := range possibilities { - if value == possibility { + if strings.EqualFold(fmt.Sprint(value), fmt.Sprint(possibility)) { return false } }