ident: member interface

For representing full identifiers of system and member.

Signed-off-by: Yonah <contrib@gensokyo.uk>
This commit is contained in:
2026-03-22 16:34:51 +09:00
parent c0c39f34f0
commit 1354a2c9a3
4 changed files with 31 additions and 1 deletions

View File

@@ -3,7 +3,9 @@
package ident
import (
"encoding"
"errors"
"fmt"
"strconv"
)
@@ -21,3 +23,21 @@ func (e *UnexpectedSizeError) Error() string {
return "got " + strconv.Itoa(len(e.Data)) + " bytes for " +
"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()
}

View File

@@ -69,7 +69,7 @@ func (testCases rTestCases[V, S]) run(t *testing.T) {
}
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)
}
})
})

View File

@@ -23,6 +23,8 @@ type M struct {
System S
}
func (*M) ident() {}
const (
// SizeMember is the size of the binary representation of [M].
SizeMember = SizeSystem * 2
@@ -30,6 +32,9 @@ const (
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
// the extended buffer.
func (mid *M) Encode(dst []byte) []byte {

View File

@@ -31,6 +31,8 @@ type S struct {
ID uint64
}
func (*S) ident() {}
const (
// SizeSystem is the size of the binary representation of [S].
SizeSystem = 24
@@ -38,6 +40,9 @@ const (
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
// the extended buffer.
func (sid *S) Encode(dst []byte) []byte {