import std/typetraits, preserves type UserId* = BiggestInt NickConflict* {.preservesRecord: "nickConflict".} = object NickClaimResponseKind* {.pure.} = enum `true`, `NickConflict` `NickClaimResponse`* {.preservesOr.} = object case orKind*: NickClaimResponseKind of NickClaimResponseKind.`true`: `true`* {.preservesLiteral: "#t".}: bool of NickClaimResponseKind.`NickConflict`: `nickconflict`*: NickConflict Join*[Cap] {.preservesRecord: "joinedUser".} = object `uid`*: UserId `handle`*: Cap SessionKind* {.pure.} = enum `observeUsers`, `observeSpeech`, `NickClaim`, `Says` SessionObserveUsers*[Cap] {.preservesRecord: "Observe".} = object `field0`* {.preservesLiteral: "user".}: tuple[] `observer`*: Cap SessionObserveSpeech*[Cap] {.preservesRecord: "Observe".} = object `field0`* {.preservesLiteral: "says".}: tuple[] `observer`*: Cap `Session`*[Cap] {.preservesOr.} = object case orKind*: SessionKind of SessionKind.`observeUsers`: `observeusers`*: SessionObserveUsers[Cap] of SessionKind.`observeSpeech`: `observespeech`*: SessionObserveSpeech[Cap] of SessionKind.`NickClaim`: `nickclaim`*: NickClaim[Cap] of SessionKind.`Says`: `says`*: Says UserInfo* {.preservesRecord: "user".} = object `uid`*: UserId `name`*: string NickClaim*[Cap] {.preservesRecord: "claimNick".} = object `uid`*: UserId `name`*: string `k`*: Cap Says* {.preservesRecord: "says".} = object `who`*: UserId `what`*: string proc `$`*[Cap](x: Join[Cap] | Session[Cap] | NickClaim[Cap]): string = `$`(toPreserve(x, Cap)) proc encode*[Cap](x: Join[Cap] | Session[Cap] | NickClaim[Cap]): seq[byte] = encode(toPreserve(x, Cap)) proc `$`*(x: UserId | NickConflict | NickClaimResponse | UserInfo | Says): string = `$`(toPreserve(x)) proc encode*(x: UserId | NickConflict | NickClaimResponse | UserInfo | Says): seq[ byte] = encode(toPreserve(x))