# Automatically generated; edit in Sphinx source code, not here. # %hide-begin% module TFTP; type Opcode = enum { RRQ = 1, WRQ = 2, DATA = 3, ACK = 4, ERROR = 5 }; # %hide-end% public type Packet = unit { opcode: uint16 &convert=Opcode($$); switch ( self.opcode ) { Opcode::RRQ -> rrq: Request(True); Opcode::WRQ -> wrq: Request(False); # ... # %hide-begin% Opcode::DATA -> data: Data; Opcode::ACK -> ack: Acknowledgement; Opcode::ERROR -> error: Error; # %hide-end% }; on %done { print self; } }; type Request = unit(is_read: bool) { filename: bytes &until=b"\x00"; mode: bytes &until=b"\x00"; on %done { print "We got a %s request." % (is_read ? "read" : "write"); } }; # %hide-begin% type Data = unit { num: uint16; data: bytes &eod; # parse until end of data (i.e., packet) is reached }; type Acknowledgement = unit { num: uint16; # block number being acknowledged }; type Error = unit { code: uint16; msg: bytes &until=b"\x00"; }; # %hide-end%