Skip to main content

vexil_codegen_ts/
flags.rs

1use vexil_lang::ir::{FlagsDef, TypeRegistry};
2
3use crate::emit::CodeWriter;
4
5/// Emit a flags type: number type alias + named constants + encode/decode.
6pub fn emit_flags(w: &mut CodeWriter, flags: &FlagsDef, _registry: &TypeRegistry) {
7    let name = flags.name.as_str();
8
9    // Type alias
10    w.line(&format!("export type {name} = number;"));
11
12    // Const object with bit values
13    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    // Encode function
23    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    // Decode function
36    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}