mirror of
https://github.com/tailscale/tailscale.git
synced 2025-01-07 08:07:42 +00:00
types/views: remove various Map Range funcs; use iterators everywhere
The remaining range funcs in the tree are RangeOverTCPs and RangeOverWebs in ServeConfig; those will be cleaned up separately. Updates #12912 Change-Id: Ieeae4864ab088877263c36b805f77aa8e6be938d Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
This commit is contained in:
parent
47bd0723a0
commit
4b56bf9039
101
ipn/serve.go
101
ipn/serve.go
@ -568,54 +568,46 @@ func ExpandProxyTargetValue(target string, supportedSchemes []string, defaultSch
|
||||
// If the returned bool from the given f is false, then this function stops
|
||||
// iterating immediately and does not check other foreground configs.
|
||||
func (v ServeConfigView) RangeOverTCPs(f func(port uint16, _ TCPPortHandlerView) bool) {
|
||||
parentCont := true
|
||||
v.TCP().Range(func(k uint16, v TCPPortHandlerView) (cont bool) {
|
||||
parentCont = f(k, v)
|
||||
return parentCont
|
||||
})
|
||||
v.Foreground().Range(func(k string, v ServeConfigView) (cont bool) {
|
||||
if !parentCont {
|
||||
return false
|
||||
for k, v := range v.TCP().All() {
|
||||
if !f(k, v) {
|
||||
return
|
||||
}
|
||||
v.TCP().Range(func(k uint16, v TCPPortHandlerView) (cont bool) {
|
||||
parentCont = f(k, v)
|
||||
return parentCont
|
||||
})
|
||||
return parentCont
|
||||
})
|
||||
}
|
||||
for _, conf := range v.Foreground().All() {
|
||||
for k, v := range conf.TCP().All() {
|
||||
if !f(k, v) {
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// RangeOverWebs ranges over both background and foreground Webs.
|
||||
// If the returned bool from the given f is false, then this function stops
|
||||
// iterating immediately and does not check other foreground configs.
|
||||
func (v ServeConfigView) RangeOverWebs(f func(_ HostPort, conf WebServerConfigView) bool) {
|
||||
parentCont := true
|
||||
v.Web().Range(func(k HostPort, v WebServerConfigView) (cont bool) {
|
||||
parentCont = f(k, v)
|
||||
return parentCont
|
||||
})
|
||||
v.Foreground().Range(func(k string, v ServeConfigView) (cont bool) {
|
||||
if !parentCont {
|
||||
return false
|
||||
func (v ServeConfigView) RangeOverWebs(f func(HostPort, WebServerConfigView) bool) {
|
||||
for k, v := range v.Web().All() {
|
||||
if !f(k, v) {
|
||||
return
|
||||
}
|
||||
v.Web().Range(func(k HostPort, v WebServerConfigView) (cont bool) {
|
||||
parentCont = f(k, v)
|
||||
return parentCont
|
||||
})
|
||||
return parentCont
|
||||
})
|
||||
}
|
||||
for _, conf := range v.Foreground().All() {
|
||||
for k, v := range conf.Web().All() {
|
||||
if !f(k, v) {
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// FindTCP returns the first TCP that matches with the given port. It
|
||||
// prefers a foreground match first followed by a background search if none
|
||||
// existed.
|
||||
func (v ServeConfigView) FindTCP(port uint16) (res TCPPortHandlerView, ok bool) {
|
||||
v.Foreground().Range(func(_ string, v ServeConfigView) (cont bool) {
|
||||
res, ok = v.TCP().GetOk(port)
|
||||
return !ok
|
||||
})
|
||||
if ok {
|
||||
return res, ok
|
||||
for _, conf := range v.Foreground().All() {
|
||||
if res, ok := conf.TCP().GetOk(port); ok {
|
||||
return res, ok
|
||||
}
|
||||
}
|
||||
return v.TCP().GetOk(port)
|
||||
}
|
||||
@ -624,12 +616,10 @@ func (v ServeConfigView) FindTCP(port uint16) (res TCPPortHandlerView, ok bool)
|
||||
// prefers a foreground match first followed by a background search if none
|
||||
// existed.
|
||||
func (v ServeConfigView) FindWeb(hp HostPort) (res WebServerConfigView, ok bool) {
|
||||
v.Foreground().Range(func(_ string, v ServeConfigView) (cont bool) {
|
||||
res, ok = v.Web().GetOk(hp)
|
||||
return !ok
|
||||
})
|
||||
if ok {
|
||||
return res, ok
|
||||
for _, conf := range v.Foreground().All() {
|
||||
if res, ok := conf.Web().GetOk(hp); ok {
|
||||
return res, ok
|
||||
}
|
||||
}
|
||||
return v.Web().GetOk(hp)
|
||||
}
|
||||
@ -637,14 +627,15 @@ func (v ServeConfigView) FindWeb(hp HostPort) (res WebServerConfigView, ok bool)
|
||||
// HasAllowFunnel returns whether this config has at least one AllowFunnel
|
||||
// set in the background or foreground configs.
|
||||
func (v ServeConfigView) HasAllowFunnel() bool {
|
||||
return v.AllowFunnel().Len() > 0 || func() bool {
|
||||
var exists bool
|
||||
v.Foreground().Range(func(k string, v ServeConfigView) (cont bool) {
|
||||
exists = v.AllowFunnel().Len() > 0
|
||||
return !exists
|
||||
})
|
||||
return exists
|
||||
}()
|
||||
if v.AllowFunnel().Len() > 0 {
|
||||
return true
|
||||
}
|
||||
for _, conf := range v.Foreground().All() {
|
||||
if conf.AllowFunnel().Len() > 0 {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// FindFunnel reports whether target exists in either the background AllowFunnel
|
||||
@ -653,12 +644,10 @@ func (v ServeConfigView) HasFunnelForTarget(target HostPort) bool {
|
||||
if v.AllowFunnel().Get(target) {
|
||||
return true
|
||||
}
|
||||
var exists bool
|
||||
v.Foreground().Range(func(_ string, v ServeConfigView) (cont bool) {
|
||||
if exists = v.AllowFunnel().Get(target); exists {
|
||||
return false
|
||||
for _, conf := range v.Foreground().All() {
|
||||
if conf.AllowFunnel().Get(target) {
|
||||
return true
|
||||
}
|
||||
return true
|
||||
})
|
||||
return exists
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
@ -415,16 +415,6 @@ func (m *MapSlice[K, V]) UnmarshalJSON(b []byte) error {
|
||||
return json.Unmarshal(b, &m.ж)
|
||||
}
|
||||
|
||||
// Range calls f for every k,v pair in the underlying map.
|
||||
// It stops iteration immediately if f returns false.
|
||||
func (m MapSlice[K, V]) Range(f MapRangeFn[K, Slice[V]]) {
|
||||
for k, v := range m.ж {
|
||||
if !f(k, SliceOf(v)) {
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// AsMap returns a shallow-clone of the underlying map.
|
||||
//
|
||||
// If V is a pointer type, it is the caller's responsibility to make sure the
|
||||
@ -527,16 +517,6 @@ func (m Map[K, V]) AsMap() map[K]V {
|
||||
// Implementations should return false to stop range.
|
||||
type MapRangeFn[K comparable, V any] func(k K, v V) (cont bool)
|
||||
|
||||
// Range calls f for every k,v pair in the underlying map.
|
||||
// It stops iteration immediately if f returns false.
|
||||
func (m Map[K, V]) Range(f MapRangeFn[K, V]) {
|
||||
for k, v := range m.ж {
|
||||
if !f(k, v) {
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// All returns an iterator iterating over the keys
|
||||
// and values of m.
|
||||
func (m Map[K, V]) All() iter.Seq2[K, V] {
|
||||
@ -600,16 +580,6 @@ func (m MapFn[K, T, V]) GetOk(k K) (V, bool) {
|
||||
return m.wrapv(v), ok
|
||||
}
|
||||
|
||||
// Range calls f for every k,v pair in the underlying map.
|
||||
// It stops iteration immediately if f returns false.
|
||||
func (m MapFn[K, T, V]) Range(f MapRangeFn[K, V]) {
|
||||
for k, v := range m.ж {
|
||||
if !f(k, m.wrapv(v)) {
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// All returns an iterator iterating over the keys and value views of m.
|
||||
func (m MapFn[K, T, V]) All() iter.Seq2[K, V] {
|
||||
return func(yield func(K, V) bool) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user