use proc_macro2::{Ident, Literal}; use syn::{Attribute, Expr, Type}; #[derive(Debug, Clone)] pub struct NapiFn { pub name: Ident, pub js_name: String, pub attrs: Vec, pub args: Vec, pub ret: Option, pub is_ret_result: bool, pub is_async: bool, pub fn_self: Option, pub kind: FnKind, pub vis: syn::Visibility, pub parent: Option, pub strict: bool, pub return_if_invalid: bool, pub js_mod: Option, pub ts_generic_types: Option, pub ts_args_type: Option, pub ts_return_type: Option, pub skip_typescript: bool, pub comments: Vec, pub parent_is_generator: bool, pub writable: bool, pub enumerable: bool, pub configurable: bool, pub catch_unwind: bool, pub unsafe_: bool, pub register_name: Ident, } #[derive(Debug, Clone)] pub struct CallbackArg { pub pat: Box, pub args: Vec, pub ret: Option, } #[derive(Debug, Clone)] pub struct NapiFnArg { pub kind: NapiFnArgKind, pub ts_arg_type: Option, } impl NapiFnArg { /// if type was overridden with `#[napi(ts_arg_type = "...")]` use that instead pub fn use_overridden_type_or(&self, default: impl FnOnce() -> String) -> String { self.ts_arg_type.as_ref().cloned().unwrap_or_else(default) } } #[derive(Debug, Clone)] pub enum NapiFnArgKind { PatType(Box), Callback(Box), } #[derive(Debug, Clone, PartialEq, Eq)] pub enum FnKind { Normal, Constructor, Factory, Getter, Setter, } #[derive(Debug, Clone, PartialEq, Eq)] pub enum FnSelf { Value, Ref, MutRef, } #[derive(Debug, Clone)] pub struct NapiStruct { pub name: Ident, pub js_name: String, pub vis: syn::Visibility, pub fields: Vec, pub is_tuple: bool, pub kind: NapiStructKind, pub object_from_js: bool, pub object_to_js: bool, pub js_mod: Option, pub comments: Vec, pub implement_iterator: bool, pub use_custom_finalize: bool, pub register_name: Ident, } #[derive(Debug, Clone, PartialEq, Eq)] pub enum NapiStructKind { None, Constructor, Object, } #[derive(Debug, Clone)] pub struct NapiStructField { pub name: syn::Member, pub js_name: String, pub ty: syn::Type, pub getter: bool, pub setter: bool, pub writable: bool, pub enumerable: bool, pub configurable: bool, pub comments: Vec, pub skip_typescript: bool, pub ts_type: Option, } #[derive(Debug, Clone)] pub struct NapiImpl { pub name: Ident, pub js_name: String, pub items: Vec, pub task_output_type: Option, pub iterator_yield_type: Option, pub iterator_next_type: Option, pub iterator_return_type: Option, pub js_mod: Option, pub comments: Vec, pub register_name: Ident, } #[derive(Debug, Clone)] pub struct NapiEnum { pub name: Ident, pub js_name: String, pub variants: Vec, pub js_mod: Option, pub comments: Vec, pub skip_typescript: bool, pub register_name: Ident, } #[derive(Debug, Clone)] pub enum NapiEnumValue { String(String), Number(i32), } impl From<&NapiEnumValue> for Literal { fn from(val: &NapiEnumValue) -> Self { match val { NapiEnumValue::String(string) => Literal::string(string), NapiEnumValue::Number(number) => Literal::i32_unsuffixed(number.to_owned()), } } } #[derive(Debug, Clone)] pub struct NapiEnumVariant { pub name: Ident, pub val: NapiEnumValue, pub comments: Vec, } #[derive(Debug, Clone)] pub struct NapiConst { pub name: Ident, pub js_name: String, pub type_name: Type, pub value: Expr, pub js_mod: Option, pub comments: Vec, pub skip_typescript: bool, pub register_name: Ident, } #[derive(Debug, Clone)] pub struct NapiMod { pub name: Ident, pub js_name: String, }