Cairn · module

Cairn.Frame.Encode

lean/Cairn/Frame/Encode.lean

Frame byte format (docs/frame.md; version 13): specification encoder Wire.Enc.frame, decoder Wire.Dec.frame, the executable encoder encodeFrame (proved equal to the specification and installed with @[csimp]), and the round trip decodeFrame_encodeFrame.

Layout, all little-endian:

header     "CAFR" u16 version=1 u16 flags=0 i32 w i32 h                       16 bytes
draws      u32 count u32 byteLength, then count records
ax         u32 count u32 byteLength, then count records
textInput  4 bytes [present, hasMarked, secure, 0], then the rest of the record when present
cursor     4 bytes [cursor, 0, 0, 0]
effects    u32 count u32 byteLength, then count records

Records start with a 4-byte head whose first byte is the tag, followed by fixed-size fields and at most two strings, each u32 byte length + UTF-8.

Imports Cairn.Frame, Cairn.Frame.Bytes

Order

Definitions 180

def

Cairn.Wire.Role.code

lean/Cairn/Frame/Encode.lean:30
code : Role → UInt8
def

Cairn.Wire.Role.ofCode

lean/Cairn/Frame/Encode.lean:34
ofCode : UInt8 → Option Role
def

Cairn.Wire.Cursor.code

lean/Cairn/Frame/Encode.lean:42
code : Cursor → UInt8
def

Cairn.Wire.Cursor.ofCode

lean/Cairn/Frame/Encode.lean:45
ofCode : UInt8 → Option Cursor
def

Cairn.Wire.FontWidth.wire

lean/Cairn/Frame/Encode.lean:51
wire : FontWidth → UInt8
def

Cairn.Wire.FontWidth.ofWire

lean/Cairn/Frame/Encode.lean:54
ofWire : UInt8 → Option FontWidth
def

Cairn.Wire.Corner.code

lean/Cairn/Frame/Encode.lean:61
code : Corner → UInt8
def

Cairn.Wire.Corner.ofCode

lean/Cairn/Frame/Encode.lean:64
ofCode : UInt8 → Option Corner
def

Cairn.Wire.checkedCode

lean/Cairn/Frame/Encode.lean:70
checkedCode : Option Bool → UInt8
def

Cairn.Wire.checkedOfCode

lean/Cairn/Frame/Encode.lean:73
checkedOfCode : UInt8 → Option (Option Bool)
def

Cairn.Wire.Request.Kind.code

lean/Cairn/Frame/Encode.lean:79
code : Request.Kind → UInt8
def

Cairn.Wire.Request.Kind.ofCode

lean/Cairn/Frame/Encode.lean:86
ofCode : UInt8 → Option Request.Kind
def

Cairn.Wire.Permission.code

lean/Cairn/Frame/Encode.lean:98
code : Permission → UInt8
def

Cairn.Wire.Permission.ofCode

lean/Cairn/Frame/Encode.lean:101
ofCode : UInt8 → Option Permission
def

Cairn.Priority.code

lean/Cairn/Frame/Encode.lean:109
code : Priority → UInt8

low 0, high 1.

def

Cairn.Priority.ofCode

lean/Cairn/Frame/Encode.lean:112
ofCode : UInt8 → Option Priority
def

Cairn.ScrollTarget.code

lean/Cairn/Frame/Encode.lean:119
code : ScrollTarget → UInt8

start 0, finish 1, key 2.

def

Cairn.ScrollTarget.arg

lean/Cairn/Frame/Encode.lean:123
arg : ScrollTarget → Nat

The key a scroll target carries on the wire (0 for the ends).

def

Cairn.ScrollTarget.ofCode

lean/Cairn/Frame/Encode.lean:126
ofCode : UInt8 → Nat → Option ScrollTarget
def

Cairn.Wire.Sub.code

lean/Cairn/Frame/Encode.lean:134
code : Sub → UInt8

every 0, watchFile 1, record 2, globalKey 3, imageCache 4.

def

Cairn.Wire.Key.code

lean/Cairn/Frame/Encode.lean:138
code : Key → UInt8

char is 13 and carries its scalar in the record's u32 field.

def

Cairn.Wire.Key.scalar

lean/Cairn/Frame/Encode.lean:143
scalar : Key → Nat
def

Cairn.Wire.Key.ofCode

lean/Cairn/Frame/Encode.lean:147
ofCode (code : UInt8) (scalar : Nat) : Option Key
def

Cairn.Wire.Mods.code

lean/Cairn/Frame/Encode.lean:171
code (m : Mods) : UInt8

Bit 0 shift, 1 command, 2 option, 3 control.

def

Cairn.Wire.Mods.ofCode

lean/Cairn/Frame/Encode.lean:175
ofCode (b : UInt8) : Option Mods
def

Cairn.Wire.SurfaceKind.code

lean/Cairn/Frame/Encode.lean:185
code : SurfaceKind → UInt8
def

Cairn.Wire.SurfaceKind.ofCode

lean/Cairn/Frame/Encode.lean:188
ofCode : UInt8 → Option SurfaceKind
def

Cairn.Wire.MenuKind.code

lean/Cairn/Frame/Encode.lean:196
code : MenuKind → UInt8
def

Cairn.Wire.MenuKind.ofCode

lean/Cairn/Frame/Encode.lean:199
ofCode : UInt8 → Option MenuKind
def

Cairn.Wire.ScreenChoice.code

lean/Cairn/Frame/Encode.lean:205
code : ScreenChoice → UInt8
def

Cairn.Wire.ScreenChoice.ofCode

lean/Cairn/Frame/Encode.lean:208
ofCode : UInt8 → Option ScreenChoice
def

Cairn.Wire.Anchor.code

lean/Cairn/Frame/Encode.lean:216
code : Anchor → UInt8

bottomCenter is 0; its offset goes in the record's u32 field.

def

Cairn.Wire.Anchor.ofCode

lean/Cairn/Frame/Encode.lean:219
ofCode (code : UInt8) (offset : Nat) : Option Anchor
def

Cairn.Wire.noShortcut

lean/Cairn/Frame/Encode.lean:228
noShortcut : Shortcut

The shortcut fields of a menu record without one.

def

Cairn.Wire.fu

lean/Cairn/Frame/Encode.lean:235
fu (n : Nat) : Bool
def

Cairn.Wire.fi

lean/Cairn/Frame/Encode.lean:236
fi (v : Int) : Bool
def

Cairn.Wire.fs

lean/Cairn/Frame/Encode.lean:237
fs (s : String) : Bool
def

Cairn.Wire.fitsRect

lean/Cairn/Frame/Encode.lean:244
fitsRect (r : Rect) : Bool
def

Cairn.Wire.fitsRef

lean/Cairn/Frame/Encode.lean:245
fitsRef (c : ControlRef) : Bool
def

Cairn.Wire.fitsRange

lean/Cairn/Frame/Encode.lean:246
fitsRange (p : Nat × Nat) : Bool
def

Cairn.Wire.fitsInts

lean/Cairn/Frame/Encode.lean:255
fitsInts (xs : List Int) : Bool

Font fields are clamped, not wrapped, so out-of-range fonts still name the font layout measured with (Cairn.Text.Host.sat); the round trip is exact when they fit.

def

Cairn.Wire.fitsPaint

lean/Cairn/Frame/Encode.lean:257
fitsPaint (p : Paint) : Bool
def

Cairn.Wire.fitsShadow

lean/Cairn/Frame/Encode.lean:261
fitsShadow (s : Shadow) : Bool
def

Cairn.Wire.fitsDraw

lean/Cairn/Frame/Encode.lean:263
fitsDraw : Draw → Bool
def

Cairn.Wire.fitsAx

lean/Cairn/Frame/Encode.lean:275
fitsAx (n : AxNode) : Bool
def

Cairn.Wire.fitsTextInput

lean/Cairn/Frame/Encode.lean:278
fitsTextInput (t : TextInput) : Bool
def

Cairn.Wire.fu64

lean/Cairn/Frame/Encode.lean:282
fu64 (n : Nat) : Bool
def

Cairn.Wire.fi64

lean/Cairn/Frame/Encode.lean:283
fi64 (v : Int) : Bool
def

Cairn.Wire.fb

lean/Cairn/Frame/Encode.lean:284
fb (b : ByteArray) : Bool
def

Cairn.Wire.fitsHeaders

lean/Cairn/Frame/Encode.lean:293
fitsHeaders (hs : List (String × String)) : Bool
def

Cairn.Wire.fitsPart

lean/Cairn/Frame/Encode.lean:296
fitsPart : Part → Bool
def

Cairn.Wire.fitsSource

lean/Cairn/Frame/Encode.lean:300
fitsSource : Secret.Source → Bool
def

Cairn.Wire.fitsSecret

lean/Cairn/Frame/Encode.lean:304
fitsSecret (s : Secret) : Bool
def

Cairn.Wire.fitsRequest

lean/Cairn/Frame/Encode.lean:306
fitsRequest : Request → Bool
def

Cairn.Wire.fitsEffect

lean/Cairn/Frame/Encode.lean:324
fitsEffect : Effect → Bool
def

Cairn.Wire.fitsSub

lean/Cairn/Frame/Encode.lean:337
fitsSub : Sub → Bool
def

Cairn.Wire.fitsSubCmd

lean/Cairn/Frame/Encode.lean:344
fitsSubCmd : SubCmd → Bool
def

Cairn.Wire.fitsCanvas

lean/Cairn/Frame/Encode.lean:350
fitsCanvas (c : Canvas) : Bool

Every value fits its field. The other condition of the round trip is that the encoding is under 4 GiB (each section's byte length is a u32).

def

Cairn.Wire.fitsMenuRecord

lean/Cairn/Frame/Encode.lean:356
fitsMenuRecord (m : MenuRecord) : Bool
def

Cairn.Wire.fitsStatus

lean/Cairn/Frame/Encode.lean:359
fitsStatus (s : StatusFrame) : Bool
def

Cairn.Wire.fitsSurface

lean/Cairn/Frame/Encode.lean:363
fitsSurface (s : SurfaceFrame) : Bool
def

Cairn.Wire.fitsFrame

lean/Cairn/Frame/Encode.lean:367
fitsFrame (f : Frame) : Bool
def

Cairn.Wire.Enc.rect

lean/Cairn/Frame/Encode.lean:376
rect (r : Rect) : List UInt8
def

Cairn.Wire.Enc.point

lean/Cairn/Frame/Encode.lean:377
point (p : Point) : List UInt8
def

Cairn.Wire.Enc.size

lean/Cairn/Frame/Encode.lean:378
size (s : Size) : List UInt8
def

Cairn.Wire.Enc.color

lean/Cairn/Frame/Encode.lean:379
color (c : Color) : List UInt8
def

Cairn.Wire.Enc.ref

lean/Cairn/Frame/Encode.lean:380
ref (c : ControlRef) : List UInt8
def

Cairn.Wire.Enc.range

lean/Cairn/Frame/Encode.lean:381
range (p : Nat × Nat) : List UInt8
def

Cairn.Wire.Enc.noColor

lean/Cairn/Frame/Encode.lean:383
noColor : Color
def

Cairn.Wire.Enc.list

lean/Cairn/Frame/Encode.lean:386
list {α : Type} (e : α → List UInt8) (xs : List α) : List UInt8

A list: u32 count, then the records as a sized section.

def

Cairn.Wire.Enc.ints

lean/Cairn/Frame/Encode.lean:390
ints (xs : List Int) : List UInt8

A u32 count, then each as an i32.

def

Cairn.Wire.Enc.intLists

lean/Cairn/Frame/Encode.lean:393
intLists (xss : List (List Int)) : List UInt8

A u32 count, then each list as ints.

def

Cairn.Wire.Enc.draw

lean/Cairn/Frame/Encode.lean:395
draw : Draw → List UInt8
def

Cairn.Wire.Enc.ax

lean/Cairn/Frame/Encode.lean:416
ax (n : AxNode) : List UInt8
def

Cairn.Wire.Enc.textInput

lean/Cairn/Frame/Encode.lean:422
textInput : Option TextInput → List UInt8
def

Cairn.Wire.Enc.cursor

lean/Cairn/Frame/Encode.lean:428
cursor (c : Cursor) : List UInt8
def

Cairn.Wire.Enc.header1

lean/Cairn/Frame/Encode.lean:430
header1 (kv : String × String) : List UInt8
def

Cairn.Wire.Enc.headers

lean/Cairn/Frame/Encode.lean:433
headers (hs : List (String × String)) : List UInt8

A u32 count, then each name and value.

def

Cairn.Wire.Enc.part

lean/Cairn/Frame/Encode.lean:436
part : Part → List UInt8

[0, 0, 0, 0] and bytes, or [1, hasStop, 0, 0], clip, start and stop.

def

Cairn.Wire.Enc.sourceCode

lean/Cairn/Frame/Encode.lean:441
sourceCode : Secret.Source → UInt8

1 for an environment secret, 2 for a Keychain item (0 is no secret).

def

Cairn.Wire.Enc.source

lean/Cairn/Frame/Encode.lean:445
source : Secret.Source → List UInt8
def

Cairn.Wire.Enc.secret

lean/Cairn/Frame/Encode.lean:449
secret (s : Secret) : List UInt8
def

Cairn.Wire.Enc.optSecret

lean/Cairn/Frame/Encode.lean:453
optSecret : Option Secret → List UInt8

[0, 0, 0, 0], or [1, 0, 0, 0] and four strings (an environment secret, as in version 8), or [2, 0, 0, 0] and three (a Keychain item).

def

Cairn.Wire.Enc.parts

lean/Cairn/Frame/Encode.lean:458
parts (ps : List Part) : List UInt8

A u32 count, then each part.

def

Cairn.Wire.Enc.requestBody

lean/Cairn/Frame/Encode.lean:461
requestBody : Request → List UInt8

A request's fields after its record head and id.

def

Cairn.Wire.Enc.effect

lean/Cairn/Frame/Encode.lean:483
effect : Effect → List UInt8
def

Cairn.Wire.Enc.subBody

lean/Cairn/Frame/Encode.lean:498
subBody : Sub → List UInt8

A subscription's fields after its record head and id.

def

Cairn.Wire.Enc.subCmd

lean/Cairn/Frame/Encode.lean:505
subCmd : SubCmd → List UInt8
def

Cairn.Wire.Enc.wake

lean/Cairn/Frame/Encode.lean:510
wake (w : Option Nat) : List UInt8

[hasWake, 0, 0, 0], then the deadline as a u64 (0 when there is none).

def

Cairn.Wire.Enc.magic

lean/Cairn/Frame/Encode.lean:512
magic : List UInt8
def

Cairn.Wire.Enc.canvas

lean/Cairn/Frame/Encode.lean:515
canvas (c : Canvas) : List UInt8

A Metal surface's content: size, draws, accessibility nodes, text input, cursor.

def

Cairn.Wire.Enc.menuRecord

lean/Cairn/Frame/Encode.lean:520
menuRecord (m : MenuRecord) : List UInt8

32 bytes, then the label. A field the record doesn't have is written as zero.

def

Cairn.Wire.Enc.status

lean/Cairn/Frame/Encode.lean:527
status (s : StatusFrame) : List UInt8
def

Cairn.Wire.Enc.surface

lean/Cairn/Frame/Encode.lean:532
surface (s : SurfaceFrame) : List UInt8

[kind, shown, anchor, screen], place, anchor offset, minimum size, title, canvas, status.

def

Cairn.Wire.Enc.header

lean/Cairn/Frame/Encode.lean:538
header : List UInt8

Magic, version 13, flags 0.

def

Cairn.Wire.Enc.frame

lean/Cairn/Frame/Encode.lean:540
frame (f : Frame) : List UInt8
def

Cairn.Wire.Dec.expect

lean/Cairn/Frame/Encode.lean:550
expect (bs : List UInt8) : Dec Unit
def

Cairn.Wire.Dec.rect

lean/Cairn/Frame/Encode.lean:553
rect : Dec Rect
def

Cairn.Wire.Dec.point

lean/Cairn/Frame/Encode.lean:554
point : Dec Point
def

Cairn.Wire.Dec.size

lean/Cairn/Frame/Encode.lean:555
size : Dec Size
def

Cairn.Wire.Dec.color

lean/Cairn/Frame/Encode.lean:556
color : Dec Color
def

Cairn.Wire.Dec.ref

lean/Cairn/Frame/Encode.lean:557
ref : Dec ControlRef
def

Cairn.Wire.Dec.range

lean/Cairn/Frame/Encode.lean:558
range : Dec (Nat × Nat)
def

Cairn.Wire.Dec.list

lean/Cairn/Frame/Encode.lean:560
list {α : Type} (d : Dec α) : Dec (List α)
def

Cairn.Wire.Dec.ints

lean/Cairn/Frame/Encode.lean:564
ints : Dec (List Int)
def

Cairn.Wire.Dec.intLists

lean/Cairn/Frame/Encode.lean:568
intLists : Dec (List (List Int))
def

Cairn.Wire.Dec.draw

lean/Cairn/Frame/Encode.lean:572
draw : Dec Draw
def

Cairn.Wire.Dec.ax

lean/Cairn/Frame/Encode.lean:636
ax : Dec AxNode
def

Cairn.Wire.Dec.textInput

lean/Cairn/Frame/Encode.lean:654
textInput : Dec (Option TextInput)
def

Cairn.Wire.Dec.cursor

lean/Cairn/Frame/Encode.lean:674
cursor : Dec Cursor
def

Cairn.Wire.Dec.header1

lean/Cairn/Frame/Encode.lean:679
header1 : Dec (String × String)
def

Cairn.Wire.Dec.headers

lean/Cairn/Frame/Encode.lean:681
headers : Dec (List (String × String))
def

Cairn.Wire.Dec.part

lean/Cairn/Frame/Encode.lean:685
part : Dec Part
def

Cairn.Wire.Dec.optSecret

lean/Cairn/Frame/Encode.lean:699
optSecret : Dec (Option Secret)
def

Cairn.Wire.Dec.parts

lean/Cairn/Frame/Encode.lean:717
parts : Dec (List Part)
def

Cairn.Wire.Dec.requestBody

lean/Cairn/Frame/Encode.lean:721
requestBody (redact : Bool) : Request.Kind → Dec Request
def

Cairn.Wire.Dec.effect

lean/Cairn/Frame/Encode.lean:773
effect : Dec Effect
def

Cairn.Wire.Dec.subBody

lean/Cairn/Frame/Encode.lean:820
subBody : UInt8 → Dec Sub
def

Cairn.Wire.Dec.subCmd

lean/Cairn/Frame/Encode.lean:833
subCmd : Dec SubCmd
def

Cairn.Wire.Dec.wake

lean/Cairn/Frame/Encode.lean:845
wake : Dec (Option Nat)
def

Cairn.Wire.Dec.canvas

lean/Cairn/Frame/Encode.lean:851
canvas : Dec Canvas
def

Cairn.Wire.Dec.shortcut

lean/Cairn/Frame/Encode.lean:859
shortcut (has : Bool) (key : UInt8) (scalar : Nat) (mods : UInt8) :
  Dec (Option Shortcut)
def

Cairn.Wire.Dec.menuRecord

lean/Cairn/Frame/Encode.lean:866
menuRecord : Dec MenuRecord
def

Cairn.Wire.Dec.status

lean/Cairn/Frame/Encode.lean:887
status : Dec StatusFrame
def

Cairn.Wire.Dec.surface

lean/Cairn/Frame/Encode.lean:895
surface : Dec SurfaceFrame
def

Cairn.Wire.Dec.frame

lean/Cairn/Frame/Encode.lean:909
frame : Dec Frame
def

Cairn.Wire.Dec.SizeOk

lean/Cairn/Frame/Encode.lean:1343
SizeOk (f : Frame) : Prop

Sections of a frame whose encoding is under 4 GiB have u32 byte lengths.

def

Cairn.Wire.Len.str

lean/Cairn/Frame/Encode.lean:1372
str (s : String) : Nat
def

Cairn.Wire.Len.ints

lean/Cairn/Frame/Encode.lean:1374
ints (xs : List Int) : Nat
def

Cairn.Wire.Len.intLists

lean/Cairn/Frame/Encode.lean:1376
intLists (xss : List (List Int)) : Nat
def

Cairn.Wire.Len.draw

lean/Cairn/Frame/Encode.lean:1378
draw : Draw → Nat
def

Cairn.Wire.Len.ax

lean/Cairn/Frame/Encode.lean:1387
ax (n : AxNode) : Nat
def

Cairn.Wire.Len.bytes

lean/Cairn/Frame/Encode.lean:1389
bytes (b : ByteArray) : Nat
def

Cairn.Wire.Len.headers

lean/Cairn/Frame/Encode.lean:1391
headers (hs : List (String × String)) : Nat
def

Cairn.Wire.Len.part

lean/Cairn/Frame/Encode.lean:1394
part : Part → Nat
def

Cairn.Wire.Len.parts

lean/Cairn/Frame/Encode.lean:1398
parts (ps : List Part) : Nat
def

Cairn.Wire.Len.source

lean/Cairn/Frame/Encode.lean:1400
source : Secret.Source → Nat
def

Cairn.Wire.Len.secret

lean/Cairn/Frame/Encode.lean:1404
secret (s : Secret) : Nat
def

Cairn.Wire.Len.optSecret

lean/Cairn/Frame/Encode.lean:1406
optSecret : Option Secret → Nat
def

Cairn.Wire.Len.requestBody

lean/Cairn/Frame/Encode.lean:1410
requestBody : Request → Nat
def

Cairn.Wire.Len.effect

lean/Cairn/Frame/Encode.lean:1426
effect : Effect → Nat
def

Cairn.Wire.Len.subBody

lean/Cairn/Frame/Encode.lean:1439
subBody : Sub → Nat
def

Cairn.Wire.Len.subCmd

lean/Cairn/Frame/Encode.lean:1446
subCmd : SubCmd → Nat
def

Cairn.Wire.Len.textInput

lean/Cairn/Frame/Encode.lean:1450
textInput : Option TextInput → Nat
def

Cairn.Wire.Len.list

lean/Cairn/Frame/Encode.lean:1454
list {α : Type} (len : α → Nat) (xs : Array α) : Nat
def

Cairn.Wire.Len.canvas

lean/Cairn/Frame/Encode.lean:1456
canvas (c : Canvas) : Nat
def

Cairn.Wire.Len.menuRecord

lean/Cairn/Frame/Encode.lean:1459
menuRecord (m : MenuRecord) : Nat
def

Cairn.Wire.Len.status

lean/Cairn/Frame/Encode.lean:1461
status (s : StatusFrame) : Nat
def

Cairn.Wire.Len.surface

lean/Cairn/Frame/Encode.lean:1464
surface (s : SurfaceFrame) : Nat
def

Cairn.Wire.Put.rect

lean/Cairn/Frame/Encode.lean:1587
rect (b : ByteArray) (r : Rect) : ByteArray
def

Cairn.Wire.Put.point

lean/Cairn/Frame/Encode.lean:1588
point (b : ByteArray) (p : Point) : ByteArray
def

Cairn.Wire.Put.color

lean/Cairn/Frame/Encode.lean:1589
color (b : ByteArray) (c : Color) : ByteArray
def

Cairn.Wire.Put.ref

lean/Cairn/Frame/Encode.lean:1590
ref (b : ByteArray) (c : ControlRef) : ByteArray
def

Cairn.Wire.Put.range

lean/Cairn/Frame/Encode.lean:1591
range (b : ByteArray) (p : Nat × Nat) : ByteArray
def

Cairn.Wire.Put.ints

lean/Cairn/Frame/Encode.lean:1593
ints (b : ByteArray) (xs : List Int) : ByteArray
def

Cairn.Wire.Put.intLists

lean/Cairn/Frame/Encode.lean:1595
intLists (b : ByteArray) (xss : List (List Int)) : ByteArray
def

Cairn.Wire.Put.draw

lean/Cairn/Frame/Encode.lean:1598
draw (b : ByteArray) : Draw → ByteArray
def

Cairn.Wire.Put.ax

lean/Cairn/Frame/Encode.lean:1621
ax (b : ByteArray) (n : AxNode) : ByteArray
def

Cairn.Wire.Put.textInput

lean/Cairn/Frame/Encode.lean:1628
textInput (b : ByteArray) : Option TextInput → ByteArray
def

Cairn.Wire.Put.cursor

lean/Cairn/Frame/Encode.lean:1635
cursor (b : ByteArray) (c : Cursor) : ByteArray
def

Cairn.Wire.Put.header1

lean/Cairn/Frame/Encode.lean:1637
header1 (b : ByteArray) (kv : String × String) : ByteArray
def

Cairn.Wire.Put.headers

lean/Cairn/Frame/Encode.lean:1639
headers (b : ByteArray) (hs : List (String × String)) : ByteArray
def

Cairn.Wire.Put.part

lean/Cairn/Frame/Encode.lean:1642
part (b : ByteArray) : Part → ByteArray
def

Cairn.Wire.Put.parts

lean/Cairn/Frame/Encode.lean:1646
parts (b : ByteArray) (ps : List Part) : ByteArray
def

Cairn.Wire.Put.source

lean/Cairn/Frame/Encode.lean:1648
source (b : ByteArray) : Secret.Source → ByteArray
def

Cairn.Wire.Put.secret

lean/Cairn/Frame/Encode.lean:1652
secret (b : ByteArray) (s : Secret) : ByteArray
def

Cairn.Wire.Put.optSecret

lean/Cairn/Frame/Encode.lean:1654
optSecret (b : ByteArray) : Option Secret → ByteArray
def

Cairn.Wire.Put.requestBody

lean/Cairn/Frame/Encode.lean:1658
requestBody (b : ByteArray) : Request → ByteArray
def

Cairn.Wire.Put.effect

lean/Cairn/Frame/Encode.lean:1676
effect (b : ByteArray) : Effect → ByteArray
def

Cairn.Wire.Put.subBody

lean/Cairn/Frame/Encode.lean:1690
subBody (b : ByteArray) : Sub → ByteArray
def

Cairn.Wire.Put.subCmd

lean/Cairn/Frame/Encode.lean:1697
subCmd (b : ByteArray) : SubCmd → ByteArray
def

Cairn.Wire.Put.wake

lean/Cairn/Frame/Encode.lean:1701
wake (b : ByteArray) (w : Option Nat) : ByteArray
def

Cairn.Wire.Put.list

lean/Cairn/Frame/Encode.lean:1703
list {α : Type} (put : ByteArray → α → ByteArray) (len : α → Nat)
  (b : ByteArray) (xs : Array α) : ByteArray
def

Cairn.Wire.Put.canvas

lean/Cairn/Frame/Encode.lean:1707
canvas (b : ByteArray) (c : Canvas) : ByteArray
def

Cairn.Wire.Put.menuRecord

lean/Cairn/Frame/Encode.lean:1712
menuRecord (b : ByteArray) (m : MenuRecord) : ByteArray
def

Cairn.Wire.Put.status

lean/Cairn/Frame/Encode.lean:1721
status (b : ByteArray) (s : StatusFrame) : ByteArray
def

Cairn.Wire.Put.surface

lean/Cairn/Frame/Encode.lean:1724
surface (b : ByteArray) (s : SurfaceFrame) : ByteArray
def

Cairn.Wire.Put.frame

lean/Cairn/Frame/Encode.lean:1730
frame (f : Frame) : ByteArray
def

Cairn.encodeFrame

lean/Cairn/Frame/Encode.lean:1901
encodeFrame (f : Frame) : ByteArray

The frame's bytes (docs/frame.md). Defined by the specification; compiled as Put.frame.

def

Cairn.decodeFrame

lean/Cairn/Frame/Encode.lean:1903
decodeFrame (b : ByteArray) : Option Frame

Theorems 106

theorem

Cairn.Wire.Role.ofCode_code

provedlean/Cairn/Frame/Encode.lean:39
ofCode_code (r : Role) : ofCode (code r) = some r
theorem

Cairn.Wire.Cursor.ofCode_code

provedlean/Cairn/Frame/Encode.lean:48
ofCode_code (c : Cursor) : ofCode (code c) = some c
theorem

Cairn.Wire.FontWidth.ofWire_wire

provedlean/Cairn/Frame/Encode.lean:58
ofWire_wire (w : FontWidth) : ofWire (wire w) = some w
theorem

Cairn.Wire.Corner.ofCode_code

provedlean/Cairn/Frame/Encode.lean:67
ofCode_code (c : Corner) : ofCode (code c) = some c
theorem

Cairn.Wire.checkedOfCode_code

provedlean/Cairn/Frame/Encode.lean:76
checkedOfCode_code (c : Option Bool) : checkedOfCode (checkedCode c) = some c
theorem

Cairn.Wire.Request.Kind.ofCode_code

provedlean/Cairn/Frame/Encode.lean:94
ofCode_code (k : Request.Kind) : ofCode (code k) = some k
theorem

Cairn.Wire.Permission.ofCode_code

provedlean/Cairn/Frame/Encode.lean:104
ofCode_code (p : Permission) : ofCode (code p) = some p
theorem

Cairn.Priority.ofCode_code

provedlean/Cairn/Frame/Encode.lean:115
ofCode_code (p : Priority) : ofCode p.code = some p
theorem

Cairn.ScrollTarget.ofCode_code

provedlean/Cairn/Frame/Encode.lean:129
ofCode_code (t : ScrollTarget) : ofCode t.code t.arg = some t
theorem

Cairn.Wire.Key.ofCode_code

provedlean/Cairn/Frame/Encode.lean:156
ofCode_code (k : Key) : ofCode (code k) (scalar k) = some k
theorem

Cairn.Wire.Key.scalar_fits

provedlean/Cairn/Frame/Encode.lean:163
scalar_fits (k : Key) : FitsU32 (scalar k)
theorem

Cairn.Wire.Mods.ofCode_code

provedlean/Cairn/Frame/Encode.lean:181
ofCode_code (m : Mods) : ofCode (code m) = some m
theorem

Cairn.Wire.SurfaceKind.ofCode_code

provedlean/Cairn/Frame/Encode.lean:192
ofCode_code (k : SurfaceKind) : ofCode (code k) = some k
theorem

Cairn.Wire.MenuKind.ofCode_code

provedlean/Cairn/Frame/Encode.lean:202
ofCode_code (k : MenuKind) : ofCode (code k) = some k
theorem

Cairn.Wire.ScreenChoice.ofCode_code

provedlean/Cairn/Frame/Encode.lean:211
ofCode_code (c : ScreenChoice) : ofCode (code c) = some c
theorem

Cairn.Wire.Anchor.ofCode_code

provedlean/Cairn/Frame/Encode.lean:224
ofCode_code (a : Anchor) : ofCode (code a) a.offset = some a
theorem

Cairn.Wire.fu_iff

provedlean/Cairn/Frame/Encode.lean:239
fu_iff (n : Nat) : fu n = true ↔ FitsU32 n
theorem

Cairn.Wire.fi_iff

provedlean/Cairn/Frame/Encode.lean:240
fi_iff (v : Int) : fi v = true ↔ FitsI32 v
theorem

Cairn.Wire.fs_iff

provedlean/Cairn/Frame/Encode.lean:241
fs_iff (s : String) : fs s = true ↔ FitsStr s
theorem

Cairn.Wire.fitsRef_zero

provedlean/Cairn/Frame/Encode.lean:248
fitsRef_zero : fitsRef { claim := 0 } = true
theorem

Cairn.Wire.fitsRange_zero

provedlean/Cairn/Frame/Encode.lean:250
fitsRange_zero : fitsRange (0, 0) = true
theorem

Cairn.Wire.fu64_iff

provedlean/Cairn/Frame/Encode.lean:286
fu64_iff (n : Nat) : fu64 n = true ↔ FitsU64 n
theorem

Cairn.Wire.fi64_iff

provedlean/Cairn/Frame/Encode.lean:288
fi64_iff (v : Int) : fi64 v = true ↔ FitsI64 v
theorem

Cairn.Wire.fb_iff

provedlean/Cairn/Frame/Encode.lean:290
fb_iff (b : ByteArray) : fb b = true ↔ FitsBytes b
theorem

Cairn.Wire.Dec.expect_enc

provedlean/Cairn/Frame/Encode.lean:919
expect_enc (bs r : List UInt8) : expect bs (bs ++ r) = some ((), r)
theorem

Cairn.Wire.Dec.rect_enc

provedlean/Cairn/Frame/Encode.lean:922
rect_enc {x : Rect} (h : fitsRect x = true) (r : List UInt8) :
  rect (Enc.rect x ++ r) = some (x, r)
theorem

Cairn.Wire.Dec.point_enc

provedlean/Cairn/Frame/Encode.lean:928
point_enc {p : Point} (h1 : FitsI32 p.x) (h2 : FitsI32 p.y)
  (r : List UInt8) : point (Enc.point p ++ r) = some (p, r)
theorem

Cairn.Wire.Dec.size_enc

provedlean/Cairn/Frame/Encode.lean:932
size_enc {s : Size} (h1 : FitsI32 s.w) (h2 : FitsI32 s.h) (r : List UInt8) :
  size (Enc.size s ++ r) = some (s, r)
theorem

Cairn.Wire.Dec.color_enc

provedlean/Cairn/Frame/Encode.lean:936
color_enc (c : Color) (r : List UInt8) :
  color (Enc.color c ++ r) = some (c, r)
theorem

Cairn.Wire.Dec.ref_enc

provedlean/Cairn/Frame/Encode.lean:939
ref_enc {c : ControlRef} (h : fitsRef c = true) (r : List UInt8) :
  ref (Enc.ref c ++ r) = some (c, r)
theorem

Cairn.Wire.Dec.range_enc

provedlean/Cairn/Frame/Encode.lean:944
range_enc {p : Nat × Nat} (h : fitsRange p = true) (r : List UInt8) :
  range (Enc.range p ++ r) = some (p, r)
theorem

Cairn.Wire.Dec.list_enc

provedlean/Cairn/Frame/Encode.lean:949
list_enc {α : Type} {d : Dec α} {e : α → List UInt8} (xs : List α)
  (h : ∀ (x : α), x ∈ xs → ∀ (r : List UInt8), d (e x ++ r) = some (x, r))
  (hn : FitsU32 xs.length) (hb : FitsU32 (List.flatMap e xs).length) (r : List UInt8) :
  d.list (Enc.list e xs ++ r) = some (xs, r)
theorem

Cairn.Wire.Dec.ints_enc

provedlean/Cairn/Frame/Encode.lean:956
ints_enc {xs : List Int} (h : fitsInts xs = true) (r : List UInt8) :
  ints (Enc.ints xs ++ r) = some (xs, r)
theorem

Cairn.Wire.Dec.intLists_enc

provedlean/Cairn/Frame/Encode.lean:962
intLists_enc {xss : List (List Int)} (hn : FitsU32 xss.length)
  (h : ∀ (xs : List Int), xs ∈ xss → fitsInts xs = true) (r : List UInt8) :
  intLists (Enc.intLists xss ++ r) = some (xss, r)
theorem

Cairn.Wire.Dec.draw_enc

provedlean/Cairn/Frame/Encode.lean:968
draw_enc {x : Draw} (h : fitsDraw x = true) (r : List UInt8) :
  draw (Enc.draw x ++ r) = some (x, r)
theorem

Cairn.Wire.Dec.ax_enc

provedlean/Cairn/Frame/Encode.lean:1026
ax_enc {x : AxNode} (h : fitsAx x = true) (r : List UInt8) :
  ax (Enc.ax x ++ r) = some (x, r)
theorem

Cairn.Wire.Dec.textInput_enc

provedlean/Cairn/Frame/Encode.lean:1038
textInput_enc {x : Option TextInput} (h : Option.all fitsTextInput x = true)
  (r : List UInt8) : textInput (Enc.textInput x ++ r) = some (x, r)
theorem

Cairn.Wire.Dec.cursor_enc

provedlean/Cairn/Frame/Encode.lean:1054
cursor_enc (c : Cursor) (r : List UInt8) :
  cursor (Enc.cursor c ++ r) = some (c, r)
theorem

Cairn.Wire.Dec.header1_enc

provedlean/Cairn/Frame/Encode.lean:1058
header1_enc {kv : String × String} (h : (fs kv.fst && fs kv.snd) = true)
  (r : List UInt8) : header1 (Enc.header1 kv ++ r) = some (kv, r)
theorem

Cairn.Wire.Dec.headers_enc

provedlean/Cairn/Frame/Encode.lean:1064
headers_enc {hs : List (String × String)} (h : fitsHeaders hs = true)
  (r : List UInt8) : headers (Enc.headers hs ++ r) = some (hs, r)
theorem

Cairn.Wire.Dec.part_enc

provedlean/Cairn/Frame/Encode.lean:1070
part_enc {x : Part} (h : fitsPart x = true) (r : List UInt8) :
  part (Enc.part x ++ r) = some (x, r)
theorem

Cairn.Wire.Dec.optSecret_enc

provedlean/Cairn/Frame/Encode.lean:1086
optSecret_enc {s : Option Secret} (h : Option.all fitsSecret s = true)
  (r : List UInt8) : optSecret (Enc.optSecret s ++ r) = some (s, r)
theorem

Cairn.Wire.Dec.parts_enc

provedlean/Cairn/Frame/Encode.lean:1102
parts_enc {ps : List Part} (hn : FitsU32 ps.length)
  (h : ∀ (p : Part), p ∈ ps → fitsPart p = true) (r : List UInt8) :
  parts (Enc.parts ps ++ r) = some (ps, r)
theorem

Cairn.Wire.Dec.requestBody_enc

provedlean/Cairn/Frame/Encode.lean:1107
requestBody_enc {q : Request} (h : fitsRequest q = true) (r : List UInt8) :
  requestBody q.redact q.kind (Enc.requestBody q ++ r) = some (q, r)
theorem

Cairn.Wire.Dec.effect_enc

provedlean/Cairn/Frame/Encode.lean:1175
effect_enc {x : Effect} (h : fitsEffect x = true) (r : List UInt8) :
  effect (Enc.effect x ++ r) = some (x, r)
theorem

Cairn.Wire.Dec.subCmd_enc

provedlean/Cairn/Frame/Encode.lean:1222
subCmd_enc {x : SubCmd} (h : fitsSubCmd x = true) (r : List UInt8) :
  subCmd (Enc.subCmd x ++ r) = some (x, r)
theorem

Cairn.Wire.Dec.wake_enc

provedlean/Cairn/Frame/Encode.lean:1261
wake_enc {w : Option Nat} (h : Option.all fu64 w = true) (r : List UInt8) :
  wake (Enc.wake w ++ r) = some (w, r)
theorem

Cairn.Wire.Dec.length_le_flatMap

provedlean/Cairn/Frame/Encode.lean:1273
length_le_flatMap {α : Type} (e : α → List UInt8) {xs : List α} {x : α}
  (h : x ∈ xs) : (e x).length ≤ (List.flatMap e xs).length
theorem

Cairn.Wire.Dec.canvas_enc

provedlean/Cairn/Frame/Encode.lean:1283
canvas_enc {c : Canvas} (h : fitsCanvas c = true)
  (hs : (Enc.canvas c).length < 4294967296) (r : List UInt8) :
  canvas (Enc.canvas c ++ r) = some (c, r)
theorem

Cairn.Wire.Dec.menuRecord_enc

provedlean/Cairn/Frame/Encode.lean:1300
menuRecord_enc {m : MenuRecord} (h : fitsMenuRecord m = true)
  (r : List UInt8) : menuRecord (Enc.menuRecord m ++ r) = some (m, r)
theorem

Cairn.Wire.Dec.status_enc

provedlean/Cairn/Frame/Encode.lean:1314
status_enc {s : StatusFrame} (h : fitsStatus s = true)
  (hs : (Enc.status s).length < 4294967296) (r : List UInt8) :
  status (Enc.status s ++ r) = some (s, r)
theorem

Cairn.Wire.Dec.surface_enc

provedlean/Cairn/Frame/Encode.lean:1327
surface_enc {s : SurfaceFrame} (h : fitsSurface s = true)
  (hs : (Enc.surface s).length < 4294967296) (r : List UInt8) :
  surface (Enc.surface s ++ r) = some (s, r)
theorem

Cairn.Wire.Dec.frame_enc

provedlean/Cairn/Frame/Encode.lean:1345
frame_enc {f : Frame} (h : fitsFrame f = true) (hs : SizeOk f)
  (r : List UInt8) : frame (Enc.frame f ++ r) = some (f, r)
theorem

Cairn.Wire.Len.foldl_add

provedlean/Cairn/Frame/Encode.lean:1466
foldl_add {α : Type} (len : α → Nat) (xs : List α) (n : Nat) :
  List.foldl (fun n x => n + len x) n xs = n + (List.map len xs).sum
theorem

Cairn.Wire.Len.str_eq

provedlean/Cairn/Frame/Encode.lean:1472
str_eq (s : String) : str s = (Enc.str s).length
theorem

Cairn.Wire.Len.length_flatMap_i32

provedlean/Cairn/Frame/Encode.lean:1476
length_flatMap_i32 (xs : List Int) :
  (List.flatMap Enc.i32 xs).length = 4 * xs.length
theorem

Cairn.Wire.Len.ints_eq

provedlean/Cairn/Frame/Encode.lean:1483
ints_eq (xs : List Int) : ints xs = (Enc.ints xs).length
theorem

Cairn.Wire.Len.intLists_eq

provedlean/Cairn/Frame/Encode.lean:1486
intLists_eq (xss : List (List Int)) :
  intLists xss = (Enc.intLists xss).length
theorem

Cairn.Wire.Len.draw_eq

provedlean/Cairn/Frame/Encode.lean:1491
draw_eq (d : Draw) : draw d = (Enc.draw d).length
theorem

Cairn.Wire.Len.ax_eq

provedlean/Cairn/Frame/Encode.lean:1498
ax_eq (n : AxNode) : ax n = (Enc.ax n).length
theorem

Cairn.Wire.Len.bytes_eq

provedlean/Cairn/Frame/Encode.lean:1504
bytes_eq (b : ByteArray) : bytes b = (Enc.bytes b).length
theorem

Cairn.Wire.Len.headers_eq

provedlean/Cairn/Frame/Encode.lean:1508
headers_eq (hs : List (String × String)) :
  headers hs = (Enc.headers hs).length
theorem

Cairn.Wire.Len.part_eq

provedlean/Cairn/Frame/Encode.lean:1513
part_eq (p : Part) : part p = (Enc.part p).length
theorem

Cairn.Wire.Len.parts_eq

provedlean/Cairn/Frame/Encode.lean:1517
parts_eq (ps : List Part) : parts ps = (Enc.parts ps).length
theorem

Cairn.Wire.Len.optSecret_eq

provedlean/Cairn/Frame/Encode.lean:1522
optSecret_eq (s : Option Secret) : optSecret s = (Enc.optSecret s).length
theorem

Cairn.Wire.Len.requestBody_eq

provedlean/Cairn/Frame/Encode.lean:1527
requestBody_eq (r : Request) : requestBody r = (Enc.requestBody r).length
theorem

Cairn.Wire.Len.effect_eq

provedlean/Cairn/Frame/Encode.lean:1532
effect_eq (e : Effect) : effect e = (Enc.effect e).length
theorem

Cairn.Wire.Len.subCmd_eq

provedlean/Cairn/Frame/Encode.lean:1539
subCmd_eq (c : SubCmd) : subCmd c = (Enc.subCmd c).length
theorem

Cairn.Wire.Len.textInput_eq

provedlean/Cairn/Frame/Encode.lean:1544
textInput_eq (t : Option TextInput) : textInput t = (Enc.textInput t).length
theorem

Cairn.Wire.Len.list_eq

provedlean/Cairn/Frame/Encode.lean:1551
list_eq {α : Type} (len : α → Nat) (e : α → List UInt8)
  (h : ∀ (x : α), len x = (e x).length) (xs : Array α) :
  list len xs = (List.flatMap e xs.toList).length
theorem

Cairn.Wire.Len.canvas_eq

provedlean/Cairn/Frame/Encode.lean:1559
canvas_eq (c : Canvas) : canvas c = (Enc.canvas c).length
theorem

Cairn.Wire.Len.menuRecord_eq

provedlean/Cairn/Frame/Encode.lean:1566
menuRecord_eq (m : MenuRecord) : menuRecord m = (Enc.menuRecord m).length
theorem

Cairn.Wire.Len.status_eq

provedlean/Cairn/Frame/Encode.lean:1572
status_eq (s : StatusFrame) : status s = (Enc.status s).length
theorem

Cairn.Wire.Len.surface_eq

provedlean/Cairn/Frame/Encode.lean:1577
surface_eq (s : SurfaceFrame) : surface s = (Enc.surface s).length
theorem

Cairn.Wire.Put.rect_data

provedlean/Cairn/Frame/Encode.lean:1738
rect_data (b : ByteArray) (r : Rect) :
  (rect b r).data.toList = b.data.toList ++ Enc.rect r
theorem

Cairn.Wire.Put.point_data

provedlean/Cairn/Frame/Encode.lean:1741
point_data (b : ByteArray) (p : Point) :
  (point b p).data.toList = b.data.toList ++ Enc.point p
theorem

Cairn.Wire.Put.color_data

provedlean/Cairn/Frame/Encode.lean:1744
color_data (b : ByteArray) (c : Color) :
  (color b c).data.toList = b.data.toList ++ Enc.color c
theorem

Cairn.Wire.Put.ref_data

provedlean/Cairn/Frame/Encode.lean:1748
ref_data (b : ByteArray) (c : ControlRef) :
  (ref b c).data.toList = b.data.toList ++ Enc.ref c
theorem

Cairn.Wire.Put.range_data

provedlean/Cairn/Frame/Encode.lean:1751
range_data (b : ByteArray) (p : Nat × Nat) :
  (range b p).data.toList = b.data.toList ++ Enc.range p
theorem

Cairn.Wire.Put.foldl_data'

provedlean/Cairn/Frame/Encode.lean:1755
foldl_data' {α : Type} (put : ByteArray → α → ByteArray) (e : α → List UInt8)
  (h : ∀ (b : ByteArray) (x : α), (put b x).data.toList = b.data.toList ++ e x)
  (xs : List α) (b : ByteArray) :
  (List.foldl put b xs).data.toList = b.data.toList ++ List.flatMap e xs
theorem

Cairn.Wire.Put.ints_data

provedlean/Cairn/Frame/Encode.lean:1762
ints_data (b : ByteArray) (xs : List Int) :
  (ints b xs).data.toList = b.data.toList ++ Enc.ints xs
theorem

Cairn.Wire.Put.intLists_data

provedlean/Cairn/Frame/Encode.lean:1766
intLists_data (b : ByteArray) (xss : List (List Int)) :
  (intLists b xss).data.toList = b.data.toList ++ Enc.intLists xss
theorem

Cairn.Wire.Put.draw_data

provedlean/Cairn/Frame/Encode.lean:1771
draw_data (b : ByteArray) (d : Draw) :
  (draw b d).data.toList = b.data.toList ++ Enc.draw d
theorem

Cairn.Wire.Put.ax_data

provedlean/Cairn/Frame/Encode.lean:1777
ax_data (b : ByteArray) (n : AxNode) :
  (ax b n).data.toList = b.data.toList ++ Enc.ax n
theorem

Cairn.Wire.Put.textInput_data

provedlean/Cairn/Frame/Encode.lean:1782
textInput_data (b : ByteArray) (t : Option TextInput) :
  (textInput b t).data.toList = b.data.toList ++ Enc.textInput t
theorem

Cairn.Wire.Put.cursor_data

provedlean/Cairn/Frame/Encode.lean:1788
cursor_data (b : ByteArray) (c : Cursor) :
  (cursor b c).data.toList = b.data.toList ++ Enc.cursor c
theorem

Cairn.Wire.Put.header1_data

provedlean/Cairn/Frame/Encode.lean:1793
header1_data (b : ByteArray) (kv : String × String) :
  (header1 b kv).data.toList = b.data.toList ++ Enc.header1 kv
theorem

Cairn.Wire.Put.headers_data

provedlean/Cairn/Frame/Encode.lean:1797
headers_data (b : ByteArray) (hs : List (String × String)) :
  (headers b hs).data.toList = b.data.toList ++ Enc.headers hs
theorem

Cairn.Wire.Put.part_data

provedlean/Cairn/Frame/Encode.lean:1802
part_data (b : ByteArray) (p : Part) :
  (part b p).data.toList = b.data.toList ++ Enc.part p
theorem

Cairn.Wire.Put.parts_data

provedlean/Cairn/Frame/Encode.lean:1807
parts_data (b : ByteArray) (ps : List Part) :
  (parts b ps).data.toList = b.data.toList ++ Enc.parts ps
theorem

Cairn.Wire.Put.source_data

provedlean/Cairn/Frame/Encode.lean:1811
source_data (b : ByteArray) (s : Secret.Source) :
  (source b s).data.toList = b.data.toList ++ Enc.source s
theorem

Cairn.Wire.Put.secret_data

provedlean/Cairn/Frame/Encode.lean:1815
secret_data (b : ByteArray) (s : Secret) :
  (secret b s).data.toList = b.data.toList ++ Enc.secret s
theorem

Cairn.Wire.Put.optSecret_data

provedlean/Cairn/Frame/Encode.lean:1819
optSecret_data (b : ByteArray) (s : Option Secret) :
  (optSecret b s).data.toList = b.data.toList ++ Enc.optSecret s
theorem

Cairn.Wire.Put.requestBody_data

provedlean/Cairn/Frame/Encode.lean:1824
requestBody_data (b : ByteArray) (r : Request) :
  (requestBody b r).data.toList = b.data.toList ++ Enc.requestBody r
theorem

Cairn.Wire.Put.subCmd_data

provedlean/Cairn/Frame/Encode.lean:1831
subCmd_data (b : ByteArray) (c : SubCmd) :
  (subCmd b c).data.toList = b.data.toList ++ Enc.subCmd c
theorem

Cairn.Wire.Put.wake_data

provedlean/Cairn/Frame/Encode.lean:1837
wake_data (b : ByteArray) (w : Option Nat) :
  (wake b w).data.toList = b.data.toList ++ Enc.wake w
theorem

Cairn.Wire.Put.effect_data

provedlean/Cairn/Frame/Encode.lean:1841
effect_data (b : ByteArray) (e : Effect) :
  (effect b e).data.toList = b.data.toList ++ Enc.effect e
theorem

Cairn.Wire.Put.foldl_data

provedlean/Cairn/Frame/Encode.lean:1847
foldl_data {α : Type} (put : ByteArray → α → ByteArray) (e : α → List UInt8)
  (h : ∀ (b : ByteArray) (x : α), (put b x).data.toList = b.data.toList ++ e x)
  (xs : List α) (b : ByteArray) :
  (List.foldl put b xs).data.toList = b.data.toList ++ List.flatMap e xs
theorem

Cairn.Wire.Put.list_data

provedlean/Cairn/Frame/Encode.lean:1854
list_data {α : Type} (put : ByteArray → α → ByteArray) (len : α → Nat)
  (e : α → List UInt8)
  (h : ∀ (b : ByteArray) (x : α), (put b x).data.toList = b.data.toList ++ e x)
  (hl : ∀ (x : α), len x = (e x).length) (b : ByteArray) (xs : Array α) :
  (list put len b xs).data.toList = b.data.toList ++ Enc.list e xs.toList
theorem

Cairn.Wire.Put.canvas_data

provedlean/Cairn/Frame/Encode.lean:1862
canvas_data (b : ByteArray) (c : Canvas) :
  (canvas b c).data.toList = b.data.toList ++ Enc.canvas c
theorem

Cairn.Wire.Put.menuRecord_data

provedlean/Cairn/Frame/Encode.lean:1867
menuRecord_data (b : ByteArray) (m : MenuRecord) :
  (menuRecord b m).data.toList = b.data.toList ++ Enc.menuRecord m
theorem

Cairn.Wire.Put.status_data

provedlean/Cairn/Frame/Encode.lean:1872
status_data (b : ByteArray) (s : StatusFrame) :
  (status b s).data.toList = b.data.toList ++ Enc.status s
theorem

Cairn.Wire.Put.surface_data

provedlean/Cairn/Frame/Encode.lean:1877
surface_data (b : ByteArray) (s : SurfaceFrame) :
  (surface b s).data.toList = b.data.toList ++ Enc.surface s
theorem

Cairn.Wire.Put.frame_data

provedlean/Cairn/Frame/Encode.lean:1883
frame_data (f : Frame) : (frame f).data.toList = Enc.frame f
theorem

Cairn.encodeFrame_eq_put

provedlean/Cairn/Frame/Encode.lean:1905
encodeFrame_eq_put : encodeFrame = Wire.Put.frame
theorem

Cairn.decodeFrame_encodeFrame

provedlean/Cairn/Frame/Encode.lean:1912
decodeFrame_encodeFrame (f : Frame) (h : Wire.fitsFrame f = true)
  (hs : (encodeFrame f).size < 4294967296) : decodeFrame (encodeFrame f) = some f

Round trip. Every frame whose values fit the wire's fields (fitsFrame, executable) and whose encoding is under 4 GiB decodes to itself.