types/structs: add structs.Incomparable annotation, use it where applicable
Shotizam before and output queries: sqlite> select sum(size) from bin where func like 'type..%'; 129067 => 120216reviewable/pr350/r1
parent
7b901fdbbc
commit
fefd7e10dc
|
@ -22,6 +22,7 @@ import (
|
||||||
"tailscale.com/tailcfg"
|
"tailscale.com/tailcfg"
|
||||||
"tailscale.com/types/empty"
|
"tailscale.com/types/empty"
|
||||||
"tailscale.com/types/logger"
|
"tailscale.com/types/logger"
|
||||||
|
"tailscale.com/types/structs"
|
||||||
)
|
)
|
||||||
|
|
||||||
// TODO(apenwarr): eliminate the 'state' variable, as it's now obsolete.
|
// TODO(apenwarr): eliminate the 'state' variable, as it's now obsolete.
|
||||||
|
@ -61,6 +62,7 @@ func (s state) String() string {
|
||||||
}
|
}
|
||||||
|
|
||||||
type Status struct {
|
type Status struct {
|
||||||
|
_ structs.Incomparable
|
||||||
LoginFinished *empty.Message
|
LoginFinished *empty.Message
|
||||||
Err string
|
Err string
|
||||||
URL string
|
URL string
|
||||||
|
@ -94,6 +96,7 @@ func (s Status) String() string {
|
||||||
}
|
}
|
||||||
|
|
||||||
type LoginGoal struct {
|
type LoginGoal struct {
|
||||||
|
_ structs.Incomparable
|
||||||
wantLoggedIn bool // true if we *want* to be logged in
|
wantLoggedIn bool // true if we *want* to be logged in
|
||||||
token *oauth2.Token // oauth token to use when logging in
|
token *oauth2.Token // oauth token to use when logging in
|
||||||
flags LoginFlags // flags to use when logging in
|
flags LoginFlags // flags to use when logging in
|
||||||
|
|
|
@ -13,7 +13,9 @@ import (
|
||||||
|
|
||||||
func fieldsOf(t reflect.Type) (fields []string) {
|
func fieldsOf(t reflect.Type) (fields []string) {
|
||||||
for i := 0; i < t.NumField(); i++ {
|
for i := 0; i < t.NumField(); i++ {
|
||||||
fields = append(fields, t.Field(i).Name)
|
if name := t.Field(i).Name; name != "_" {
|
||||||
|
fields = append(fields, name)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,10 +30,12 @@ import (
|
||||||
"tailscale.com/net/tlsdial"
|
"tailscale.com/net/tlsdial"
|
||||||
"tailscale.com/tailcfg"
|
"tailscale.com/tailcfg"
|
||||||
"tailscale.com/types/logger"
|
"tailscale.com/types/logger"
|
||||||
|
"tailscale.com/types/structs"
|
||||||
"tailscale.com/version"
|
"tailscale.com/version"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Persist struct {
|
type Persist struct {
|
||||||
|
_ structs.Incomparable
|
||||||
PrivateMachineKey wgcfg.PrivateKey
|
PrivateMachineKey wgcfg.PrivateKey
|
||||||
PrivateNodeKey wgcfg.PrivateKey
|
PrivateNodeKey wgcfg.PrivateKey
|
||||||
OldPrivateNodeKey wgcfg.PrivateKey // needed to request key rotation
|
OldPrivateNodeKey wgcfg.PrivateKey // needed to request key rotation
|
||||||
|
|
|
@ -7,6 +7,8 @@ package derpmap
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
|
"tailscale.com/types/structs"
|
||||||
)
|
)
|
||||||
|
|
||||||
// World is a set of DERP server.
|
// World is a set of DERP server.
|
||||||
|
@ -109,6 +111,8 @@ func init() {
|
||||||
|
|
||||||
// Server is configuration for a DERP server.
|
// Server is configuration for a DERP server.
|
||||||
type Server struct {
|
type Server struct {
|
||||||
|
_ structs.Incomparable
|
||||||
|
|
||||||
ID int
|
ID int
|
||||||
|
|
||||||
// HostHTTPS is the HTTPS hostname.
|
// HostHTTPS is the HTTPS hostname.
|
||||||
|
|
|
@ -11,6 +11,7 @@ import (
|
||||||
"tailscale.com/ipn/ipnstate"
|
"tailscale.com/ipn/ipnstate"
|
||||||
"tailscale.com/tailcfg"
|
"tailscale.com/tailcfg"
|
||||||
"tailscale.com/types/empty"
|
"tailscale.com/types/empty"
|
||||||
|
"tailscale.com/types/structs"
|
||||||
"tailscale.com/wgengine"
|
"tailscale.com/wgengine"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -46,6 +47,7 @@ type NetworkMap = controlclient.NetworkMap
|
||||||
// that they have not changed.
|
// that they have not changed.
|
||||||
// They are JSON-encoded on the wire, despite the lack of struct tags.
|
// They are JSON-encoded on the wire, despite the lack of struct tags.
|
||||||
type Notify struct {
|
type Notify struct {
|
||||||
|
_ structs.Incomparable
|
||||||
Version string // version number of IPN backend
|
Version string // version number of IPN backend
|
||||||
ErrMessage *string // critical error message, if any
|
ErrMessage *string // critical error message, if any
|
||||||
LoginFinished *empty.Message // event: non-nil when login process succeeded
|
LoginFinished *empty.Message // event: non-nil when login process succeeded
|
||||||
|
|
|
@ -14,6 +14,7 @@ import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"tailscale.com/types/logger"
|
"tailscale.com/types/logger"
|
||||||
|
"tailscale.com/types/structs"
|
||||||
"tailscale.com/version"
|
"tailscale.com/version"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -34,6 +35,7 @@ type FakeExpireAfterArgs struct {
|
||||||
// Command is a command message that is JSON encoded and sent by a
|
// Command is a command message that is JSON encoded and sent by a
|
||||||
// frontend to a backend.
|
// frontend to a backend.
|
||||||
type Command struct {
|
type Command struct {
|
||||||
|
_ structs.Incomparable
|
||||||
Version string
|
Version string
|
||||||
|
|
||||||
// Exactly one of the following must be non-nil.
|
// Exactly one of the following must be non-nil.
|
||||||
|
|
|
@ -7,9 +7,12 @@ package ratelimit
|
||||||
import (
|
import (
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"tailscale.com/types/structs"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Bucket struct {
|
type Bucket struct {
|
||||||
|
_ structs.Incomparable
|
||||||
mu sync.Mutex
|
mu sync.Mutex
|
||||||
FillInterval time.Duration
|
FillInterval time.Duration
|
||||||
Burst int
|
Burst int
|
||||||
|
|
|
@ -17,6 +17,7 @@ import (
|
||||||
|
|
||||||
"tailscale.com/net/dnscache"
|
"tailscale.com/net/dnscache"
|
||||||
"tailscale.com/stun"
|
"tailscale.com/stun"
|
||||||
|
"tailscale.com/types/structs"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Stunner sends a STUN request to several servers and handles a response.
|
// Stunner sends a STUN request to several servers and handles a response.
|
||||||
|
@ -86,6 +87,7 @@ func (s *Stunner) removeTX(tx stun.TxID) (request, bool) {
|
||||||
}
|
}
|
||||||
|
|
||||||
type request struct {
|
type request struct {
|
||||||
|
_ structs.Incomparable
|
||||||
sent time.Time
|
sent time.Time
|
||||||
server string
|
server string
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,6 +15,7 @@ import (
|
||||||
"github.com/tailscale/wireguard-go/wgcfg"
|
"github.com/tailscale/wireguard-go/wgcfg"
|
||||||
"golang.org/x/oauth2"
|
"golang.org/x/oauth2"
|
||||||
"tailscale.com/types/opt"
|
"tailscale.com/types/opt"
|
||||||
|
"tailscale.com/types/structs"
|
||||||
)
|
)
|
||||||
|
|
||||||
type ID int64
|
type ID int64
|
||||||
|
@ -99,6 +100,7 @@ func (u *User) Clone() *User {
|
||||||
}
|
}
|
||||||
|
|
||||||
type Login struct {
|
type Login struct {
|
||||||
|
_ structs.Incomparable
|
||||||
ID LoginID
|
ID LoginID
|
||||||
Provider string
|
Provider string
|
||||||
LoginName string
|
LoginName string
|
||||||
|
@ -253,6 +255,7 @@ const (
|
||||||
)
|
)
|
||||||
|
|
||||||
type Service struct {
|
type Service struct {
|
||||||
|
_ structs.Incomparable
|
||||||
Proto ServiceProto // TCP or UDP
|
Proto ServiceProto // TCP or UDP
|
||||||
Port uint16 // port number service is listening on
|
Port uint16 // port number service is listening on
|
||||||
Description string // text description of service
|
Description string // text description of service
|
||||||
|
@ -386,10 +389,12 @@ func (h *Hostinfo) Equal(h2 *Hostinfo) bool {
|
||||||
// using the local machine key, and sent to:
|
// using the local machine key, and sent to:
|
||||||
// https://login.tailscale.com/machine/<mkey hex>
|
// https://login.tailscale.com/machine/<mkey hex>
|
||||||
type RegisterRequest struct {
|
type RegisterRequest struct {
|
||||||
|
_ structs.Incomparable
|
||||||
Version int // currently 1
|
Version int // currently 1
|
||||||
NodeKey NodeKey
|
NodeKey NodeKey
|
||||||
OldNodeKey NodeKey
|
OldNodeKey NodeKey
|
||||||
Auth struct {
|
Auth struct {
|
||||||
|
_ structs.Incomparable
|
||||||
// One of Provider/LoginName, Oauth2Token, or AuthKey is set.
|
// One of Provider/LoginName, Oauth2Token, or AuthKey is set.
|
||||||
Provider, LoginName string
|
Provider, LoginName string
|
||||||
Oauth2Token *oauth2.Token
|
Oauth2Token *oauth2.Token
|
||||||
|
@ -452,6 +457,7 @@ var PortRangeAny = PortRange{0, 65535}
|
||||||
|
|
||||||
// NetPortRange represents a single subnet:portrange.
|
// NetPortRange represents a single subnet:portrange.
|
||||||
type NetPortRange struct {
|
type NetPortRange struct {
|
||||||
|
_ structs.Incomparable
|
||||||
IP string
|
IP string
|
||||||
Bits *int // backward compatibility: if missing, means "all" bits
|
Bits *int // backward compatibility: if missing, means "all" bits
|
||||||
Ports PortRange
|
Ports PortRange
|
||||||
|
|
|
@ -157,13 +157,13 @@ func TestHostinfoEqual(t *testing.T) {
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
&Hostinfo{Services: []Service{Service{TCP, 1234, "foo"}}},
|
&Hostinfo{Services: []Service{Service{Proto: TCP, Port: 1234, Description: "foo"}}},
|
||||||
&Hostinfo{Services: []Service{Service{UDP, 2345, "bar"}}},
|
&Hostinfo{Services: []Service{Service{Proto: UDP, Port: 2345, Description: "bar"}}},
|
||||||
false,
|
false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
&Hostinfo{Services: []Service{Service{TCP, 1234, "foo"}}},
|
&Hostinfo{Services: []Service{Service{Proto: TCP, Port: 1234, Description: "foo"}}},
|
||||||
&Hostinfo{Services: []Service{Service{TCP, 1234, "foo"}}},
|
&Hostinfo{Services: []Service{Service{Proto: TCP, Port: 1234, Description: "foo"}}},
|
||||||
true,
|
true,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,16 @@
|
||||||
|
// Copyright (c) 2020 Tailscale Inc & AUTHORS All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// Package structs contains the Incomparable type.
|
||||||
|
package structs
|
||||||
|
|
||||||
|
// Incomparable is a zero-width incomparable type. If added as the
|
||||||
|
// first field in a struct, it marks that struct as not comparable
|
||||||
|
// (can't do == or be a map key) and usually doesn't add any width to
|
||||||
|
// the struct (unless the struct has only small fields).
|
||||||
|
//
|
||||||
|
// Be making a struct incomparable, you can prevent misuse (prevent
|
||||||
|
// people from using ==), but also you can shrink generated binaries,
|
||||||
|
// as the compiler can omit equality funcs from the binary.
|
||||||
|
type Incomparable [0]func()
|
|
@ -43,6 +43,7 @@ import (
|
||||||
"tailscale.com/tailcfg"
|
"tailscale.com/tailcfg"
|
||||||
"tailscale.com/types/key"
|
"tailscale.com/types/key"
|
||||||
"tailscale.com/types/logger"
|
"tailscale.com/types/logger"
|
||||||
|
"tailscale.com/types/structs"
|
||||||
"tailscale.com/version"
|
"tailscale.com/version"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -1072,6 +1073,7 @@ func (c *Conn) findAddrSet(addr *net.UDPAddr) *AddrSet {
|
||||||
}
|
}
|
||||||
|
|
||||||
type udpReadResult struct {
|
type udpReadResult struct {
|
||||||
|
_ structs.Incomparable
|
||||||
n int
|
n int
|
||||||
err error
|
err error
|
||||||
addr *net.UDPAddr
|
addr *net.UDPAddr
|
||||||
|
|
Loading…
Reference in New Issue