Refactor void handling: add specialized encoder/decoder/type logic, update void-based operations for clarity and correctness
This commit is contained in:
+2
-3
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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"),
|
||||||
|
|||||||
@@ -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,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user