Refactor void handling: add specialized encoder/decoder/type logic, update void-based operations for clarity and correctness

This commit is contained in:
adman
2025-12-27 19:34:27 +01:00
parent 08f265c259
commit 3ddf830d31
9 changed files with 46 additions and 39 deletions
+2 -3
View File
@@ -34,7 +34,7 @@ type Anon struct {
Value any Value any
} }
func (s Anon) Decode(r io.Reader) (ret Anon, err error) { func (s *Anon) Decode(r io.Reader) (err error) {
id := int8(0) id := int8(0)
err = binary.Read(r, Order, &id) err = binary.Read(r, Order, &id)
if err != nil { if err != nil {
@@ -44,11 +44,10 @@ func (s Anon) Decode(r io.Reader) (ret Anon, err error) {
if err != nil { if err != nil {
return return
} }
ret = s
return return
} }
func (s Anon) Encode(w io.Writer) (err error) { func (s *Anon) Encode(w io.Writer) (err error) {
id, err := getId(s.Value) id, err := getId(s.Value)
if err != nil { if err != nil {
return return
+6 -15
View File
@@ -75,29 +75,20 @@ type PacketIdentifier struct {
type ( type (
ToDo struct{} ToDo struct{}
Void struct{}
RestBuffer []byte RestBuffer []byte
) )
func (v Void) Encode(_ io.Writer) (err error) {
return
}
func (v Void) Decode(_ io.Reader) (ret Void, err error) {
return
}
var ToDoError = errors.New("to do") var ToDoError = errors.New("to do")
var BadTypeError = errors.New("bad type") var BadTypeError = errors.New("bad type")
func (r RestBuffer) Encode(w io.Writer) (err error) { func (r *RestBuffer) Encode(w io.Writer) (err error) {
_, err = w.Write(r) _, err = w.Write(*r)
return return
} }
func (RestBuffer) Decode(r io.Reader) (ret RestBuffer, err error) { func (ret *RestBuffer) Decode(r io.Reader) (err error) {
b, err := io.ReadAll(r) b, err := io.ReadAll(r)
ret = b *ret = b
return return
} }
@@ -215,7 +206,7 @@ func ErroringIndex[K comparable, V any, M map[K]V](m M, i K) (v V, err error) {
return return
} }
type EncodeDecodeAble[Self any] interface { type EncodeDecodeAble interface {
Encode(w io.Writer) (err error) Encode(w io.Writer) (err error)
Decode(r io.Reader) (ret Self, err error) Decode(r io.Reader) (err error)
} }
+2 -3
View File
@@ -1,9 +1,8 @@
package v1_21_8 package v1_21_8
import ( import (
"io"
"github.com/admin-else/strom/proto_base" "github.com/admin-else/strom/proto_base"
"io"
) )
func HandshakingToServerPacketIdentifierToType(s string) (t any) { func HandshakingToServerPacketIdentifierToType(s string) (t any) {
@@ -1205,7 +1204,7 @@ func DecodePacket(d proto_base.Direction, s proto_base.State, r io.Reader) (para
params = packet.Params params = packet.Params
case proto_base.Play: case proto_base.Play:
var packet PlayToServerPacket var packet PlayToServerPacket
packet, err = PlayToServerPacket{}.Decode(r) packet, err = packet.Decode(r)
if err != nil { if err != nil {
return return
} }
+3 -3
View File
@@ -226,8 +226,8 @@ func (g *Generator) GenerateTypes(prefix string, types Types) error {
AppendDecl(g.File, TypeDecl(tName, e)) AppendDecl(g.File, TypeDecl(tName, e))
args := []NameAndType{{"r", Ident("io.Reader")}} args := []NameAndType{{"r", Ident("io.Reader")}}
rets := []NameAndType{{"ret", Ident(tName)}, {"err", Ident("error")}} rets := []NameAndType{{"err", Ident("error")}}
decodeFunction := NewFuncWithReceiver("Decode", "_", tName, args, rets) decodeFunction := NewFuncWithReceiver("Decode", "ret", Pointer(Ident(tName)), args, rets)
g.Depth = 0 g.Depth = 0
s, err := g.VisitDecoder(retExpr, v, tName) s, err := g.VisitDecoder(retExpr, v, tName)
if err != nil { if err != nil {
@@ -241,7 +241,7 @@ func (g *Generator) GenerateTypes(prefix string, types Types) error {
args = []NameAndType{{"w", Ident("io.Writer")}} args = []NameAndType{{"w", Ident("io.Writer")}}
rets = []NameAndType{{"err", Ident("error")}} rets = []NameAndType{{"err", Ident("error")}}
encodeFunction := NewFuncWithReceiver("Encode", "ret", tName, args, rets) encodeFunction := NewFuncWithReceiver("Encode", "ret", Pointer(Ident(tName)), args, rets)
g.Depth = 0 g.Depth = 0
s, err = g.VisitEncoder(retExpr, v, tName) s, err = g.VisitEncoder(retExpr, v, tName)
if err != nil { if err != nil {
+6 -2
View File
@@ -12,7 +12,7 @@ import (
func DefaultDecoder(_ *Generator, varToSet ast.Expr, _ any, _ string) (s []ast.Stmt, err error) { func DefaultDecoder(_ *Generator, varToSet ast.Expr, _ any, _ string) (s []ast.Stmt, err error) {
s = Stmts( s = Stmts(
Assign( Assign(
Exprs(varToSet, Ident("err")), Exprs(Ident("err")),
Exprs(Call(SelectorExprAndStr(varToSet, "Decode"), Ident("r"))), Exprs(Call(SelectorExprAndStr(varToSet, "Decode"), Ident("r"))),
), ),
IfErrNil(), IfErrNil(),
@@ -511,6 +511,10 @@ func VarLongDecoder(g *Generator, varToSet ast.Expr, dataRaw any, name string) (
return return
} }
func VoidDecoder(g *Generator, varToSet ast.Expr, dataRaw any, name string) (s []ast.Stmt, err error) {
return
}
func (g *Generator) RegisterDecoderNatives() { func (g *Generator) RegisterDecoderNatives() {
g.DecoderNatives = map[string]FunctionGeneratorFunc{ g.DecoderNatives = map[string]FunctionGeneratorFunc{
"container": ContainerDecoder, "container": ContainerDecoder,
@@ -523,7 +527,7 @@ func (g *Generator) RegisterDecoderNatives() {
"bitfield": BitFieldDecoder, "bitfield": BitFieldDecoder,
"string": StringDecoder, "string": StringDecoder,
"void": DefaultDecoder, "void": VoidDecoder,
"varint": VarIntDecoder, "varint": VarIntDecoder,
"varlong": VarLongDecoder, "varlong": VarLongDecoder,
"anonymousNbt": DefaultDecoder, "anonymousNbt": DefaultDecoder,
+10 -2
View File
@@ -192,7 +192,11 @@ func SwitchEncoder(g *Generator, varToSet ast.Expr, dataRaw any, name string) (s
if err != nil { if err != nil {
return return
} }
s1 := Define(Exprs(Ident(name), Ident("ok")), Exprs(TypeAssert(varToSet, tType))) varName := name
if fType == "void" {
varName = "_"
}
s1 := Define(Exprs(Ident(varName), Ident("ok")), Exprs(TypeAssert(varToSet, tType)))
s2 := If(Not(Ident("ok")), NewBlockEllipsis(Assign121(Ident("err"), Selector("proto_base", "BadTypeError")), Return())) s2 := If(Not(Ident("ok")), NewBlockEllipsis(Assign121(Ident("err"), Selector("proto_base", "BadTypeError")), Return()))
var caseDecodeValueStmts []ast.Stmt var caseDecodeValueStmts []ast.Stmt
caseDecodeValueStmts, err = g.VisitEncoder(Ident(name), fType, name) caseDecodeValueStmts, err = g.VisitEncoder(Ident(name), fType, name)
@@ -333,6 +337,10 @@ func VarLongEncoder(g *Generator, varToSet ast.Expr, dataRaw any, name string) (
return return
} }
func VoidEncoder(_ *Generator, _ ast.Expr, _ any, _ string) (s []ast.Stmt, err error) {
return
}
func (g *Generator) RegisterEncoderNatives() { func (g *Generator) RegisterEncoderNatives() {
g.EncoderNatives = map[string]FunctionGeneratorFunc{ g.EncoderNatives = map[string]FunctionGeneratorFunc{
"container": ContainerEncoder, "container": ContainerEncoder,
@@ -344,7 +352,7 @@ func (g *Generator) RegisterEncoderNatives() {
"buffer": BufferEncoder, "buffer": BufferEncoder,
"bitfield": BitFieldEncoder, "bitfield": BitFieldEncoder,
"void": DefaultEncoder, "void": VoidEncoder,
"varint": VarIntEncoder, "varint": VarIntEncoder,
"varlong": VarLongEncoder, "varlong": VarLongEncoder,
"anonymousNbt": DefaultEncoder, "anonymousNbt": DefaultEncoder,
+6 -1
View File
@@ -153,6 +153,11 @@ func MakeSelectorVisitor(x, sel string) func(g *Generator, dataRaw any) (e ast.E
} }
} }
func VoidType(_ *Generator, _ any) (e ast.Expr, err error) {
e = NewStruct()
return
}
func (g *Generator) RegisterNatives() { func (g *Generator) RegisterNatives() {
g.Natives = map[string]ExprGeneratorFunc{ g.Natives = map[string]ExprGeneratorFunc{
"container": VisitContainerType, "container": VisitContainerType,
@@ -164,7 +169,7 @@ func (g *Generator) RegisterNatives() {
"native": VisitDontGenerateType, "native": VisitDontGenerateType,
"anonymousNbt": MakeSelectorVisitor("nbt", "Anon"), "anonymousNbt": MakeSelectorVisitor("nbt", "Anon"),
"anonOptionalNbt": MakeSelectorVisitor("nbt", "Anon"), // I have no idea what the difference is between these two "anonOptionalNbt": MakeSelectorVisitor("nbt", "Anon"), // I have no idea what the difference is between these two
"void": MakeSelectorVisitor("proto_base", "Void"), "void": VoidType,
"bool": MakeIdentVisitor("bool"), "bool": MakeIdentVisitor("bool"),
"u8": MakeIdentVisitor("uint8"), "u8": MakeIdentVisitor("uint8"),
"u16": MakeIdentVisitor("uint16"), "u16": MakeIdentVisitor("uint16"),
+2 -2
View File
@@ -269,13 +269,13 @@ func NewFunc(name string, arguments []NameAndType, returns []NameAndType) *ast.F
} }
} }
func NewFuncWithReceiver(name, receiverName, receiver string, arguments []NameAndType, returns []NameAndType) *ast.FuncDecl { func NewFuncWithReceiver(name, receiverName string, receiver ast.Expr, arguments []NameAndType, returns []NameAndType) *ast.FuncDecl {
f := NewFunc(name, arguments, returns) f := NewFunc(name, arguments, returns)
f.Recv = &ast.FieldList{ f.Recv = &ast.FieldList{
List: []*ast.Field{ List: []*ast.Field{
{ {
Names: []*ast.Ident{{Name: receiverName}}, Names: []*ast.Ident{{Name: receiverName}},
Type: &ast.Ident{Name: receiver}, Type: receiver,
}, },
}, },
} }
+9 -8
View File
@@ -11,6 +11,7 @@ import (
"github.com/admin-else/strom/event" "github.com/admin-else/strom/event"
"github.com/admin-else/strom/proto" "github.com/admin-else/strom/proto"
"github.com/admin-else/strom/proto_base" "github.com/admin-else/strom/proto_base"
"github.com/admin-else/strom/proto_generated"
"github.com/admin-else/strom/proto_generated/v1_21_8" "github.com/admin-else/strom/proto_generated/v1_21_8"
"github.com/admin-else/strom/server" "github.com/admin-else/strom/server"
"github.com/admin-else/strom/server/server_modules" "github.com/admin-else/strom/server/server_modules"
@@ -21,8 +22,8 @@ type ProxyClient struct {
Server *Proxy Server *Proxy
} }
func (p *ProxyClient) Default(event any) (err error) { func (p *ProxyClient) OnDefault(event event.Default) (err error) {
err = p.Server.Send(event) err = p.Server.Send(event.Val)
return return
} }
@@ -34,8 +35,8 @@ func (p *ProxyClient) OnStart(_ event.OnStart) (err error) {
return return
} }
func (p *ProxyClient) OnUncodeable(packet proto.UnCodablePacket) (err error) { func (p *ProxyClient) OnUnCodeAble(packet proto.UnCodablePacket) (err error) {
err = p.Default(packet) err = p.OnDefault(event.Default{Val: packet})
if err != nil { if err != nil {
return return
} }
@@ -71,7 +72,7 @@ func (p *Proxy) OnFinishConfiguration(packet v1_21_8.ConfigurationToServerPacket
return return
} }
func (p *Proxy) OnUncodeable(packet proto.UnCodablePacket) (err error) { func (p *Proxy) OnUnCodeAble(packet proto.UnCodablePacket) (err error) {
err = p.Default(packet) err = p.Default(packet)
if err != nil { if err != nil {
return return
@@ -117,7 +118,7 @@ func SaveUnCodeAbleAsTest(d proto_base.Direction, packet proto.UnCodablePacket)
var StatusResponse = server_modules.StatusResponse{Description: struct { var StatusResponse = server_modules.StatusResponse{Description: struct {
Text string `json:"text"` Text string `json:"text"`
}{Text: "Uncodeable packet hunter proxy"}, Version: struct { }{Text: "Un-code-able packet hunter proxy"}, Version: struct {
Name string `json:"name"` Name string `json:"name"`
Protocol int `json:"protocol"` Protocol int `json:"protocol"`
}{Name: "STROM", Protocol: 772}} }{Name: "STROM", Protocol: 772}}
@@ -143,10 +144,10 @@ func main() {
defer pc.Close() defer pc.Close()
defer p.Close() defer p.Close()
go func() { go func() {
errChan <- pc.Start(pc) errChan <- pc.StartOne(pc)
}() }()
go func() { go func() {
errChan <- p.Start(p) errChan <- p.StartOne(p)
}() }()
err = <-errChan err = <-errChan
return return