witx_codegen/rust/
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 RustGenerator {
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("#[repr(C, packed)]")?
28            .write_line("#[derive(Copy, Clone, Debug)]")?
29            .write_line(format!("pub struct {} {{ // -- Tuple", name.as_type()))?;
30        {
31            let mut w = w.new_block();
32            for (i, member) in members.iter().enumerate() {
33                let member_type = member.type_.as_ref();
34                w.write_line(format!("pub v{}: {},", i, member_type.as_lang()))?;
35
36                let pad_len = member.padding;
37                for i in 0..(pad_len & 1) {
38                    w.write_line(format!("__pad8_{}: u8,", i))?;
39                }
40                for i in 0..(pad_len & 3) / 2 {
41                    w.write_line(format!("__pad16_{}: u16,", i))?;
42                }
43                for i in 0..(pad_len & 7) / 4 {
44                    w.write_line(format!("__pad32_{}: u32,", i))?;
45                }
46                for i in 0..pad_len / 8 {
47                    w.write_line(format!("__pad64_{}: u64,", i))?;
48                }
49            }
50        }
51        w.write_line("}")?.eob()?;
52        Ok(())
53    }
54}