vexil_codegen_ts/
flags.rs1use vexil_lang::ir::{FlagsDef, TypeRegistry};
2
3use crate::emit::CodeWriter;
4
5pub fn emit_flags(w: &mut CodeWriter, flags: &FlagsDef, _registry: &TypeRegistry) {
7 let name = flags.name.as_str();
8
9 w.line(&format!("export type {name} = number;"));
11
12 w.open_block(&format!("export const {name} ="));
14 for bit_def in &flags.bits {
15 let bit = bit_def.bit;
16 w.line(&format!("{}: {},", bit_def.name, 1u64 << bit));
17 }
18 w.dedent();
19 w.line("} as const;");
20 w.blank();
21
22 w.open_block(&format!(
24 "export function encode{name}(v: {name}, w: BitWriter): void"
25 ));
26 match flags.wire_bytes {
27 1 => w.line("w.writeU8(v);"),
28 2 => w.line("w.writeU16(v);"),
29 4 => w.line("w.writeU32(v);"),
30 _ => w.line("w.writeU64(BigInt(v));"),
31 }
32 w.close_block();
33 w.blank();
34
35 w.open_block(&format!(
37 "export function decode{name}(r: BitReader): {name}"
38 ));
39 match flags.wire_bytes {
40 1 => w.line("return r.readU8();"),
41 2 => w.line("return r.readU16();"),
42 4 => w.line("return r.readU32();"),
43 _ => w.line("return Number(r.readU64());"),
44 }
45 w.close_block();
46 w.blank();
47}