witx_codegen/zig/
tuple.rs

1use std::io::Write;
2
3use super::*;
4
5pub struct Tuple;
6
7impl Tuple {
8    pub fn name_for(tuple_members: &[ASTupleMember]) -> String {
9        format!(
10            "WasiTuple{}{}",
11            tuple_members.len(),
12            tuple_members
13                .iter()
14                .map(|member| member.type_.to_string())
15                .collect::<Vec<_>>()
16                .join("_")
17        )
18    }
19}
20
21impl ZigGenerator {
22    pub fn define_as_tuple<T: Write>(
23        w: &mut PrettyWriter<T>,
24        name: &str,
25        members: &[ASTupleMember],
26    ) -> Result<(), Error> {
27        w.write_line(format!(
28            "pub const {} = extern struct {{ // -- Tuple",
29            name.as_type()
30        ))?;
31        {
32            let mut w = w.new_block();
33            for (i, member) in members.iter().enumerate() {
34                let member_type = member.type_.as_ref();
35                w.write_line(format!("v{}: {},", i, member_type.as_lang()))?;
36
37                let pad_len = member.padding;
38                for i in 0..(pad_len & 1) {
39                    w.write_line(format!("__pad8_{}: u8 = undefined,", i))?;
40                }
41                for i in 0..(pad_len & 3) / 2 {
42                    w.write_line(format!("__pad16_{}: u16 = undefined,", i))?;
43                }
44                for i in 0..(pad_len & 7) / 4 {
45                    w.write_line(format!("__pad32_{}: u32 = undefined,", i))?;
46                }
47                for i in 0..pad_len / 8 {
48                    w.write_line(format!("__pad64_{}: u64 = undefined,", i))?;
49                }
50            }
51        }
52        w.write_line("};")?.eob()?;
53        Ok(())
54    }
55}