def rules

bend-kit-http2@0.4.0.0 · http2.bend:107

import bend-kit-http2@0.4.0.0/http2.bend as Http2
import Base

107def rules(+kind: U32, +flags: U32, +stream: U32, +len: U32, +pad: U32, +promised: U32, +value: U32, m: Maybe<&2, Error>) -> Maybe<&2, Error>:
108  match kind:
109    case 0:
110      first(reject(U32.is_eq(stream, 0), 1, True{}, stream),
111        first(reject(Bool.and(has(flags, 8), U32.is_eq(len, 0)), 6, False{}, stream),
112          reject(padding(flags, len, 0, pad), 1, True{}, stream)))
113    case 1:
114      +fixed = Bool.pick(U32, has(flags, 32), 5, 0)
115      +prefix = Bool.pick(U32, has(flags, 8), 1, 0)
116      first(reject(U32.is_eq(stream, 0), 1, True{}, stream),
117        first(reject(U32.is_lt(len, (fixed + prefix : U32)), 6, True{}, stream),
118          reject(padding(flags, len, fixed, pad), 1, True{}, stream)))
119    case 2:
120      first(reject(U32.is_ne(len, 5), 6, U32.is_eq(stream, 0), stream),
121        reject(U32.is_eq(stream, 0), 1, True{}, stream))
122    case 3:
123      first(reject(U32.is_ne(len, 4), 6, True{}, stream),
124        reject(U32.is_eq(stream, 0), 1, True{}, stream))
125    case 4:
126      first(reject(U32.is_ne(stream, 0), 1, True{}, stream),
127        first(reject(Bool.and(has(flags, 1), U32.is_ne(len, 0)), 6, True{}, stream),
128          first(reject(U32.is_ne((len % 6 : U32), 0), 6, True{}, stream), m)))
129    case 5:
130      +prefix = Bool.pick(U32, has(flags, 8), 1, 0)
131      first(reject(U32.is_eq(stream, 0), 1, True{}, stream),
132        first(reject(U32.is_lt(len, (prefix + 4 : U32)), 6, True{}, stream),
133          first(reject(padding(flags, len, 4, pad), 1, True{}, stream),
134            reject(U32.is_eq(promised, 0), 1, True{}, stream))))
135    case 6:
136      first(reject(U32.is_ne(len, 8), 6, True{}, stream),
137        reject(U32.is_ne(stream, 0), 1, True{}, stream))
138    case 7:
139      first(reject(U32.is_lt(len, 8), 6, True{}, stream),
140        reject(U32.is_ne(stream, 0), 1, True{}, stream))
141    case 8:
142      first(reject(U32.is_ne(len, 4), 6, U32.is_eq(stream, 0), stream),
143        reject(U32.is_eq((value .&. 2147483647 : U32), 0), 1, U32.is_eq(stream, 0), stream))
144    case 9:
145      reject(U32.is_eq(stream, 0), 1, True{}, stream)
146    case _:
147      None{}

Uses (18)

Used by (2)