ident: member interface
For representing full identifiers of system and member. Signed-off-by: Yonah <contrib@gensokyo.uk>
This commit is contained in:
@@ -3,7 +3,9 @@
|
|||||||
package ident
|
package ident
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"encoding"
|
||||||
"errors"
|
"errors"
|
||||||
|
"fmt"
|
||||||
"strconv"
|
"strconv"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -21,3 +23,21 @@ func (e *UnexpectedSizeError) Error() string {
|
|||||||
return "got " + strconv.Itoa(len(e.Data)) + " bytes for " +
|
return "got " + strconv.Itoa(len(e.Data)) + " bytes for " +
|
||||||
"a " + strconv.Itoa(e.Want) + "-byte identifier"
|
"a " + strconv.Itoa(e.Want) + "-byte identifier"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MS is a system or member identifier.
|
||||||
|
type MS interface {
|
||||||
|
encoding.TextMarshaler
|
||||||
|
encoding.TextUnmarshaler
|
||||||
|
fmt.Stringer
|
||||||
|
|
||||||
|
// EncodedSize returns the number of bytes appended by Encode.
|
||||||
|
EncodedSize() int
|
||||||
|
// Encode appends the canonical string representation of MS to dst and
|
||||||
|
// returns the extended buffer.
|
||||||
|
Encode(dst []byte) []byte
|
||||||
|
|
||||||
|
// ident is a no-op function but serves to distinguish types that are
|
||||||
|
// identifiers from ordinary types with custom marshaler/unmarshaler
|
||||||
|
// behaviour: a type is an identifier part if it has an ident method.
|
||||||
|
ident()
|
||||||
|
}
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ func (testCases rTestCases[V, S]) run(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if got := S(&tc.ident).String(); got != string(tc.want) {
|
if got := S(&tc.ident).String(); got != string(tc.want) {
|
||||||
t.Errorf("String: %#v, want %#v", []byte(got), tc.want)
|
t.Errorf("String: %s, want %s", got, tc.want)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -23,6 +23,8 @@ type M struct {
|
|||||||
System S
|
System S
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (*M) ident() {}
|
||||||
|
|
||||||
const (
|
const (
|
||||||
// SizeMember is the size of the binary representation of [M].
|
// SizeMember is the size of the binary representation of [M].
|
||||||
SizeMember = SizeSystem * 2
|
SizeMember = SizeSystem * 2
|
||||||
@@ -30,6 +32,9 @@ const (
|
|||||||
EncodedSizeMember = SizeMember / 3 * 4
|
EncodedSizeMember = SizeMember / 3 * 4
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// EncodedSize returns the number of bytes appended by Encode.
|
||||||
|
func (*M) EncodedSize() int { return EncodedSizeMember }
|
||||||
|
|
||||||
// Encode appends the canonical string representation of mid to dst and returns
|
// Encode appends the canonical string representation of mid to dst and returns
|
||||||
// the extended buffer.
|
// the extended buffer.
|
||||||
func (mid *M) Encode(dst []byte) []byte {
|
func (mid *M) Encode(dst []byte) []byte {
|
||||||
|
|||||||
@@ -31,6 +31,8 @@ type S struct {
|
|||||||
ID uint64
|
ID uint64
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (*S) ident() {}
|
||||||
|
|
||||||
const (
|
const (
|
||||||
// SizeSystem is the size of the binary representation of [S].
|
// SizeSystem is the size of the binary representation of [S].
|
||||||
SizeSystem = 24
|
SizeSystem = 24
|
||||||
@@ -38,6 +40,9 @@ const (
|
|||||||
EncodedSizeSystem = SizeSystem / 3 * 4
|
EncodedSizeSystem = SizeSystem / 3 * 4
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// EncodedSize returns the number of bytes appended by Encode.
|
||||||
|
func (*S) EncodedSize() int { return EncodedSizeSystem }
|
||||||
|
|
||||||
// Encode appends the canonical string representation of sid to dst and returns
|
// Encode appends the canonical string representation of sid to dst and returns
|
||||||
// the extended buffer.
|
// the extended buffer.
|
||||||
func (sid *S) Encode(dst []byte) []byte {
|
func (sid *S) Encode(dst []byte) []byte {
|
||||||
|
|||||||
Reference in New Issue
Block a user