Cairn · module

Cairn.Frame.Events

lean/Cairn/Frame/Events.lean

Event byte format v2 (host → Lean, docs/frame.md): specification encoder Wire.Enc.events, decoder Wire.Dec.events, and the round trip decodeEvents_encodeEvents.

header  "CAEV" u16 version=2 u16 flags=0 u32 count                          12 bytes
events  count records, each [tag, a, b, 0] then fixed fields, then at most one string

A surface record (tag 21) is its head and a u32 place followed by one whole surface-local record (tags 0–17), so every record still stands alone.

Lean only decodes events at run time (the host encodes them), and a frame's events are a handful of records, so the decoder runs the list specification directly on the buffer's bytes.

Imports Cairn.Input, Cairn.Frame.Encode

Order

Definitions 32

def

Cairn.Wire.Button.code

lean/Cairn/Frame/Events.lean:24
code : Button → UInt8
def

Cairn.Wire.Button.ofCode

lean/Cairn/Frame/Events.lean:27
ofCode : UInt8 → Option Button
def

Cairn.Wire.Fault.code

lean/Cairn/Frame/Events.lean:33
code : Fault → UInt8
def

Cairn.Wire.Fault.ofCode

lean/Cairn/Frame/Events.lean:36
ofCode : UInt8 → Option Fault
def

Cairn.Wire.Reply.code

lean/Cairn/Frame/Events.lean:44
code : Reply → UInt8

done 0, bytes 1, http 2, failed 3, names 4, app 5, flag 6, image 7.

def

Cairn.Wire.Reply.faultCode

lean/Cairn/Frame/Events.lean:48
faultCode : Reply → UInt8
def

Cairn.Wire.SubEvent.code

lean/Cairn/Frame/Events.lean:54
code : SubEvent → UInt8

tick 0, changed 1, audio 2, keyDown 3, keyUp 4, otherKey 5, failed 6, started 7, evicted 8.

def

Cairn.Wire.SubEvent.faultCode

lean/Cairn/Frame/Events.lean:58
faultCode : SubEvent → UInt8
def

Cairn.Wire.fitsTime

lean/Cairn/Frame/Events.lean:62
fitsTime (t : Time) : Bool
def

Cairn.Wire.fitsLevel

lean/Cairn/Frame/Events.lean:64
fitsLevel (l : Level) : Bool
def

Cairn.Wire.fitsSubEvent

lean/Cairn/Frame/Events.lean:66
fitsSubEvent : SubEvent → Bool
def

Cairn.Wire.fitsReply

lean/Cairn/Frame/Events.lean:73
fitsReply : Reply → Bool
def

Cairn.Wire.fitsEvent

lean/Cairn/Frame/Events.lean:83
fitsEvent : Event → Bool
def

Cairn.Wire.Enc.head

lean/Cairn/Frame/Events.lean:105
head (tag a b : UInt8) : List UInt8

The record head: tag, two small fields, a reserved zero.

def

Cairn.Wire.Enc.replyBody

lean/Cairn/Frame/Events.lean:108
replyBody : Reply → List UInt8

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

def

Cairn.Wire.Enc.level

lean/Cairn/Frame/Events.lean:118
level (l : Level) : List UInt8
def

Cairn.Wire.Enc.subEventBody

lean/Cairn/Frame/Events.lean:121
subEventBody : SubEvent → List UInt8

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

def

Cairn.Wire.Enc.event

lean/Cairn/Frame/Events.lean:128
event : Event → List UInt8
def

Cairn.Wire.Enc.eventsMagic

lean/Cairn/Frame/Events.lean:158
eventsMagic : List UInt8
def

Cairn.Wire.Enc.eventsHeader

lean/Cairn/Frame/Events.lean:160
eventsHeader : List UInt8
def

Cairn.Wire.Enc.events

lean/Cairn/Frame/Events.lean:162
events (es : List Event) : List UInt8
def

Cairn.Wire.Dec.opt

lean/Cairn/Frame/Events.lean:169
opt {α : Type} (present : UInt8) (a : α) : Dec (Option α)
def

Cairn.Wire.Dec.replyBody

lean/Cairn/Frame/Events.lean:175
replyBody (code fault : UInt8) : Dec Reply
def

Cairn.Wire.Dec.level

lean/Cairn/Frame/Events.lean:206
level : Dec Level
def

Cairn.Wire.Dec.subEventBody

lean/Cairn/Frame/Events.lean:211
subEventBody (code fault : UInt8) : Dec SubEvent

The body of a subscription event with code code; only failed has a fault.

def

Cairn.Wire.Dec.headed

lean/Cairn/Frame/Events.lean:232
headed (k : UInt8 → UInt8 → UInt8 → Dec Event) : Dec Event

Read a record head, then the rest of the record by its tag.

def

Cairn.Wire.Dec.body

lean/Cairn/Frame/Events.lean:240
body (tag a b : UInt8) : Dec Event

Every record but surface, after its head.

def

Cairn.Wire.Dec.plain

lean/Cairn/Frame/Events.lean:307
plain : Dec Event

A record other than surface.

def

Cairn.Wire.Dec.event

lean/Cairn/Frame/Events.lean:310
event : Dec Event

One record. A surface record holds exactly one surface-local record.

def

Cairn.Wire.Dec.events

lean/Cairn/Frame/Events.lean:319
events : Dec (List Event)
def

Cairn.encodeEvents

lean/Cairn/Frame/Events.lean:515
encodeEvents (es : Array Event) : ByteArray
def

Cairn.decodeEvents

lean/Cairn/Frame/Events.lean:517
decodeEvents (b : ByteArray) : Option (Array Event)

Theorems 11

theorem

Cairn.Wire.Button.ofCode_code

provedlean/Cairn/Frame/Events.lean:30
ofCode_code (b : Button) : ofCode (code b) = some b
theorem

Cairn.Wire.Fault.ofCode_code

provedlean/Cairn/Frame/Events.lean:40
ofCode_code (f : Fault) : ofCode (code f) = some f
theorem

Cairn.Wire.Dec.opt_isSome

provedlean/Cairn/Frame/Events.lean:324
opt_isSome {α : Type} (o : Option α) (d : α) (r : List UInt8) :
  opt (if o.isSome = true then 1 else 0) (o.getD d) r = some (o, r)
theorem

Cairn.Wire.Dec.replyBody_enc

provedlean/Cairn/Frame/Events.lean:328
replyBody_enc {rp : Reply} (h : fitsReply rp = true) (r : List UInt8) :
  replyBody (Reply.code rp) (Reply.faultCode rp) (Enc.replyBody rp ++ r) = some (rp, r)
theorem

Cairn.Wire.Dec.level_enc

provedlean/Cairn/Frame/Events.lean:362
level_enc {l : Level} (h : fitsLevel l = true) (r : List UInt8) :
  level (Enc.level l ++ r) = some (l, r)
theorem

Cairn.Wire.Dec.subEventBody_enc

provedlean/Cairn/Frame/Events.lean:367
subEventBody_enc {e : SubEvent} (h : fitsSubEvent e = true)
  (r : List UInt8) :
  subEventBody (SubEvent.code e) (SubEvent.faultCode e) (Enc.subEventBody e ++ r) =
    some (e, r)
theorem

Cairn.Wire.Dec.plain_enc

provedlean/Cairn/Frame/Events.lean:391
plain_enc {e : Event} (h : fitsEvent e = true) (hs : e.isSurface = false)
  (r : List UInt8) : plain (Enc.event e ++ r) = some (e, r)
theorem

Cairn.Wire.Dec.event_eq_plain

provedlean/Cairn/Frame/Events.lean:472
event_eq_plain (t : UInt8) (l : List UInt8) (ht : t ≠ 21) :
  event (t :: l) = plain (t :: l)

On a record whose tag isn't surface's, event is plain.

theorem

Cairn.Wire.Dec.event_enc

provedlean/Cairn/Frame/Events.lean:476
event_enc {e : Event} (h : fitsEvent e = true) (r : List UInt8) :
  event (Enc.event e ++ r) = some (e, r)
theorem

Cairn.Wire.Dec.events_enc

provedlean/Cairn/Frame/Events.lean:501
events_enc {es : List Event} (h : ∀ (e : Event), e ∈ es → fitsEvent e = true)
  (hn : FitsU32 es.length) (r : List UInt8) : events (Enc.events es ++ r) = some (es, r)
theorem

Cairn.decodeEvents_encodeEvents

provedlean/Cairn/Frame/Events.lean:521
decodeEvents_encodeEvents (es : Array Event) (h : es.all Wire.fitsEvent = true)
  (hn : es.size < 4294967296) : decodeEvents (encodeEvents es) = some es

Round trip. Every batch of events whose values fit the wire's fields decodes to itself.