(
&mut self,
id: TypeId,
cases: impl IntoIterator<Item = (String, Option<String>, &'b Docs, Option<&'b Type>)> + Clone,
docs: &Docs,
derive_component: &str,
| 2043 | } |
| 2044 | |
| 2045 | fn print_rust_enum<'b>( |
| 2046 | &mut self, |
| 2047 | id: TypeId, |
| 2048 | cases: impl IntoIterator<Item = (String, Option<String>, &'b Docs, Option<&'b Type>)> + Clone, |
| 2049 | docs: &Docs, |
| 2050 | derive_component: &str, |
| 2051 | ) where |
| 2052 | Self: Sized, |
| 2053 | { |
| 2054 | let info = self.info(id); |
| 2055 | let wt = self.generator.wasmtime_path(); |
| 2056 | |
| 2057 | // We use a BTree set to make sure we don't have any duplicates and we have a stable order |
| 2058 | let additional_derives: BTreeSet<String> = self |
| 2059 | .generator |
| 2060 | .opts |
| 2061 | .additional_derive_attributes |
| 2062 | .iter() |
| 2063 | .cloned() |
| 2064 | .collect(); |
| 2065 | |
| 2066 | for (name, mode) in self.modes_of(id) { |
| 2067 | let name = to_rust_upper_camel_case(&name); |
| 2068 | |
| 2069 | let mut derives = additional_derives.clone(); |
| 2070 | |
| 2071 | self.rustdoc(docs); |
| 2072 | let lt = self.lifetime_for(&info, mode); |
| 2073 | uwriteln!(self.src, "#[derive({wt}::component::ComponentType)]"); |
| 2074 | if lt.is_none() { |
| 2075 | uwriteln!(self.src, "#[derive({wt}::component::Lift)]"); |
| 2076 | } |
| 2077 | uwriteln!(self.src, "#[derive({wt}::component::Lower)]"); |
| 2078 | self.push_str(&format!("#[component({derive_component})]\n")); |
| 2079 | if let Some(path) = &self.generator.opts.wasmtime_crate { |
| 2080 | uwriteln!(self.src, "#[component(wasmtime_crate = {path})]\n"); |
| 2081 | } |
| 2082 | if info.is_copy() { |
| 2083 | derives.extend(["Copy", "Clone"].into_iter().map(|s| s.to_string())); |
| 2084 | } else if info.is_clone() { |
| 2085 | derives.insert("Clone".to_string()); |
| 2086 | } |
| 2087 | |
| 2088 | if !derives.is_empty() { |
| 2089 | self.push_str("#[derive("); |
| 2090 | self.push_str(&derives.into_iter().collect::<Vec<_>>().join(", ")); |
| 2091 | self.push_str(")]\n") |
| 2092 | } |
| 2093 | |
| 2094 | self.push_str(&format!("pub enum {name}")); |
| 2095 | self.print_generics(lt); |
| 2096 | self.push_str("{\n"); |
| 2097 | for (case_name, component_name, docs, payload) in cases.clone() { |
| 2098 | self.rustdoc(docs); |
| 2099 | if let Some(n) = component_name { |
| 2100 | self.push_str(&format!("#[component(name = \"{n}\")] ")); |
| 2101 | } |
| 2102 | self.push_str(&case_name); |
no test coverage detected