witx_codegen/assemblyscript/
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 AssemblyScriptGenerator {
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("// @ts-ignore: decorator")?
28 .write_line("@unmanaged")?
29 .write_line(format!("export class {} {{ // -- 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!("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!("private __pad8_{}: u8;", i))?;
39 }
40 for i in 0..(pad_len & 3) / 2 {
41 w.write_line(format!("private __pad16_{}: u16;", i))?;
42 }
43 for i in 0..(pad_len & 7) / 4 {
44 w.write_line(format!("private __pad32_{}: u32;", i))?;
45 }
46 for i in 0..pad_len / 8 {
47 w.write_line(format!("private __pad64_{}: u64;", i))?;
48 }
49 }
50 }
51 w.write_line("}")?.eob()?;
52 Ok(())
53 }
54}