examples/chat: Rewrite in PDL
This commit is contained in:
parent
75810bfda1
commit
476833709e
@ -1,369 +0,0 @@
|
|||||||
package chat
|
|
||||||
|
|
||||||
import "git.tebibyte.media/sashakoshka/hopp"
|
|
||||||
import "git.tebibyte.media/sashakoshka/hopp/tape"
|
|
||||||
|
|
||||||
// Send sends one message along a transaction.
|
|
||||||
func Send(trans hopp.Trans, message hopp.Message) error {
|
|
||||||
buffer, err := message.MarshalBinary()
|
|
||||||
if err != nil { return err }
|
|
||||||
return trans.Send(message.Method(), buffer)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Receive receives one message from a transaction.
|
|
||||||
func Receive(trans hopp.Trans) (hopp.Message, error) {
|
|
||||||
method, data, err := trans.Receive()
|
|
||||||
if err != nil { return nil, err }
|
|
||||||
switch method {
|
|
||||||
case 0x0000:
|
|
||||||
message := &MessageError { }
|
|
||||||
err := message.UnmarshalBinary(data)
|
|
||||||
if err != nil { return nil, err }
|
|
||||||
return message, nil
|
|
||||||
case 0x0001:
|
|
||||||
message := &MessageSuccess { }
|
|
||||||
err := message.UnmarshalBinary(data)
|
|
||||||
if err != nil { return nil, err }
|
|
||||||
return message, nil
|
|
||||||
case 0x0100:
|
|
||||||
message := &MessageUpdateProfile { }
|
|
||||||
err := message.UnmarshalBinary(data)
|
|
||||||
if err != nil { return nil, err }
|
|
||||||
return message, nil
|
|
||||||
case 0x0200:
|
|
||||||
message := &MessageJoin { }
|
|
||||||
err := message.UnmarshalBinary(data)
|
|
||||||
if err != nil { return nil, err }
|
|
||||||
return message, nil
|
|
||||||
case 0x0201:
|
|
||||||
message := &MessageChat { }
|
|
||||||
err := message.UnmarshalBinary(data)
|
|
||||||
if err != nil { return nil, err }
|
|
||||||
return message, nil
|
|
||||||
case 0x0300:
|
|
||||||
message := &MessageJoinNotify { }
|
|
||||||
err := message.UnmarshalBinary(data)
|
|
||||||
if err != nil { return nil, err }
|
|
||||||
return message, nil
|
|
||||||
case 0x0301:
|
|
||||||
message := &MessageLeaveNotify { }
|
|
||||||
err := message.UnmarshalBinary(data)
|
|
||||||
if err != nil { return nil, err }
|
|
||||||
return message, nil
|
|
||||||
default: return nil, hopp.ErrUnknownMethod
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// (0) Error is sent by a party when the other party has done something erroneous. The valid error codes are:
|
|
||||||
//
|
|
||||||
// 0: General, unspecified error
|
|
||||||
//
|
|
||||||
// The description field, if specified, determines a human-readable error to be shown to the user. The sending party must immediately close the transaction after this message is sent.
|
|
||||||
type MessageError struct {
|
|
||||||
/* 0 */ Code uint16
|
|
||||||
/* 1 */ Description hopp.Option[string]
|
|
||||||
}
|
|
||||||
|
|
||||||
// Method returns the method number of the message.
|
|
||||||
func (msg MessageError) Method() uint16 {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
// MarshalBinary encodes the data in this message into a buffer.
|
|
||||||
func (msg *MessageError) MarshalBinary() ([]byte, error) {
|
|
||||||
size := 0
|
|
||||||
count := 1
|
|
||||||
offsetCode := size
|
|
||||||
{ value := msg.Code
|
|
||||||
size += 2; _ = value }
|
|
||||||
offsetDescription := size
|
|
||||||
if value, ok := msg.Description.Get(); ok {
|
|
||||||
count ++
|
|
||||||
size += len(value) }
|
|
||||||
if size > 0xFFFF { return nil, hopp.ErrPayloadTooLarge}
|
|
||||||
if count > 0xFFFF { return nil, hopp.ErrPayloadTooLarge}
|
|
||||||
buffer := make([]byte, 2 + 4 * count + size)
|
|
||||||
tape.EncodeI16(buffer[:2], uint16(count))
|
|
||||||
{ value := msg.Code
|
|
||||||
tape.EncodeI16(buffer[offsetCode:], value)}
|
|
||||||
if value, ok := msg.Description.Get(); ok {
|
|
||||||
tape.EncodeString(buffer[offsetDescription:], value)}
|
|
||||||
return buffer, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnmarshalBinary dencodes the data from a buffer int this message.
|
|
||||||
func (msg *MessageError) UnmarshalBinary(buffer []byte) error {
|
|
||||||
pairs, err := tape.DecodePairs(buffer)
|
|
||||||
if err != nil { return err }
|
|
||||||
foundRequired := 0
|
|
||||||
for tag, data := range pairs {
|
|
||||||
switch tag {
|
|
||||||
case 0:
|
|
||||||
value, err := tape.DecodeI16[uint16](data)
|
|
||||||
if err != nil { return err }
|
|
||||||
msg.Code = value
|
|
||||||
foundRequired ++
|
|
||||||
case 1:
|
|
||||||
value, err := tape.DecodeString[string](data)
|
|
||||||
if err != nil { return err }
|
|
||||||
msg.Description = hopp.O(value)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if foundRequired != 1 { return hopp.ErrTablePairMissing }
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// (1) Success is sent by a party when it has successfully completed a task given to it by the other party. The sending party must immediately close the transaction after this message is sent.
|
|
||||||
type MessageSuccess struct {
|
|
||||||
}
|
|
||||||
|
|
||||||
// Method returns the method number of the message.
|
|
||||||
func (msg MessageSuccess) Method() uint16 {
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
|
|
||||||
// MarshalBinary encodes the data in this message into a buffer.
|
|
||||||
func (msg *MessageSuccess) MarshalBinary() ([]byte, error) {
|
|
||||||
size := 0
|
|
||||||
count := 0
|
|
||||||
if size > 0xFFFF { return nil, hopp.ErrPayloadTooLarge}
|
|
||||||
if count > 0xFFFF { return nil, hopp.ErrPayloadTooLarge}
|
|
||||||
buffer := make([]byte, 2 + 4 * count + size)
|
|
||||||
tape.EncodeI16(buffer[:2], uint16(count))
|
|
||||||
return buffer, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnmarshalBinary dencodes the data from a buffer int this message.
|
|
||||||
func (msg *MessageSuccess) UnmarshalBinary(buffer []byte) error {
|
|
||||||
// no fields
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// (256) UpdateProfile is sent by the client in a new transaction to update the profile details that will be shown to other connected clients.
|
|
||||||
type MessageUpdateProfile struct {
|
|
||||||
/* 0 */ Nickname hopp.Option[string]
|
|
||||||
}
|
|
||||||
|
|
||||||
// Method returns the method number of the message.
|
|
||||||
func (msg MessageUpdateProfile) Method() uint16 {
|
|
||||||
return 256
|
|
||||||
}
|
|
||||||
|
|
||||||
// MarshalBinary encodes the data in this message into a buffer.
|
|
||||||
func (msg *MessageUpdateProfile) MarshalBinary() ([]byte, error) {
|
|
||||||
size := 0
|
|
||||||
count := 0
|
|
||||||
offsetNickname := size
|
|
||||||
if value, ok := msg.Nickname.Get(); ok {
|
|
||||||
count ++
|
|
||||||
size += len(value) }
|
|
||||||
if size > 0xFFFF { return nil, hopp.ErrPayloadTooLarge}
|
|
||||||
if count > 0xFFFF { return nil, hopp.ErrPayloadTooLarge}
|
|
||||||
buffer := make([]byte, 2 + 4 * count + size)
|
|
||||||
tape.EncodeI16(buffer[:2], uint16(count))
|
|
||||||
if value, ok := msg.Nickname.Get(); ok {
|
|
||||||
tape.EncodeString(buffer[offsetNickname:], value)}
|
|
||||||
return buffer, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnmarshalBinary dencodes the data from a buffer int this message.
|
|
||||||
func (msg *MessageUpdateProfile) UnmarshalBinary(buffer []byte) error {
|
|
||||||
pairs, err := tape.DecodePairs(buffer)
|
|
||||||
if err != nil { return err }
|
|
||||||
foundRequired := 0
|
|
||||||
for tag, data := range pairs {
|
|
||||||
switch tag {
|
|
||||||
case 0:
|
|
||||||
value, err := tape.DecodeString[string](data)
|
|
||||||
if err != nil { return err }
|
|
||||||
msg.Nickname = hopp.O(value)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if foundRequired != 1 { return hopp.ErrTablePairMissing }
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// (512) Join is sent by the client when it wishes to join a room. It must begin a new transaction, and that transaction will persist while the user is in that room. Messages having to do with the room will be sent along this transaction. To leave the room, the client must close the transaction.
|
|
||||||
type MessageJoin struct {
|
|
||||||
/* 0 */ Room string
|
|
||||||
}
|
|
||||||
|
|
||||||
// Method returns the method number of the message.
|
|
||||||
func (msg MessageJoin) Method() uint16 {
|
|
||||||
return 512
|
|
||||||
}
|
|
||||||
|
|
||||||
// MarshalBinary encodes the data in this message into a buffer.
|
|
||||||
func (msg *MessageJoin) MarshalBinary() ([]byte, error) {
|
|
||||||
size := 0
|
|
||||||
count := 1
|
|
||||||
offsetRoom := size
|
|
||||||
{ value := msg.Room
|
|
||||||
size += len(value) }
|
|
||||||
if size > 0xFFFF { return nil, hopp.ErrPayloadTooLarge}
|
|
||||||
if count > 0xFFFF { return nil, hopp.ErrPayloadTooLarge}
|
|
||||||
buffer := make([]byte, 2 + 4 * count + size)
|
|
||||||
tape.EncodeI16(buffer[:2], uint16(count))
|
|
||||||
{ value := msg.Room
|
|
||||||
tape.EncodeString(buffer[offsetRoom:], value)}
|
|
||||||
return buffer, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnmarshalBinary dencodes the data from a buffer int this message.
|
|
||||||
func (msg *MessageJoin) UnmarshalBinary(buffer []byte) error {
|
|
||||||
pairs, err := tape.DecodePairs(buffer)
|
|
||||||
if err != nil { return err }
|
|
||||||
for tag, data := range pairs {
|
|
||||||
switch tag {
|
|
||||||
case 0:
|
|
||||||
value, err := tape.DecodeString[string](data)
|
|
||||||
if err != nil { return err }
|
|
||||||
msg.Room = value
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// (513) Chat is sent by the client when it wishes to post a message to the room. It is also relayed by the server to other clients to notify them of the message. It must be sent within a room transaction.
|
|
||||||
type MessageChat struct {
|
|
||||||
/* 0 */ Nickname hopp.Option[string]
|
|
||||||
/* 1 */ Content string
|
|
||||||
}
|
|
||||||
|
|
||||||
// Method returns the method number of the message.
|
|
||||||
func (msg MessageChat) Method() uint16 {
|
|
||||||
return 513
|
|
||||||
}
|
|
||||||
|
|
||||||
// MarshalBinary encodes the data in this message into a buffer.
|
|
||||||
func (msg *MessageChat) MarshalBinary() ([]byte, error) {
|
|
||||||
size := 0
|
|
||||||
count := 1
|
|
||||||
offsetNickname := size
|
|
||||||
if value, ok := msg.Nickname.Get(); ok {
|
|
||||||
count ++
|
|
||||||
size += len(value) }
|
|
||||||
offsetContent := size
|
|
||||||
{ value := msg.Content
|
|
||||||
size += len(value) }
|
|
||||||
if size > 0xFFFF { return nil, hopp.ErrPayloadTooLarge}
|
|
||||||
if count > 0xFFFF { return nil, hopp.ErrPayloadTooLarge}
|
|
||||||
buffer := make([]byte, 2 + 4 * count + size)
|
|
||||||
tape.EncodeI16(buffer[:2], uint16(count))
|
|
||||||
if value, ok := msg.Nickname.Get(); ok {
|
|
||||||
tape.EncodeString(buffer[offsetNickname:], value)}
|
|
||||||
{ value := msg.Content
|
|
||||||
tape.EncodeString(buffer[offsetContent:], value)}
|
|
||||||
return buffer, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnmarshalBinary dencodes the data from a buffer int this message.
|
|
||||||
func (msg *MessageChat) UnmarshalBinary(buffer []byte) error {
|
|
||||||
pairs, err := tape.DecodePairs(buffer)
|
|
||||||
if err != nil { return err }
|
|
||||||
foundRequired := 0
|
|
||||||
for tag, data := range pairs {
|
|
||||||
switch tag {
|
|
||||||
case 0:
|
|
||||||
value, err := tape.DecodeString[string](data)
|
|
||||||
if err != nil { return err }
|
|
||||||
msg.Nickname = hopp.O(value)
|
|
||||||
case 1:
|
|
||||||
value, err := tape.DecodeString[string](data)
|
|
||||||
if err != nil { return err }
|
|
||||||
msg.Content = value
|
|
||||||
foundRequired ++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if foundRequired != 1 { return hopp.ErrTablePairMissing }
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// (768) JoinNotify is sent by the server when another client joins the room. It must be sent within a room transaction.
|
|
||||||
type MessageJoinNotify struct {
|
|
||||||
/* 0 */ Nickname hopp.Option[string]
|
|
||||||
}
|
|
||||||
|
|
||||||
// Method returns the method number of the message.
|
|
||||||
func (msg MessageJoinNotify) Method() uint16 {
|
|
||||||
return 768
|
|
||||||
}
|
|
||||||
|
|
||||||
// MarshalBinary encodes the data in this message into a buffer.
|
|
||||||
func (msg *MessageJoinNotify) MarshalBinary() ([]byte, error) {
|
|
||||||
size := 0
|
|
||||||
count := 0
|
|
||||||
offsetNickname := size
|
|
||||||
if value, ok := msg.Nickname.Get(); ok {
|
|
||||||
count ++
|
|
||||||
size += len(value) }
|
|
||||||
if size > 0xFFFF { return nil, hopp.ErrPayloadTooLarge}
|
|
||||||
if count > 0xFFFF { return nil, hopp.ErrPayloadTooLarge}
|
|
||||||
buffer := make([]byte, 2 + 4 * count + size)
|
|
||||||
tape.EncodeI16(buffer[:2], uint16(count))
|
|
||||||
if value, ok := msg.Nickname.Get(); ok {
|
|
||||||
tape.EncodeString(buffer[offsetNickname:], value)}
|
|
||||||
return buffer, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnmarshalBinary dencodes the data from a buffer int this message.
|
|
||||||
func (msg *MessageJoinNotify) UnmarshalBinary(buffer []byte) error {
|
|
||||||
pairs, err := tape.DecodePairs(buffer)
|
|
||||||
if err != nil { return err }
|
|
||||||
foundRequired := 0
|
|
||||||
for tag, data := range pairs {
|
|
||||||
switch tag {
|
|
||||||
case 0:
|
|
||||||
value, err := tape.DecodeString[string](data)
|
|
||||||
if err != nil { return err }
|
|
||||||
msg.Nickname = hopp.O(value)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if foundRequired != 1 { return hopp.ErrTablePairMissing }
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// (769) LeaveNotify is sent by the server when another client leaves the room. It must be sent within a room transaction.
|
|
||||||
type MessageLeaveNotify struct {
|
|
||||||
/* 0 */ Nickname hopp.Option[string]
|
|
||||||
}
|
|
||||||
|
|
||||||
// Method returns the method number of the message.
|
|
||||||
func (msg MessageLeaveNotify) Method() uint16 {
|
|
||||||
return 769
|
|
||||||
}
|
|
||||||
|
|
||||||
// MarshalBinary encodes the data in this message into a buffer.
|
|
||||||
func (msg *MessageLeaveNotify) MarshalBinary() ([]byte, error) {
|
|
||||||
size := 0
|
|
||||||
count := 0
|
|
||||||
offsetNickname := size
|
|
||||||
if value, ok := msg.Nickname.Get(); ok {
|
|
||||||
count ++
|
|
||||||
size += len(value) }
|
|
||||||
if size > 0xFFFF { return nil, hopp.ErrPayloadTooLarge}
|
|
||||||
if count > 0xFFFF { return nil, hopp.ErrPayloadTooLarge}
|
|
||||||
buffer := make([]byte, 2 + 4 * count + size)
|
|
||||||
tape.EncodeI16(buffer[:2], uint16(count))
|
|
||||||
if value, ok := msg.Nickname.Get(); ok {
|
|
||||||
tape.EncodeString(buffer[offsetNickname:], value)}
|
|
||||||
return buffer, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnmarshalBinary dencodes the data from a buffer int this message.
|
|
||||||
func (msg *MessageLeaveNotify) UnmarshalBinary(buffer []byte) error {
|
|
||||||
pairs, err := tape.DecodePairs(buffer)
|
|
||||||
if err != nil { return err }
|
|
||||||
foundRequired := 0
|
|
||||||
for tag, data := range pairs {
|
|
||||||
switch tag {
|
|
||||||
case 0:
|
|
||||||
value, err := tape.DecodeString[string](data)
|
|
||||||
if err != nil { return err }
|
|
||||||
msg.Nickname = hopp.O(value)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if foundRequired != 1 { return hopp.ErrTablePairMissing }
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
684
examples/chat/protocol.go
Normal file
684
examples/chat/protocol.go
Normal file
@ -0,0 +1,684 @@
|
|||||||
|
package chat
|
||||||
|
|
||||||
|
// Code generated by the Holanet PDL compiler. DO NOT EDIT.
|
||||||
|
// The source file is located at <path>
|
||||||
|
// Please edit that file instead, and re-compile it to this location.
|
||||||
|
// HOPP, TAPE, METADAPT, PDL/0 (c) 2025 holanet.xyz
|
||||||
|
|
||||||
|
import "git.tebibyte.media/sashakoshka/hopp"
|
||||||
|
import "git.tebibyte.media/sashakoshka/hopp/tape"
|
||||||
|
|
||||||
|
// Table is a KTV table with an undefined schema.
|
||||||
|
type Table = map[uint16] any
|
||||||
|
|
||||||
|
// Message is any message that can be sent along this protocol.
|
||||||
|
type Message interface {
|
||||||
|
tape.Encodable
|
||||||
|
tape.Decodable
|
||||||
|
|
||||||
|
// Method returns the method code of the message.
|
||||||
|
Method() uint16
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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
|
||||||
|
// the destination tag must come from the same (or hash-equivalent) PDL type.
|
||||||
|
func canAssign(destination, source tape.Tag) bool {
|
||||||
|
if destination.Is(source) { return true }
|
||||||
|
if (destination.Is(tape.SBA) || destination.Is(tape.LBA)) &&
|
||||||
|
(source.Is(tape.SBA) || source.Is(tape.LBA)) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// boolInt converts a bool to an integer.
|
||||||
|
func boolInt(input bool) int {
|
||||||
|
if input {
|
||||||
|
return 1
|
||||||
|
} else {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ensure ucontainer is always imported
|
||||||
|
var _ hopp.Option[int]
|
||||||
|
|
||||||
|
// Error is sent by a party when the other party has done something erroneous. The
|
||||||
|
// valid error codes are:
|
||||||
|
//
|
||||||
|
// - 0: General, unspecified error
|
||||||
|
//
|
||||||
|
// The description field, if specified, determines a human-readable error to be
|
||||||
|
// shown to the user. The sending party must immediately close the transaction
|
||||||
|
// after this message is sent.
|
||||||
|
type MessageError struct {
|
||||||
|
Code uint16
|
||||||
|
Description hopp.Option[string]
|
||||||
|
}
|
||||||
|
|
||||||
|
// Method returns the message's method number.
|
||||||
|
func(this *MessageError) Method() uint16 { return 0x0000 }
|
||||||
|
|
||||||
|
// Encode encodes this message's tag and value.
|
||||||
|
func(this *MessageError) Encode(encoder *tape.Encoder) (n int, err error) {
|
||||||
|
tag_1 := tape.KTV.WithCN(0)
|
||||||
|
nn, err := encoder.WriteTag(tag_1)
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
if 2 > tape.MaxStructureLength {
|
||||||
|
return n, tape.ErrTooLong
|
||||||
|
}
|
||||||
|
nn, err = encoder.WriteUintN(2, tag_1.CN() + 1)
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
{
|
||||||
|
nn, err = encoder.WriteUint16(0x0000)
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
tag_2 := tape.LI.WithCN(1)
|
||||||
|
nn, err = encoder.WriteUint8(uint8(tag_2))
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
nn, err = encoder.WriteUint16(uint16((*this).Code))
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
if value, ok := (*this).Description.Value(); ok {
|
||||||
|
nn, err = encoder.WriteUint16(0x0001)
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
tag_3 := tape.StringTag(string(value))
|
||||||
|
nn, err = encoder.WriteUint8(uint8(tag_3))
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
if len(value) > tape.MaxStructureLength {
|
||||||
|
return n, tape.ErrTooLong
|
||||||
|
}
|
||||||
|
if tag_3.Is(tape.LBA) {
|
||||||
|
nn, err = encoder.WriteUintN(uint64(len(value)), tag_3.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
|
||||||
|
}
|
||||||
|
|
||||||
|
// Decode decodes this message's tag and value.
|
||||||
|
func(this *MessageError) Decode(decoder *tape.Decoder) (n int, err error) {
|
||||||
|
tag, nn, err := decoder.ReadTag()
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
if !(canAssign(tape.KTV, tag)) {
|
||||||
|
nn, err = tape.Skim(decoder, tag)
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
return n, nil
|
||||||
|
}
|
||||||
|
nn, err = decodeBranch_1d505103df99c95e6bed0800d0ea881a_MessageError(this, decoder, tag)
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
return n, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Success is sent by a party when it has successfully completed a task given to it
|
||||||
|
// by the other party. The sending party must immediately close the transaction
|
||||||
|
// after this message is sent.
|
||||||
|
type MessageSuccess struct {
|
||||||
|
}
|
||||||
|
|
||||||
|
// Method returns the message's method number.
|
||||||
|
func(this *MessageSuccess) Method() uint16 { return 0x0001 }
|
||||||
|
|
||||||
|
// Encode encodes this message's tag and value.
|
||||||
|
func(this *MessageSuccess) Encode(encoder *tape.Encoder) (n int, err error) {
|
||||||
|
tag_4 := tape.KTV.WithCN(0)
|
||||||
|
nn, err := encoder.WriteTag(tag_4)
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
if 0 > tape.MaxStructureLength {
|
||||||
|
return n, tape.ErrTooLong
|
||||||
|
}
|
||||||
|
nn, err = encoder.WriteUintN(0, tag_4.CN() + 1)
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
{
|
||||||
|
}
|
||||||
|
return n, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Decode decodes this message's tag and value.
|
||||||
|
func(this *MessageSuccess) Decode(decoder *tape.Decoder) (n int, err error) {
|
||||||
|
tag, nn, err := decoder.ReadTag()
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
if !(canAssign(tape.KTV, tag)) {
|
||||||
|
nn, err = tape.Skim(decoder, tag)
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
return n, nil
|
||||||
|
}
|
||||||
|
nn, err = decodeBranch_99914b932bd37a50b983c5e7c90ae93b_MessageSuccess(this, decoder, tag)
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
return n, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Join is sent by the client when it wishes to join a room. It must begin a new
|
||||||
|
// transaction, and that transaction will persist while the user is in that room.
|
||||||
|
// Messages having to do with the room will be sent along this transaction. To
|
||||||
|
// leave the room, the client must close the transaction.
|
||||||
|
type MessageJoin struct {
|
||||||
|
Room string
|
||||||
|
Nickname string
|
||||||
|
}
|
||||||
|
|
||||||
|
// Method returns the message's method number.
|
||||||
|
func(this *MessageJoin) Method() uint16 { return 0x0200 }
|
||||||
|
|
||||||
|
// Encode encodes this message's tag and value.
|
||||||
|
func(this *MessageJoin) Encode(encoder *tape.Encoder) (n int, err error) {
|
||||||
|
tag_5 := tape.KTV.WithCN(0)
|
||||||
|
nn, err := encoder.WriteTag(tag_5)
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
if 2 > tape.MaxStructureLength {
|
||||||
|
return n, tape.ErrTooLong
|
||||||
|
}
|
||||||
|
nn, err = encoder.WriteUintN(2, tag_5.CN() + 1)
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
{
|
||||||
|
nn, err = encoder.WriteUint16(0x0000)
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
tag_6 := tape.StringTag(string((*this).Room))
|
||||||
|
nn, err = encoder.WriteUint8(uint8(tag_6))
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
if len((*this).Room) > tape.MaxStructureLength {
|
||||||
|
return n, tape.ErrTooLong
|
||||||
|
}
|
||||||
|
if tag_6.Is(tape.LBA) {
|
||||||
|
nn, err = encoder.WriteUintN(uint64(len((*this).Room)), tag_6.CN())
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
}
|
||||||
|
nn, err = encoder.Write([]byte((*this).Room))
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
nn, err = encoder.WriteUint16(0x0001)
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
tag_7 := tape.StringTag(string((*this).Nickname))
|
||||||
|
nn, err = encoder.WriteUint8(uint8(tag_7))
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
if len((*this).Nickname) > tape.MaxStructureLength {
|
||||||
|
return n, tape.ErrTooLong
|
||||||
|
}
|
||||||
|
if tag_7.Is(tape.LBA) {
|
||||||
|
nn, err = encoder.WriteUintN(uint64(len((*this).Nickname)), tag_7.CN())
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
}
|
||||||
|
nn, err = encoder.Write([]byte((*this).Nickname))
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
}
|
||||||
|
return n, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Decode decodes this message's tag and value.
|
||||||
|
func(this *MessageJoin) Decode(decoder *tape.Decoder) (n int, err error) {
|
||||||
|
tag, nn, err := decoder.ReadTag()
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
if !(canAssign(tape.KTV, tag)) {
|
||||||
|
nn, err = tape.Skim(decoder, tag)
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
return n, nil
|
||||||
|
}
|
||||||
|
nn, err = decodeBranch_2c5f22d9503118676b4c5584211a4a95_MessageJoin(this, decoder, tag)
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
return n, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Chat is sent by the client when it wishes to post a message to the room. It is
|
||||||
|
// also relayed by the server to other clients to notify them of the message. It
|
||||||
|
// must be sent within a room transaction.
|
||||||
|
type MessageChat struct {
|
||||||
|
Content string
|
||||||
|
Nickname hopp.Option[string]
|
||||||
|
}
|
||||||
|
|
||||||
|
// Method returns the message's method number.
|
||||||
|
func(this *MessageChat) Method() uint16 { return 0x0300 }
|
||||||
|
|
||||||
|
// Encode encodes this message's tag and value.
|
||||||
|
func(this *MessageChat) Encode(encoder *tape.Encoder) (n int, err error) {
|
||||||
|
tag_8 := tape.KTV.WithCN(0)
|
||||||
|
nn, err := encoder.WriteTag(tag_8)
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
if 2 > tape.MaxStructureLength {
|
||||||
|
return n, tape.ErrTooLong
|
||||||
|
}
|
||||||
|
nn, err = encoder.WriteUintN(2, tag_8.CN() + 1)
|
||||||
|
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))
|
||||||
|
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())
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
||||||
|
// Decode decodes this message's tag and value.
|
||||||
|
func(this *MessageChat) Decode(decoder *tape.Decoder) (n int, err error) {
|
||||||
|
tag, nn, err := decoder.ReadTag()
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
if !(canAssign(tape.KTV, tag)) {
|
||||||
|
nn, err = tape.Skim(decoder, tag)
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
return n, nil
|
||||||
|
}
|
||||||
|
nn, err = decodeBranch_5c1cf9347bb6d9f41cee64b186392d24_MessageChat(this, decoder, tag)
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
return n, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// JoinNotify is sent by the server when another client joins the room. It must be
|
||||||
|
// sent within a room transaction.
|
||||||
|
type MessageJoinNotify struct {
|
||||||
|
Nickname string
|
||||||
|
}
|
||||||
|
|
||||||
|
// Method returns the message's method number.
|
||||||
|
func(this *MessageJoinNotify) Method() uint16 { return 0x0400 }
|
||||||
|
|
||||||
|
// Encode encodes this message's tag and value.
|
||||||
|
func(this *MessageJoinNotify) Encode(encoder *tape.Encoder) (n int, err error) {
|
||||||
|
tag_11 := tape.KTV.WithCN(0)
|
||||||
|
nn, err := encoder.WriteTag(tag_11)
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
if 1 > tape.MaxStructureLength {
|
||||||
|
return n, tape.ErrTooLong
|
||||||
|
}
|
||||||
|
nn, err = encoder.WriteUintN(1, tag_11.CN() + 1)
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
{
|
||||||
|
nn, err = encoder.WriteUint16(0x0000)
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
tag_12 := tape.StringTag(string((*this).Nickname))
|
||||||
|
nn, err = encoder.WriteUint8(uint8(tag_12))
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
if len((*this).Nickname) > tape.MaxStructureLength {
|
||||||
|
return n, tape.ErrTooLong
|
||||||
|
}
|
||||||
|
if tag_12.Is(tape.LBA) {
|
||||||
|
nn, err = encoder.WriteUintN(uint64(len((*this).Nickname)), tag_12.CN())
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
}
|
||||||
|
nn, err = encoder.Write([]byte((*this).Nickname))
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
}
|
||||||
|
return n, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Decode decodes this message's tag and value.
|
||||||
|
func(this *MessageJoinNotify) Decode(decoder *tape.Decoder) (n int, err error) {
|
||||||
|
tag, nn, err := decoder.ReadTag()
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
if !(canAssign(tape.KTV, tag)) {
|
||||||
|
nn, err = tape.Skim(decoder, tag)
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
return n, nil
|
||||||
|
}
|
||||||
|
nn, err = decodeBranch_68c536511e6d598462efc482144438e9_MessageJoinNotify(this, decoder, tag)
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
return n, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// LeaveNotify is sent by the server when another client leaves the room. It must
|
||||||
|
// be sent within a room transaction.
|
||||||
|
type MessageLeaveNotify struct {
|
||||||
|
Nickname string
|
||||||
|
}
|
||||||
|
|
||||||
|
// Method returns the message's method number.
|
||||||
|
func(this *MessageLeaveNotify) Method() uint16 { return 0x0401 }
|
||||||
|
|
||||||
|
// Encode encodes this message's tag and value.
|
||||||
|
func(this *MessageLeaveNotify) Encode(encoder *tape.Encoder) (n int, err error) {
|
||||||
|
tag_13 := tape.KTV.WithCN(0)
|
||||||
|
nn, err := encoder.WriteTag(tag_13)
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
if 1 > tape.MaxStructureLength {
|
||||||
|
return n, tape.ErrTooLong
|
||||||
|
}
|
||||||
|
nn, err = encoder.WriteUintN(1, tag_13.CN() + 1)
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
{
|
||||||
|
nn, err = encoder.WriteUint16(0x0000)
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
tag_14 := tape.StringTag(string((*this).Nickname))
|
||||||
|
nn, err = encoder.WriteUint8(uint8(tag_14))
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
if len((*this).Nickname) > tape.MaxStructureLength {
|
||||||
|
return n, tape.ErrTooLong
|
||||||
|
}
|
||||||
|
if tag_14.Is(tape.LBA) {
|
||||||
|
nn, err = encoder.WriteUintN(uint64(len((*this).Nickname)), tag_14.CN())
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
}
|
||||||
|
nn, err = encoder.Write([]byte((*this).Nickname))
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
}
|
||||||
|
return n, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Decode decodes this message's tag and value.
|
||||||
|
func(this *MessageLeaveNotify) Decode(decoder *tape.Decoder) (n int, err error) {
|
||||||
|
tag, nn, err := decoder.ReadTag()
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
if !(canAssign(tape.KTV, tag)) {
|
||||||
|
nn, err = tape.Skim(decoder, tag)
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
return n, nil
|
||||||
|
}
|
||||||
|
nn, err = decodeBranch_68c536511e6d598462efc482144438e9_MessageLeaveNotify(this, decoder, tag)
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
return n, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func decodeBranch_1d505103df99c95e6bed0800d0ea881a_MessageError(this *MessageError, decoder *tape.Decoder, tag tape.Tag) (n int, err error) {
|
||||||
|
var nn int
|
||||||
|
var length_15 uint64
|
||||||
|
if length_15 > uint64(tape.MaxStructureLength) {
|
||||||
|
return n, tape.ErrTooLong
|
||||||
|
}
|
||||||
|
length_15, nn, err = decoder.ReadUintN(int(tag.CN()) + 1)
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
for _ = range length_15 {
|
||||||
|
var fieldKey_16 uint16
|
||||||
|
fieldKey_16, nn, err = decoder.ReadUint16()
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
var fieldTag_17 tape.Tag
|
||||||
|
fieldTag_17, nn, err = decoder.ReadTag()
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
switch fieldKey_16 {
|
||||||
|
case 0x0000:
|
||||||
|
if !(canAssign(tape.LI, fieldTag_17)) {
|
||||||
|
tape.Skim(decoder, fieldTag_17)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
destination_18, nn, err := decoder.ReadUint16()
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
*(&(this.Code)) = destination_18
|
||||||
|
case 0x0001:
|
||||||
|
if !(canAssign(tape.LBA, fieldTag_17)) {
|
||||||
|
tape.Skim(decoder, fieldTag_17)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
var destination_19 string
|
||||||
|
var length_20 uint64
|
||||||
|
if fieldTag_17.Is(tape.LBA) {
|
||||||
|
length_20, nn, err = decoder.ReadUintN(int(fieldTag_17.CN()))
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
} else {
|
||||||
|
length_20 = uint64(fieldTag_17.CN())
|
||||||
|
}
|
||||||
|
if length_20 > uint64(tape.MaxStructureLength) {
|
||||||
|
return n, tape.ErrTooLong
|
||||||
|
}
|
||||||
|
buffer := make([]byte, length_20)
|
||||||
|
nn, err = decoder.Read(buffer)
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
*(&destination_19) = string(buffer)
|
||||||
|
this.Description = hopp.O(destination_19)
|
||||||
|
default:
|
||||||
|
tape.Skim(decoder, fieldTag_17)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return n, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func decodeBranch_99914b932bd37a50b983c5e7c90ae93b_MessageSuccess(this *MessageSuccess, decoder *tape.Decoder, tag tape.Tag) (n int, err error) {
|
||||||
|
var nn int
|
||||||
|
var length_21 uint64
|
||||||
|
if length_21 > uint64(tape.MaxStructureLength) {
|
||||||
|
return n, tape.ErrTooLong
|
||||||
|
}
|
||||||
|
length_21, nn, err = decoder.ReadUintN(int(tag.CN()) + 1)
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
for _ = range length_21 {
|
||||||
|
var fieldKey_22 uint16
|
||||||
|
fieldKey_22, nn, err = decoder.ReadUint16()
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
var fieldTag_23 tape.Tag
|
||||||
|
fieldTag_23, nn, err = decoder.ReadTag()
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
switch fieldKey_22 {
|
||||||
|
default:
|
||||||
|
tape.Skim(decoder, fieldTag_23)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return n, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func decodeBranch_2c5f22d9503118676b4c5584211a4a95_MessageJoin(this *MessageJoin, decoder *tape.Decoder, tag tape.Tag) (n int, err error) {
|
||||||
|
var nn int
|
||||||
|
var length_24 uint64
|
||||||
|
if length_24 > uint64(tape.MaxStructureLength) {
|
||||||
|
return n, tape.ErrTooLong
|
||||||
|
}
|
||||||
|
length_24, nn, err = decoder.ReadUintN(int(tag.CN()) + 1)
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
for _ = range length_24 {
|
||||||
|
var fieldKey_25 uint16
|
||||||
|
fieldKey_25, nn, err = decoder.ReadUint16()
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
var fieldTag_26 tape.Tag
|
||||||
|
fieldTag_26, nn, err = decoder.ReadTag()
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
switch fieldKey_25 {
|
||||||
|
case 0x0000:
|
||||||
|
if !(canAssign(tape.LBA, fieldTag_26)) {
|
||||||
|
tape.Skim(decoder, fieldTag_26)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
var length_27 uint64
|
||||||
|
if fieldTag_26.Is(tape.LBA) {
|
||||||
|
length_27, nn, err = decoder.ReadUintN(int(fieldTag_26.CN()))
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
} else {
|
||||||
|
length_27 = uint64(fieldTag_26.CN())
|
||||||
|
}
|
||||||
|
if length_27 > uint64(tape.MaxStructureLength) {
|
||||||
|
return n, tape.ErrTooLong
|
||||||
|
}
|
||||||
|
buffer := make([]byte, length_27)
|
||||||
|
nn, err = decoder.Read(buffer)
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
*(&(this.Room)) = string(buffer)
|
||||||
|
case 0x0001:
|
||||||
|
if !(canAssign(tape.LBA, fieldTag_26)) {
|
||||||
|
tape.Skim(decoder, fieldTag_26)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
var length_28 uint64
|
||||||
|
if fieldTag_26.Is(tape.LBA) {
|
||||||
|
length_28, nn, err = decoder.ReadUintN(int(fieldTag_26.CN()))
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
} else {
|
||||||
|
length_28 = uint64(fieldTag_26.CN())
|
||||||
|
}
|
||||||
|
if length_28 > uint64(tape.MaxStructureLength) {
|
||||||
|
return n, tape.ErrTooLong
|
||||||
|
}
|
||||||
|
buffer := make([]byte, length_28)
|
||||||
|
nn, err = decoder.Read(buffer)
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
*(&(this.Nickname)) = string(buffer)
|
||||||
|
default:
|
||||||
|
tape.Skim(decoder, fieldTag_26)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return n, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func decodeBranch_5c1cf9347bb6d9f41cee64b186392d24_MessageChat(this *MessageChat, decoder *tape.Decoder, tag tape.Tag) (n int, err error) {
|
||||||
|
var nn int
|
||||||
|
var length_29 uint64
|
||||||
|
if length_29 > uint64(tape.MaxStructureLength) {
|
||||||
|
return n, tape.ErrTooLong
|
||||||
|
}
|
||||||
|
length_29, nn, err = decoder.ReadUintN(int(tag.CN()) + 1)
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
for _ = range length_29 {
|
||||||
|
var fieldKey_30 uint16
|
||||||
|
fieldKey_30, nn, err = decoder.ReadUint16()
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
var fieldTag_31 tape.Tag
|
||||||
|
fieldTag_31, nn, err = decoder.ReadTag()
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
switch fieldKey_30 {
|
||||||
|
case 0x0000:
|
||||||
|
if !(canAssign(tape.LBA, fieldTag_31)) {
|
||||||
|
tape.Skim(decoder, fieldTag_31)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
var length_32 uint64
|
||||||
|
if fieldTag_31.Is(tape.LBA) {
|
||||||
|
length_32, nn, err = decoder.ReadUintN(int(fieldTag_31.CN()))
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
} else {
|
||||||
|
length_32 = uint64(fieldTag_31.CN())
|
||||||
|
}
|
||||||
|
if length_32 > uint64(tape.MaxStructureLength) {
|
||||||
|
return n, tape.ErrTooLong
|
||||||
|
}
|
||||||
|
buffer := make([]byte, length_32)
|
||||||
|
nn, err = decoder.Read(buffer)
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
*(&(this.Content)) = string(buffer)
|
||||||
|
case 0x0001:
|
||||||
|
if !(canAssign(tape.LBA, fieldTag_31)) {
|
||||||
|
tape.Skim(decoder, fieldTag_31)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
var destination_33 string
|
||||||
|
var length_34 uint64
|
||||||
|
if fieldTag_31.Is(tape.LBA) {
|
||||||
|
length_34, nn, err = decoder.ReadUintN(int(fieldTag_31.CN()))
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
} else {
|
||||||
|
length_34 = uint64(fieldTag_31.CN())
|
||||||
|
}
|
||||||
|
if length_34 > uint64(tape.MaxStructureLength) {
|
||||||
|
return n, tape.ErrTooLong
|
||||||
|
}
|
||||||
|
buffer := make([]byte, length_34)
|
||||||
|
nn, err = decoder.Read(buffer)
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
*(&destination_33) = string(buffer)
|
||||||
|
this.Nickname = hopp.O(destination_33)
|
||||||
|
default:
|
||||||
|
tape.Skim(decoder, fieldTag_31)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return n, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
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) {
|
||||||
|
return n, tape.ErrTooLong
|
||||||
|
}
|
||||||
|
length_35, 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()
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
var fieldTag_37 tape.Tag
|
||||||
|
fieldTag_37, nn, err = decoder.ReadTag()
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
switch fieldKey_36 {
|
||||||
|
case 0x0000:
|
||||||
|
if !(canAssign(tape.LBA, fieldTag_37)) {
|
||||||
|
tape.Skim(decoder, fieldTag_37)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
var length_38 uint64
|
||||||
|
if fieldTag_37.Is(tape.LBA) {
|
||||||
|
length_38, nn, err = decoder.ReadUintN(int(fieldTag_37.CN()))
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
} else {
|
||||||
|
length_38 = uint64(fieldTag_37.CN())
|
||||||
|
}
|
||||||
|
if length_38 > uint64(tape.MaxStructureLength) {
|
||||||
|
return n, tape.ErrTooLong
|
||||||
|
}
|
||||||
|
buffer := make([]byte, length_38)
|
||||||
|
nn, err = decoder.Read(buffer)
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
*(&(this.Nickname)) = string(buffer)
|
||||||
|
default:
|
||||||
|
tape.Skim(decoder, fieldTag_37)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return n, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
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) {
|
||||||
|
return n, tape.ErrTooLong
|
||||||
|
}
|
||||||
|
length_39, 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()
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
var fieldTag_41 tape.Tag
|
||||||
|
fieldTag_41, nn, err = decoder.ReadTag()
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
switch fieldKey_40 {
|
||||||
|
case 0x0000:
|
||||||
|
if !(canAssign(tape.LBA, fieldTag_41)) {
|
||||||
|
tape.Skim(decoder, fieldTag_41)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
var length_42 uint64
|
||||||
|
if fieldTag_41.Is(tape.LBA) {
|
||||||
|
length_42, nn, err = decoder.ReadUintN(int(fieldTag_41.CN()))
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
} else {
|
||||||
|
length_42 = uint64(fieldTag_41.CN())
|
||||||
|
}
|
||||||
|
if length_42 > uint64(tape.MaxStructureLength) {
|
||||||
|
return n, tape.ErrTooLong
|
||||||
|
}
|
||||||
|
buffer := make([]byte, length_42)
|
||||||
|
nn, err = decoder.Read(buffer)
|
||||||
|
n += nn; if err != nil { return n, err }
|
||||||
|
*(&(this.Nickname)) = string(buffer)
|
||||||
|
default:
|
||||||
|
tape.Skim(decoder, fieldTag_41)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return n, nil
|
||||||
|
}
|
||||||
48
examples/chat/protocol.pdl
Normal file
48
examples/chat/protocol.pdl
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
// Error is sent by a party when the other party has done something erroneous. The
|
||||||
|
// valid error codes are:
|
||||||
|
//
|
||||||
|
// - 0: General, unspecified error
|
||||||
|
//
|
||||||
|
// The description field, if specified, determines a human-readable error to be
|
||||||
|
// shown to the user. The sending party must immediately close the transaction
|
||||||
|
// after this message is sent.
|
||||||
|
M0000 Error {
|
||||||
|
0000 Code U16,
|
||||||
|
0001 Description ?String,
|
||||||
|
}
|
||||||
|
|
||||||
|
// Success is sent by a party when it has successfully completed a task given to it
|
||||||
|
// by the other party. The sending party must immediately close the transaction
|
||||||
|
// after this message is sent.
|
||||||
|
M0001 Success {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Join is sent by the client when it wishes to join a room. It must begin a new
|
||||||
|
// transaction, and that transaction will persist while the user is in that room.
|
||||||
|
// Messages having to do with the room will be sent along this transaction. To
|
||||||
|
// leave the room, the client must close the transaction.
|
||||||
|
M0200 Join {
|
||||||
|
0000 Room String,
|
||||||
|
0001 Nickname String,
|
||||||
|
}
|
||||||
|
|
||||||
|
// Chat is sent by the client when it wishes to post a message to the room. It is
|
||||||
|
// also relayed by the server to other clients to notify them of the message. It
|
||||||
|
// must be sent within a room transaction.
|
||||||
|
M0300 Chat {
|
||||||
|
0000 Content String,
|
||||||
|
0001 Nickname ?String,
|
||||||
|
}
|
||||||
|
|
||||||
|
// JoinNotify is sent by the server when another client joins the room. It must be
|
||||||
|
// sent within a room transaction.
|
||||||
|
M0400 JoinNotify {
|
||||||
|
0000 Nickname String,
|
||||||
|
}
|
||||||
|
|
||||||
|
// LeaveNotify is sent by the server when another client leaves the room. It must
|
||||||
|
// be sent within a room transaction.
|
||||||
|
M0401 LeaveNotify {
|
||||||
|
0000 Nickname String,
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user