| 1 | #![doc (html_root_url = "https://docs.rs/wasm-bindgen-shared/0.2" )] |
| 2 | |
| 3 | pub mod identifier; |
| 4 | #[cfg (test)] |
| 5 | mod schema_hash_approval; |
| 6 | |
| 7 | // This gets changed whenever our schema changes. |
| 8 | // At this time versions of wasm-bindgen and wasm-bindgen-cli are required to have the exact same |
| 9 | // SCHEMA_VERSION in order to work together. |
| 10 | pub const SCHEMA_VERSION: &str = "0.2.100" ; |
| 11 | |
| 12 | #[macro_export ] |
| 13 | macro_rules! shared_api { |
| 14 | ($mac:ident) => { |
| 15 | $mac! { |
| 16 | struct Program<'a> { |
| 17 | exports: Vec<Export<'a>>, |
| 18 | enums: Vec<Enum<'a>>, |
| 19 | imports: Vec<Import<'a>>, |
| 20 | structs: Vec<Struct<'a>>, |
| 21 | // NOTE: Originally typescript_custom_sections are just some strings |
| 22 | // But the expression type can only be parsed into a string during compilation |
| 23 | // So when encoding, LitOrExpr contains two types, one is that expressions are parsed into strings during compilation, and the other is can be parsed directly. |
| 24 | // When decoding, LitOrExpr can be decoded as a string. |
| 25 | typescript_custom_sections: Vec<LitOrExpr<'a>>, |
| 26 | local_modules: Vec<LocalModule<'a>>, |
| 27 | inline_js: Vec<&'a str>, |
| 28 | unique_crate_identifier: &'a str, |
| 29 | package_json: Option<&'a str>, |
| 30 | linked_modules: Vec<LinkedModule<'a>>, |
| 31 | } |
| 32 | |
| 33 | struct Import<'a> { |
| 34 | module: Option<ImportModule<'a>>, |
| 35 | js_namespace: Option<Vec<String>>, |
| 36 | kind: ImportKind<'a>, |
| 37 | } |
| 38 | |
| 39 | struct LinkedModule<'a> { |
| 40 | module: ImportModule<'a>, |
| 41 | link_function_name: &'a str, |
| 42 | } |
| 43 | |
| 44 | enum ImportModule<'a> { |
| 45 | Named(&'a str), |
| 46 | RawNamed(&'a str), |
| 47 | Inline(u32), |
| 48 | } |
| 49 | |
| 50 | enum ImportKind<'a> { |
| 51 | Function(ImportFunction<'a>), |
| 52 | Static(ImportStatic<'a>), |
| 53 | String(ImportString<'a>), |
| 54 | Type(ImportType<'a>), |
| 55 | Enum(StringEnum<'a>), |
| 56 | } |
| 57 | |
| 58 | struct ImportFunction<'a> { |
| 59 | shim: &'a str, |
| 60 | catch: bool, |
| 61 | variadic: bool, |
| 62 | assert_no_shim: bool, |
| 63 | method: Option<MethodData<'a>>, |
| 64 | structural: bool, |
| 65 | function: Function<'a>, |
| 66 | } |
| 67 | |
| 68 | struct MethodData<'a> { |
| 69 | class: &'a str, |
| 70 | kind: MethodKind<'a>, |
| 71 | } |
| 72 | |
| 73 | enum MethodKind<'a> { |
| 74 | Constructor, |
| 75 | Operation(Operation<'a>), |
| 76 | } |
| 77 | |
| 78 | struct Operation<'a> { |
| 79 | is_static: bool, |
| 80 | kind: OperationKind<'a>, |
| 81 | } |
| 82 | |
| 83 | enum OperationKind<'a> { |
| 84 | Regular, |
| 85 | Getter(&'a str), |
| 86 | Setter(&'a str), |
| 87 | IndexingGetter, |
| 88 | IndexingSetter, |
| 89 | IndexingDeleter, |
| 90 | } |
| 91 | |
| 92 | struct ImportStatic<'a> { |
| 93 | name: &'a str, |
| 94 | shim: &'a str, |
| 95 | } |
| 96 | |
| 97 | struct ImportString<'a> { |
| 98 | shim: &'a str, |
| 99 | string: &'a str, |
| 100 | } |
| 101 | |
| 102 | struct ImportType<'a> { |
| 103 | name: &'a str, |
| 104 | instanceof_shim: &'a str, |
| 105 | vendor_prefixes: Vec<&'a str>, |
| 106 | } |
| 107 | |
| 108 | struct StringEnum<'a> { |
| 109 | name: &'a str, |
| 110 | variant_values: Vec<&'a str>, |
| 111 | comments: Vec<&'a str>, |
| 112 | generate_typescript: bool, |
| 113 | } |
| 114 | |
| 115 | struct Export<'a> { |
| 116 | class: Option<&'a str>, |
| 117 | comments: Vec<&'a str>, |
| 118 | consumed: bool, |
| 119 | function: Function<'a>, |
| 120 | method_kind: MethodKind<'a>, |
| 121 | start: bool, |
| 122 | } |
| 123 | |
| 124 | struct Enum<'a> { |
| 125 | name: &'a str, |
| 126 | signed: bool, |
| 127 | variants: Vec<EnumVariant<'a>>, |
| 128 | comments: Vec<&'a str>, |
| 129 | generate_typescript: bool, |
| 130 | } |
| 131 | |
| 132 | struct EnumVariant<'a> { |
| 133 | name: &'a str, |
| 134 | value: u32, |
| 135 | comments: Vec<&'a str>, |
| 136 | } |
| 137 | |
| 138 | struct Function<'a> { |
| 139 | args: Vec<FunctionArgumentData<'a>>, |
| 140 | asyncness: bool, |
| 141 | name: &'a str, |
| 142 | generate_typescript: bool, |
| 143 | generate_jsdoc: bool, |
| 144 | variadic: bool, |
| 145 | ret_ty_override: Option<&'a str>, |
| 146 | ret_desc: Option<&'a str>, |
| 147 | } |
| 148 | |
| 149 | struct FunctionArgumentData<'a> { |
| 150 | name: String, |
| 151 | ty_override: Option<&'a str>, |
| 152 | desc: Option<&'a str>, |
| 153 | } |
| 154 | |
| 155 | struct Struct<'a> { |
| 156 | name: &'a str, |
| 157 | fields: Vec<StructField<'a>>, |
| 158 | comments: Vec<&'a str>, |
| 159 | is_inspectable: bool, |
| 160 | generate_typescript: bool, |
| 161 | } |
| 162 | |
| 163 | struct StructField<'a> { |
| 164 | name: &'a str, |
| 165 | readonly: bool, |
| 166 | comments: Vec<&'a str>, |
| 167 | generate_typescript: bool, |
| 168 | generate_jsdoc: bool, |
| 169 | } |
| 170 | |
| 171 | struct LocalModule<'a> { |
| 172 | identifier: &'a str, |
| 173 | contents: &'a str, |
| 174 | linked_module: bool, |
| 175 | } |
| 176 | } |
| 177 | }; // end of mac case |
| 178 | } // end of mac definition |
| 179 | |
| 180 | pub fn new_function(struct_name: &str) -> String { |
| 181 | let mut name: String = "__wbg_" .to_string(); |
| 182 | name.extend(iter:struct_name.chars().flat_map(|s: char| s.to_lowercase())); |
| 183 | name.push_str(string:"_new" ); |
| 184 | name |
| 185 | } |
| 186 | |
| 187 | pub fn free_function(struct_name: &str) -> String { |
| 188 | let mut name: String = "__wbg_" .to_string(); |
| 189 | name.extend(iter:struct_name.chars().flat_map(|s: char| s.to_lowercase())); |
| 190 | name.push_str(string:"_free" ); |
| 191 | name |
| 192 | } |
| 193 | |
| 194 | pub fn unwrap_function(struct_name: &str) -> String { |
| 195 | let mut name: String = "__wbg_" .to_string(); |
| 196 | name.extend(iter:struct_name.chars().flat_map(|s: char| s.to_lowercase())); |
| 197 | name.push_str(string:"_unwrap" ); |
| 198 | name |
| 199 | } |
| 200 | |
| 201 | pub fn free_function_export_name(function_name: &str) -> String { |
| 202 | function_name.to_string() |
| 203 | } |
| 204 | |
| 205 | pub fn struct_function_export_name(struct_: &str, f: &str) -> String { |
| 206 | let mut name: String = struct_impl Iterator |
| 207 | .chars() |
| 208 | .flat_map(|s: char| s.to_lowercase()) |
| 209 | .collect::<String>(); |
| 210 | name.push(ch:'_' ); |
| 211 | name.push_str(string:f); |
| 212 | name |
| 213 | } |
| 214 | |
| 215 | pub fn struct_field_get(struct_: &str, f: &str) -> String { |
| 216 | let mut name: String = String::from("__wbg_get_" ); |
| 217 | name.extend(iter:struct_.chars().flat_map(|s: char| s.to_lowercase())); |
| 218 | name.push(ch:'_' ); |
| 219 | name.push_str(string:f); |
| 220 | name |
| 221 | } |
| 222 | |
| 223 | pub fn struct_field_set(struct_: &str, f: &str) -> String { |
| 224 | let mut name: String = String::from("__wbg_set_" ); |
| 225 | name.extend(iter:struct_.chars().flat_map(|s: char| s.to_lowercase())); |
| 226 | name.push(ch:'_' ); |
| 227 | name.push_str(string:f); |
| 228 | name |
| 229 | } |
| 230 | |
| 231 | pub fn version() -> String { |
| 232 | let mut v: String = env!("CARGO_PKG_VERSION" ).to_string(); |
| 233 | if let Some(s: &str) = option_env!("WBG_VERSION" ) { |
| 234 | v.push_str(string:" (" ); |
| 235 | v.push_str(string:s); |
| 236 | v.push(ch:')' ); |
| 237 | } |
| 238 | v |
| 239 | } |
| 240 | |