generate: It is no longer possible to make impossible type asserts with Receive
This commit is contained in:
parent
3b5a498aa5
commit
647619a7f6
@ -114,6 +114,8 @@ func (this *Generator) Generate(protocol *Protocol) (n int, err error) {
|
|||||||
n += nn; if err != nil { return n, err }
|
n += nn; if err != nil { return n, err }
|
||||||
|
|
||||||
// type definitions
|
// type definitions
|
||||||
|
nn, err = this.generateMessageValueInterface()
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
for _, name := range slices.Sorted(maps.Keys(protocol.Types)) {
|
for _, name := range slices.Sorted(maps.Keys(protocol.Types)) {
|
||||||
nn, err := this.generateTypedef(name, protocol.Types[name])
|
nn, err := this.generateTypedef(name, protocol.Types[name])
|
||||||
n += nn; if err != nil { return n, err }
|
n += nn; if err != nil { return n, err }
|
||||||
@ -140,6 +142,42 @@ func (this *Generator) Generate(protocol *Protocol) (n int, err error) {
|
|||||||
return n, nil
|
return n, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (this *Generator) generateMessageValueInterface() (n int, err error) {
|
||||||
|
keys := slices.Sorted(maps.Keys(this.protocol.Messages))
|
||||||
|
nn, err := this.iprint(
|
||||||
|
"\n// ReceivedMessage is a sealed interface representing the value of a\n" +
|
||||||
|
"// message in this package. To determine what kind of message it is,\n" +
|
||||||
|
"// use a type switch like this:\n" +
|
||||||
|
"// \n" +
|
||||||
|
"// switch message := message.(type) {\n")
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
for index, method := range keys {
|
||||||
|
if index > 2 {
|
||||||
|
nn, err := this.iprint("// \n// ...\n// \n")
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
break
|
||||||
|
}
|
||||||
|
nn, err := this.iprintf("// case %s:\n",
|
||||||
|
this.resolveMessageName(this.protocol.Messages[method].Name))
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
nn, err = this.iprintf("// doSomething()\n")
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
}
|
||||||
|
nn, err = this.iprintf("// }\n")
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
|
||||||
|
nn, err = this.iprintf("type ReceivedMessage interface {\n")
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
this.push()
|
||||||
|
nn, err = this.iprintf("isReceivedMessage()\n")
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
this.pop()
|
||||||
|
nn, err = this.iprintf("}\n")
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
|
||||||
|
return n, nil
|
||||||
|
}
|
||||||
|
|
||||||
func (this *Generator) generateTypedef(name string, typedef Typedef) (n int, err error) {
|
func (this *Generator) generateTypedef(name string, typedef Typedef) (n int, err error) {
|
||||||
typ := typedef.Type
|
typ := typedef.Type
|
||||||
|
|
||||||
@ -327,6 +365,10 @@ func (this *Generator) generateMessage(method uint16, message Message) (n int, e
|
|||||||
this.pop()
|
this.pop()
|
||||||
nn, err = this.iprintf("}\n")
|
nn, err = this.iprintf("}\n")
|
||||||
n += nn; if err != nil { return n, err }
|
n += nn; if err != nil { return n, err }
|
||||||
|
|
||||||
|
// isReceivedMessage method
|
||||||
|
nn, err = this.iprintf("func (this %s) isReceivedMessage() { }\n", this.resolveMessageName(message.Name))
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
|
||||||
return n, nil
|
return n, nil
|
||||||
}
|
}
|
||||||
@ -1207,7 +1249,7 @@ func (this *Generator) generateReceive() (n int, err error) {
|
|||||||
"// Use a type switch to determine what type of message it is.\n")
|
"// Use a type switch to determine what type of message it is.\n")
|
||||||
n += nn; if err != nil { return n, err }
|
n += nn; if err != nil { return n, err }
|
||||||
nn, err = this.iprintf(
|
nn, err = this.iprintf(
|
||||||
"func Receive(trans hopp.Trans) (message any, n int, err error) {\n")
|
"func Receive(trans hopp.Trans) (message ReceivedMessage, n int, err error) {\n")
|
||||||
n += nn; if err != nil { return n, err }
|
n += nn; if err != nil { return n, err }
|
||||||
this.push()
|
this.push()
|
||||||
nn, err = this.iprintf("method, reader, err := trans.ReceiveReader()\n")
|
nn, err = this.iprintf("method, reader, err := trans.ReceiveReader()\n")
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user