Skip to content

Commit d167a56

Browse files
committed
nat: make PortMap and PortSet aliases
The `PortSet` and `PortMap` types don't carry a real meaning on their own. Their purpose is defined at locations where they're used, such as `Container.ExposedPorts` or `Container.PortBindings`. Their documentation also shows this; // PortSet is a collection of structs indexed by [PortRangeProto]. // PortMap is a collection of [PortBinding] indexed by [PortRangeProto]. Which, almost literally, describes what a map is. Substituting the types for their implementation doesn't lose any meaning; // map[PortRangeProto]struct{} is a collection of structs indexed by [PortRangeProto]. // map[PortRangeProto][]PortBinding is a collection of [PortBinding] indexed by [PortRangeProto]. Neither type has any special handling connected to them (no methods or otherwise), so they are just maps with a fancy name attached. Worse, using the extra indirect induces cognitive load; it's not clear from the type that it's "just" a map, indexed by `PortBinding`, and it's not clear what (kind of) values are in the map. There are cases where having a type defined can add value to provide a more in-depth description of their intent, but (as shown above) even that is not the case here. I'm considering these types to be premature abstraction with no good value. As they are a "straight" copy of a map with the same signature, replacing these types preserves backward compatibility; existing code can assign either a `PortSet` or `PortMap`, or a `map[PortRangeProto]..` with the same signature, but we can deprecate the types to give users a nudge to use a regular map instead. The following shows that they are interchangeable; type config1 struct { ExposedPorts container.PortSet PortBindings container.PortMap } type config2 struct { ExposedPorts map[container.PortRangeProto]struct{} PortBindings map[container.PortRangeProto][]container.PortBinding } var ( ports map[container.PortRangeProto]struct{} portBindings map[container.PortRangeProto][]container.PortBinding ports2 container.PortSet portBindings2 container.PortMap ) _ = config1{ ExposedPorts: ports, PortBindings: portBindings, } _ = config1{ ExposedPorts: ports2, PortBindings: portBindings2, } _ = config2{ ExposedPorts: ports, PortBindings: portBindings, } _ = config2{ ExposedPorts: ports2, PortBindings: portBindings2, } Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
1 parent fa986a4 commit d167a56

File tree

1 file changed

+2
-2
lines changed

1 file changed

+2
-2
lines changed

nat/nat.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@ type PortBinding struct {
1818
}
1919

2020
// PortMap is a collection of PortBinding indexed by Port
21-
type PortMap map[Port][]PortBinding
21+
type PortMap = map[Port][]PortBinding
2222

2323
// PortSet is a collection of structs indexed by Port
24-
type PortSet map[Port]struct{}
24+
type PortSet = map[Port]struct{}
2525

2626
// Port is a string containing port number and protocol in the format "80/tcp"
2727
type Port string

0 commit comments

Comments
 (0)