From 285e83d9951b490033cfbfb4672fbb4c7869d924 Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Fri, 20 Jun 2025 15:55:37 -0400 Subject: [PATCH] Merge codec and tape packages --- generate/generate.go | 29 +++++++++++++++++++++-------- {codec => tape}/decode.go | 2 +- tape/dynamic.go | 3 +-- {codec => tape}/encode.go | 2 +- {codec => tape}/measure.go | 2 +- {codec => tape}/measure_test.go | 2 +- tape/tag.go | 4 +--- 7 files changed, 27 insertions(+), 17 deletions(-) rename {codec => tape}/decode.go (99%) rename {codec => tape}/encode.go (99%) rename {codec => tape}/measure.go (96%) rename {codec => tape}/measure_test.go (97%) diff --git a/generate/generate.go b/generate/generate.go index e3e262b..939d399 100644 --- a/generate/generate.go +++ b/generate/generate.go @@ -6,12 +6,11 @@ import "maps" import "math" import "slices" import "strings" -import "git.tebibyte.media/sashakoshka/hopp/codec" +import "git.tebibyte.media/sashakoshka/hopp/tape" const imports = ` import "git.teibibyte.media/sashakoshka/hopp/tape" -import "git.teibibyte.media/sashakoshka/hopp/codec" ` const preamble = ` @@ -31,8 +30,8 @@ type Table map[uint16] any // Message is any message that can be sent along this protocol. type Message interface { - codec.Encodable - codec.Decodable + tape.Encodable + tape.Decodable // Method returns the method code of the message. Method() uint16 @@ -122,7 +121,7 @@ func (this *Generator) generateTypedef(name string, typ Type) (n int, err error) "specified by the tag, if possible.\n") n += nn; if err != nil { return n, err } nn, err = this.iprintf( - "func (this *%s) EncodeValue(encoder *codec.Encoder, tag tape.Tag) (n int, err error) {\n", + "func (this *%s) EncodeValue(encoder *tape.Encoder, tag tape.Tag) (n int, err error) {\n", name) n += nn; if err != nil { return n, err } this.push() @@ -136,7 +135,21 @@ func (this *Generator) generateTypedef(name string, typ Type) (n int, err error) nn, err = this.iprintf("}\n") n += nn; if err != nil { return n, err } - // TODO DecodeValue method + // DecodeValue method + nn, err = this.iprintf( + "\n // DecodeValue decodes the value of this type without " + + "the tag. The value is\n// decoded according to the " + + "parameters specified by the tag, if possible.\n") + n += nn; if err != nil { return n, err } + nn, err = this.iprintf( + "func (this *%s) DecodeValue(decoder *tape.Decoder, tag tape.Tag) (n int, err error) {\n", + name) + n += nn; if err != nil { return n, err } + this.push() + // TODO + this.pop() + nn, err = this.iprintf("}\n") + n += nn; if err != nil { return n, err } return n, nil } @@ -156,7 +169,7 @@ func (this *Generator) generateMessage(method uint16, message Message) (n int, e nn, err = this.iprintf("\n// Encode encodes this message's tag and value.\n") n += nn; if err != nil { return n, err } nn, err = this.iprintf( - "func(this %s) Encode(encoder *codec.Encoder) (n int, err error) {\n", + "func(this %s) Encode(encoder *tape.Encoder) (n int, err error) {\n", this.resolveMessageName(message.Name)) n += nn; if err != nil { return n, err } this.push() @@ -378,7 +391,7 @@ func (this *Generator) generateTag(typ Type, source string) (n int, err error) { nn, err := this.printf("tape.TagKTV.WithCN(tape.IntBytes(uint64(len(%s))))", source) n += nn; if err != nil { return n, err } case TypeTableDefined: - nn, err := this.printf("tape.TagKTV.WithCN(%d)", codec.IntBytes(uint64(len(typ.Fields)))) + nn, err := this.printf("tape.TagKTV.WithCN(%d)", tape.IntBytes(uint64(len(typ.Fields)))) n += nn; if err != nil { return n, err } case TypeNamed: resolved, err := this.resolveTypeName(typ.Name) diff --git a/codec/decode.go b/tape/decode.go similarity index 99% rename from codec/decode.go rename to tape/decode.go index c4cdb9f..466324b 100644 --- a/codec/decode.go +++ b/tape/decode.go @@ -1,4 +1,4 @@ -package codec +package tape import "io" diff --git a/tape/dynamic.go b/tape/dynamic.go index 4564e2e..fd35dfd 100644 --- a/tape/dynamic.go +++ b/tape/dynamic.go @@ -2,7 +2,6 @@ package tape import "fmt" import "reflect" -import "git.tebibyte.media/sashakoshka/hopp/codec" // EncodeAny encodes an "any" value. Returns an error if the underlying type is // unsupported. Supported types are: @@ -14,7 +13,7 @@ import "git.tebibyte.media/sashakoshka/hopp/codec" // - string // - [] // - map[uint16] -func EncodeAny(encoder *codec.Encoder, value any) (Tag, error) { +func EncodeAny(encoder *Encoder, value any) (Tag, error) { // TODO } diff --git a/codec/encode.go b/tape/encode.go similarity index 99% rename from codec/encode.go rename to tape/encode.go index 125c11a..121f1e9 100644 --- a/codec/encode.go +++ b/tape/encode.go @@ -1,4 +1,4 @@ -package codec +package tape import "io" diff --git a/codec/measure.go b/tape/measure.go similarity index 96% rename from codec/measure.go rename to tape/measure.go index 5c2e134..ded5153 100644 --- a/codec/measure.go +++ b/tape/measure.go @@ -1,4 +1,4 @@ -package codec +package tape // GBEUSize returns the size (in octets) of a GBEU integer. func GBEUSize(value uint64) int { diff --git a/codec/measure_test.go b/tape/measure_test.go similarity index 97% rename from codec/measure_test.go rename to tape/measure_test.go index a1f4291..4cce9dd 100644 --- a/codec/measure_test.go +++ b/tape/measure_test.go @@ -1,4 +1,4 @@ -package codec +package tape import "testing" diff --git a/tape/tag.go b/tape/tag.go index fb603df..a2a9fd4 100644 --- a/tape/tag.go +++ b/tape/tag.go @@ -1,7 +1,5 @@ package tape -import "git.tebibyte.media/sashakoshka/hopp/codec" - type Tag byte; const ( SI Tag = 0 << 5 // Small integer LI Tag = 1 << 5 // Large integer @@ -40,6 +38,6 @@ func bufferLenTag(length int) Tag { if length < int(CNLimit) { return SBA.WithCN(length) } else { - return LBA.WithCN(codec.IntBytes(uint64(length))) + return LBA.WithCN(IntBytes(uint64(length))) } }