|
|
|
@ -3,6 +3,8 @@
|
|
|
|
|
package rings |
|
|
|
|
|
|
|
|
|
import ( |
|
|
|
|
"fmt" |
|
|
|
|
"strconv" |
|
|
|
|
"syscall" |
|
|
|
|
|
|
|
|
|
"darvaza.org/core" |
|
|
|
@ -37,12 +39,20 @@ type RegionID int
|
|
|
|
|
// Valid tells a [RegionID] is within the valid range.
|
|
|
|
|
func (n RegionID) Valid() bool { return n > 0 && n <= RegionMax } |
|
|
|
|
|
|
|
|
|
func (n RegionID) String() string { |
|
|
|
|
return idString(n) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// ZoneID is the identifier of a zone within a region, valid between 1 and [ZoneMax].
|
|
|
|
|
type ZoneID int |
|
|
|
|
|
|
|
|
|
// Valid tells a [ZoneID] is within the valid range.
|
|
|
|
|
func (n ZoneID) Valid() bool { return n > 0 && n <= ZoneMax } |
|
|
|
|
|
|
|
|
|
func (n ZoneID) String() string { |
|
|
|
|
return idString(n) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// NodeID is the identifier of a machine within a zone of a region, valid between
|
|
|
|
|
// 1 and [NodeMax], but between 1 and [NodeZeroMax] if it will be a zone gateway.
|
|
|
|
|
type NodeID int |
|
|
|
@ -53,8 +63,28 @@ func (n NodeID) Valid() bool { return n > 0 && n <= NodeMax }
|
|
|
|
|
// ValidZero tells a [NodeID] is within the valid range for a gateway.
|
|
|
|
|
func (n NodeID) ValidZero() bool { return n > 0 && n <= NodeZeroMax } |
|
|
|
|
|
|
|
|
|
func (n NodeID) String() string { |
|
|
|
|
return idString(n) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// ErrOutOfRange is an error indicating the value of a field
|
|
|
|
|
// is out of range.
|
|
|
|
|
func ErrOutOfRange[T ~int | ~uint32](value T, field string) error { |
|
|
|
|
return core.Wrap(syscall.EINVAL, "%s out of range (%v)", field, value) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
type intID interface { |
|
|
|
|
~int |
|
|
|
|
Valid() bool |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func idString[T intID](p T) string { |
|
|
|
|
switch { |
|
|
|
|
case p == 0: |
|
|
|
|
return "unspecified" |
|
|
|
|
case p.Valid(): |
|
|
|
|
return strconv.Itoa(int(p)) |
|
|
|
|
default: |
|
|
|
|
return fmt.Sprintf("invalid (%v)", int(p)) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|