witx_codegen/rust/
struct.rs

1use std::io::Write;
2
3use super::*;
4
5impl RustGenerator {
6    pub fn define_as_struct<T: Write>(
7        w: &mut PrettyWriter<T>,
8        name: &str,
9        members: &[ASStructMember],
10    ) -> Result<(), Error> {
11        w.write_line("#[repr(C, packed)]")?
12            .write_line("#[derive(Copy,Clone)]")?
13            .write_line(format!("pub struct {} {{", name.as_type()))?;
14        {
15            let mut w = w.new_block();
16            for member in members {
17                let member_type = member.type_.as_ref();
18                w.write_line(format!(
19                    "pub {}: {},",
20                    member.name.as_var(),
21                    member_type.as_lang()
22                ))?;
23
24                let pad_len = member.padding;
25                for i in 0..(pad_len & 1) {
26                    w.write_line(format!("__pad8_{}: u8,", i))?;
27                }
28                for i in 0..(pad_len & 3) / 2 {
29                    w.write_line(format!("__pad16_{}: u16,", i))?;
30                }
31                for i in 0..(pad_len & 7) / 4 {
32                    w.write_line(format!("__pad32_{}: u32,", i))?;
33                }
34                for i in 0..pad_len / 8 {
35                    w.write_line(format!("__pad64_{}: u64,", i))?;
36                }
37            }
38        }
39        w.write_line("}")?.eob()?;
40        Ok(())
41    }
42}