examples/chat: Make chat example compile

This commit is contained in:
2025-10-19 13:18:24 -04:00
parent e5d7ad0702
commit 14a317c2ab
7 changed files with 134 additions and 178 deletions

View File

@@ -20,6 +20,15 @@ type Message interface {
Method() uint16
}
// Send encodes a message and sends it along a transaction.
func Send(trans hopp.Trans, message Message) (n int, err error) {
writer, err := trans.SendWriter(message.Method())
if err != nil { return n, err }
defer writer.Close()
encoder := tape.NewEncoder(writer)
return message.Encode(encoder)
}
// canAssign determines if data from the given source tag can be assigned to
// a Go type represented by destination. It is designed to receive destination
// values from [generate.Generator.generateCanAssign]. The eventual Go type and
@@ -225,7 +234,7 @@ func(this *MessageJoin) Decode(decoder *tape.Decoder) (n int, err error) {
// must be sent within a room transaction.
type MessageChat struct {
Content string
Nickname hopp.Option[string]
Nickname string
}
// Method returns the message's method number.
@@ -242,36 +251,34 @@ func(this *MessageChat) Encode(encoder *tape.Encoder) (n int, err error) {
nn, err = encoder.WriteUintN(2, tag_8.CN() + 1)
n += nn; if err != nil { return n, err }
{
nn, err = encoder.WriteUint16(0x0001)
n += nn; if err != nil { return n, err }
tag_9 := tape.StringTag(string((*this).Nickname))
nn, err = encoder.WriteUint8(uint8(tag_9))
n += nn; if err != nil { return n, err }
if len((*this).Nickname) > tape.MaxStructureLength {
return n, tape.ErrTooLong
}
if tag_9.Is(tape.LBA) {
nn, err = encoder.WriteUintN(uint64(len((*this).Nickname)), tag_9.CN())
n += nn; if err != nil { return n, err }
}
nn, err = encoder.Write([]byte((*this).Nickname))
n += nn; if err != nil { return n, err }
nn, err = encoder.WriteUint16(0x0000)
n += nn; if err != nil { return n, err }
tag_9 := tape.StringTag(string((*this).Content))
nn, err = encoder.WriteUint8(uint8(tag_9))
tag_10 := tape.StringTag(string((*this).Content))
nn, err = encoder.WriteUint8(uint8(tag_10))
n += nn; if err != nil { return n, err }
if len((*this).Content) > tape.MaxStructureLength {
return n, tape.ErrTooLong
}
if tag_9.Is(tape.LBA) {
nn, err = encoder.WriteUintN(uint64(len((*this).Content)), tag_9.CN())
if tag_10.Is(tape.LBA) {
nn, err = encoder.WriteUintN(uint64(len((*this).Content)), tag_10.CN())
n += nn; if err != nil { return n, err }
}
nn, err = encoder.Write([]byte((*this).Content))
n += nn; if err != nil { return n, err }
if value, ok := (*this).Nickname.Value(); ok {
nn, err = encoder.WriteUint16(0x0001)
n += nn; if err != nil { return n, err }
tag_10 := tape.StringTag(string(value))
nn, err = encoder.WriteUint8(uint8(tag_10))
n += nn; if err != nil { return n, err }
if len(value) > tape.MaxStructureLength {
return n, tape.ErrTooLong
}
if tag_10.Is(tape.LBA) {
nn, err = encoder.WriteUintN(uint64(len(value)), tag_10.CN())
n += nn; if err != nil { return n, err }
}
nn, err = encoder.Write([]byte(value))
n += nn; if err != nil { return n, err }
}
}
return n, nil
}
@@ -573,22 +580,20 @@ func decodeBranch_5c1cf9347bb6d9f41cee64b186392d24_MessageChat(this *MessageChat
tape.Skim(decoder, fieldTag_31)
continue
}
var destination_33 string
var length_34 uint64
var length_33 uint64
if fieldTag_31.Is(tape.LBA) {
length_34, nn, err = decoder.ReadUintN(int(fieldTag_31.CN()))
length_33, nn, err = decoder.ReadUintN(int(fieldTag_31.CN()))
n += nn; if err != nil { return n, err }
} else {
length_34 = uint64(fieldTag_31.CN())
length_33 = uint64(fieldTag_31.CN())
}
if length_34 > uint64(tape.MaxStructureLength) {
if length_33 > uint64(tape.MaxStructureLength) {
return n, tape.ErrTooLong
}
buffer := make([]byte, length_34)
buffer := make([]byte, length_33)
nn, err = decoder.Read(buffer)
n += nn; if err != nil { return n, err }
*(&destination_33) = string(buffer)
this.Nickname = hopp.O(destination_33)
*(&(this.Nickname)) = string(buffer)
default:
tape.Skim(decoder, fieldTag_31)
continue
@@ -599,41 +604,41 @@ func decodeBranch_5c1cf9347bb6d9f41cee64b186392d24_MessageChat(this *MessageChat
func decodeBranch_68c536511e6d598462efc482144438e9_MessageJoinNotify(this *MessageJoinNotify, decoder *tape.Decoder, tag tape.Tag) (n int, err error) {
var nn int
var length_35 uint64
if length_35 > uint64(tape.MaxStructureLength) {
var length_34 uint64
if length_34 > uint64(tape.MaxStructureLength) {
return n, tape.ErrTooLong
}
length_35, nn, err = decoder.ReadUintN(int(tag.CN()) + 1)
length_34, nn, err = decoder.ReadUintN(int(tag.CN()) + 1)
n += nn; if err != nil { return n, err }
for _ = range length_35 {
var fieldKey_36 uint16
fieldKey_36, nn, err = decoder.ReadUint16()
for _ = range length_34 {
var fieldKey_35 uint16
fieldKey_35, nn, err = decoder.ReadUint16()
n += nn; if err != nil { return n, err }
var fieldTag_37 tape.Tag
fieldTag_37, nn, err = decoder.ReadTag()
var fieldTag_36 tape.Tag
fieldTag_36, nn, err = decoder.ReadTag()
n += nn; if err != nil { return n, err }
switch fieldKey_36 {
switch fieldKey_35 {
case 0x0000:
if !(canAssign(tape.LBA, fieldTag_37)) {
tape.Skim(decoder, fieldTag_37)
if !(canAssign(tape.LBA, fieldTag_36)) {
tape.Skim(decoder, fieldTag_36)
continue
}
var length_38 uint64
if fieldTag_37.Is(tape.LBA) {
length_38, nn, err = decoder.ReadUintN(int(fieldTag_37.CN()))
var length_37 uint64
if fieldTag_36.Is(tape.LBA) {
length_37, nn, err = decoder.ReadUintN(int(fieldTag_36.CN()))
n += nn; if err != nil { return n, err }
} else {
length_38 = uint64(fieldTag_37.CN())
length_37 = uint64(fieldTag_36.CN())
}
if length_38 > uint64(tape.MaxStructureLength) {
if length_37 > uint64(tape.MaxStructureLength) {
return n, tape.ErrTooLong
}
buffer := make([]byte, length_38)
buffer := make([]byte, length_37)
nn, err = decoder.Read(buffer)
n += nn; if err != nil { return n, err }
*(&(this.Nickname)) = string(buffer)
default:
tape.Skim(decoder, fieldTag_37)
tape.Skim(decoder, fieldTag_36)
continue
}
}
@@ -642,43 +647,84 @@ func decodeBranch_68c536511e6d598462efc482144438e9_MessageJoinNotify(this *Messa
func decodeBranch_68c536511e6d598462efc482144438e9_MessageLeaveNotify(this *MessageLeaveNotify, decoder *tape.Decoder, tag tape.Tag) (n int, err error) {
var nn int
var length_39 uint64
if length_39 > uint64(tape.MaxStructureLength) {
var length_38 uint64
if length_38 > uint64(tape.MaxStructureLength) {
return n, tape.ErrTooLong
}
length_39, nn, err = decoder.ReadUintN(int(tag.CN()) + 1)
length_38, nn, err = decoder.ReadUintN(int(tag.CN()) + 1)
n += nn; if err != nil { return n, err }
for _ = range length_39 {
var fieldKey_40 uint16
fieldKey_40, nn, err = decoder.ReadUint16()
for _ = range length_38 {
var fieldKey_39 uint16
fieldKey_39, nn, err = decoder.ReadUint16()
n += nn; if err != nil { return n, err }
var fieldTag_41 tape.Tag
fieldTag_41, nn, err = decoder.ReadTag()
var fieldTag_40 tape.Tag
fieldTag_40, nn, err = decoder.ReadTag()
n += nn; if err != nil { return n, err }
switch fieldKey_40 {
switch fieldKey_39 {
case 0x0000:
if !(canAssign(tape.LBA, fieldTag_41)) {
tape.Skim(decoder, fieldTag_41)
if !(canAssign(tape.LBA, fieldTag_40)) {
tape.Skim(decoder, fieldTag_40)
continue
}
var length_42 uint64
if fieldTag_41.Is(tape.LBA) {
length_42, nn, err = decoder.ReadUintN(int(fieldTag_41.CN()))
var length_41 uint64
if fieldTag_40.Is(tape.LBA) {
length_41, nn, err = decoder.ReadUintN(int(fieldTag_40.CN()))
n += nn; if err != nil { return n, err }
} else {
length_42 = uint64(fieldTag_41.CN())
length_41 = uint64(fieldTag_40.CN())
}
if length_42 > uint64(tape.MaxStructureLength) {
if length_41 > uint64(tape.MaxStructureLength) {
return n, tape.ErrTooLong
}
buffer := make([]byte, length_42)
buffer := make([]byte, length_41)
nn, err = decoder.Read(buffer)
n += nn; if err != nil { return n, err }
*(&(this.Nickname)) = string(buffer)
default:
tape.Skim(decoder, fieldTag_41)
tape.Skim(decoder, fieldTag_40)
continue
}
}
return n, nil
}
// Receive decodes a message from a transaction and returns it as a value.
// Use a type switch to determine what type of message it is.
func Receive(trans hopp.Trans) (message any, n int, err error) {
method, reader, err := trans.ReceiveReader()
decoder := tape.NewDecoder(reader)
if err != nil { return nil, n, err }
switch method {
case 0001:
var message MessageSuccess
nn, err := message.Decode(decoder)
n += nn; if err != nil { return nil, n, err }
return message, n, nil
case 0200:
var message MessageJoin
nn, err := message.Decode(decoder)
n += nn; if err != nil { return nil, n, err }
return message, n, nil
case 0300:
var message MessageChat
nn, err := message.Decode(decoder)
n += nn; if err != nil { return nil, n, err }
return message, n, nil
case 0400:
var message MessageJoinNotify
nn, err := message.Decode(decoder)
n += nn; if err != nil { return nil, n, err }
return message, n, nil
case 0401:
var message MessageLeaveNotify
nn, err := message.Decode(decoder)
n += nn; if err != nil { return nil, n, err }
return message, n, nil
case 0000:
var message MessageError
nn, err := message.Decode(decoder)
n += nn; if err != nil { return nil, n, err }
return message, n, nil
}
return nil, n, hopp.ErrUnknownMethod
}