Path: blob/main/crates/wiggle/generate/src/module_trait.rs
1693 views
use proc_macro2::TokenStream;1use quote::quote;23use crate::codegen_settings::{CodegenSettings, ErrorType};4use crate::names;5use witx::Module;67pub fn passed_by_reference(ty: &witx::Type) -> bool {8match ty {9witx::Type::Record(r) => r.bitflags_repr().is_none(),10witx::Type::Variant(v) => !v.is_enum(),11_ => false,12}13}1415pub fn define_module_trait(m: &Module, settings: &CodegenSettings) -> TokenStream {16let traitname = names::trait_name(&m.name);17let traitmethods = m.funcs().map(|f| {18let funcname = names::func(&f.name);19let args = f.params.iter().map(|arg| {20let arg_name = names::func_param(&arg.name);21let arg_typename = names::type_ref(&arg.tref, quote!());22let arg_type = if passed_by_reference(&*arg.tref.type_()) {23quote!(&#arg_typename)24} else {25quote!(#arg_typename)26};27quote!(#arg_name: #arg_type)28});2930let result = match f.results.len() {310 if f.noreturn => quote!(wiggle::anyhow::Error),320 => quote!(()),331 => {34let (ok, err) = match &**f.results[0].tref.type_() {35witx::Type::Variant(v) => match v.as_expected() {36Some(p) => p,37None => unimplemented!("anonymous variant ref {:?}", v),38},39_ => unimplemented!(),40};4142let ok = match ok {43Some(ty) => names::type_ref(ty, quote!()),44None => quote!(()),45};46let err = match err {47Some(ty) => match settings.errors.for_abi_error(ty) {48Some(ErrorType::User(custom)) => {49let tn = custom.typename();50quote!(super::#tn)51}52Some(ErrorType::Generated(g)) => g.typename(),53None => names::type_ref(ty, quote!()),54},55None => quote!(()),56};57quote!(Result<#ok, #err>)58}59_ => unimplemented!(),60};6162let asyncness = if settings.get_async(&m, &f).is_sync() {63quote!()64} else {65quote!(async)66};6768let self_ = if settings.mutable {69quote!(&mut self)70} else {71quote!(&self)72};73quote!(74#asyncness fn #funcname(75#self_,76mem: &mut wiggle::GuestMemory<'_>,77#(#args),*78) -> #result;79)80});8182quote! {83#[wiggle::async_trait]84pub trait #traitname {85#(#traitmethods)*86}87}88}899091