Skip to content

Commit 6f4a409

Browse files
committed
feat: add support for generating Markdown documentation and update related commands
Signed-off-by: Gordon Smith <GordonJSmith@gmail.com>
1 parent 2772d4d commit 6f4a409

File tree

6 files changed

+91
-1
lines changed

6 files changed

+91
-1
lines changed

package.json

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,11 @@
176176
"title": "Generate MoonBit Bindings",
177177
"category": "WIT"
178178
},
179+
{
180+
"command": "wit-idl.generateBindingsMarkdown",
181+
"title": "Generate Markdown Documentation",
182+
"category": "WIT"
183+
},
179184
{
180185
"command": "wit-idl.extractWit",
181186
"title": "Extract WIT",
@@ -263,6 +268,9 @@
263268
},
264269
{
265270
"command": "wit-idl.generateBindingsMoonBit"
271+
},
272+
{
273+
"command": "wit-idl.generateBindingsMarkdown"
266274
}
267275
],
268276
"commandPalette": [
@@ -296,6 +304,10 @@
296304
"command": "wit-idl.generateBindingsMoonBit",
297305
"when": "editorLangId == wit || witIdl.isWasmComponent"
298306
},
307+
{
308+
"command": "wit-idl.generateBindingsMarkdown",
309+
"when": "editorLangId == wit || witIdl.isWasmComponent"
310+
},
299311
{
300312
"command": "wit-idl.extractWit",
301313
"when": "witIdl.isWasmComponent"

src/extension.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -669,6 +669,7 @@ export function activate(context: vscode.ExtensionContext) {
669669
const generateCSharpBindingsCommand = createGenerateBindingsCommand("csharp", "CSharp");
670670
const generateGoBindingsCommand = createGenerateBindingsCommand("go", "Go");
671671
const generateMoonBitBindingsCommand = createGenerateBindingsCommand("moonbit", "MoonBit");
672+
const generateMarkdownBindingsCommand = createGenerateBindingsCommand("markdown", "Markdown");
672673

673674
const onSaveListener = vscode.workspace.onDidSaveTextDocument(async (document) => {
674675
if (document.languageId === "wit") {
@@ -719,6 +720,7 @@ export function activate(context: vscode.ExtensionContext) {
719720
generateCSharpBindingsCommand,
720721
generateGoBindingsCommand,
721722
generateMoonBitBindingsCommand,
723+
generateMarkdownBindingsCommand,
722724
wasmToWitProvider,
723725
onSaveListener,
724726
onOpenListener,

wit-bindgen-wasm/Cargo.lock

Lines changed: 30 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

wit-bindgen-wasm/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ wit-bindgen-c = "0.49"
2525
wit-bindgen-rust = "0.49"
2626
wit-bindgen-csharp = "0.49"
2727
wit-bindgen-moonbit = "0.49"
28+
wit-bindgen-markdown = "0.49"
2829
wit-component = "0.243"
2930
anyhow = "1.0.100"
3031

wit-bindgen-wasm/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ main();
6262
- `has_world_definition(content: string): boolean` - Check for world definitions
6363
- `version(): string` - Get package version
6464
- `generate_bindings(content: string, language: string, world_name?: string): string` - Generate language bindings (returns JSON with file map)
65+
- Supported languages: `rust`, `c`, `csharp` (or `c#`), `go`, `moonbit`, `markdown` (or `md`)
6566

6667
### Binary Safety Contract
6768

wit-bindgen-wasm/src/lib.rs

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ use wit_bindgen_rust as rust;
1212
use wit_bindgen_c as c;
1313
use wit_bindgen_csharp as csharp;
1414
use wit_bindgen_moonbit as moonbit;
15+
use wit_bindgen_markdown as markdown;
1516

1617
// When the `wee_alloc` feature is enabled, use `wee_alloc` as the global
1718
// allocator.
@@ -229,11 +230,12 @@ impl WitBindgen {
229230
"csharp" | "c#" => self.generate_csharp_bindings(content, world_name),
230231
"go" => self.generate_go_bindings(content, world_name),
231232
"moonbit" => self.generate_moonbit_bindings(content, world_name),
233+
"markdown" | "md" => self.generate_markdown_bindings(content, world_name),
232234
_ => {
233235
let mut error_files = HashMap::new();
234236
error_files.insert(
235237
"error.txt".to_string(),
236-
format!("// Unsupported language: {}\n// Supported languages: rust, c, csharp, go, moonbit", language)
238+
format!("// Unsupported language: {}\n// Supported languages: rust, c, csharp, go, moonbit, markdown", language)
237239
);
238240
error_files
239241
},
@@ -411,6 +413,48 @@ impl WitBindgen {
411413
}
412414
}
413415

416+
/// Generate Markdown documentation using wit-bindgen-markdown library
417+
fn generate_markdown_bindings(&self, content: &str, world_name: Option<String>) -> HashMap<String, String> {
418+
match self.generate_markdown_with_wit_bindgen(content, world_name.as_deref()) {
419+
Ok(files) => files,
420+
Err(e) => {
421+
console_error(&format!("wit-bindgen-markdown failed: {}", e));
422+
let mut error_files = HashMap::new();
423+
error_files.insert(
424+
"error.txt".to_string(),
425+
format!("Markdown generation failed: {}", e)
426+
);
427+
error_files
428+
}
429+
}
430+
}
431+
432+
/// Generate Markdown documentation using wit-bindgen-markdown library
433+
fn generate_markdown_with_wit_bindgen(&self, content: &str, world_name: Option<&str>) -> Result<HashMap<String, String>, anyhow::Error> {
434+
let inline_path = Path::new("inline.wit");
435+
let mut resolve = Resolve::default();
436+
let package_id = resolve.push_str(inline_path, content)?;
437+
438+
let world_id = if let Some(world_name) = world_name {
439+
resolve.select_world(&[package_id], Some(world_name))?
440+
} else {
441+
resolve.select_world(&[package_id], None)?
442+
};
443+
444+
let opts = markdown::Opts::default();
445+
let mut generator = opts.build();
446+
let mut files = Files::default();
447+
448+
generator.generate(&resolve, world_id, &mut files)?;
449+
450+
let mut result = HashMap::new();
451+
for (filename, content) in files.iter() {
452+
result.insert(filename.to_string(), bytes_to_latin1_string(content));
453+
}
454+
455+
Ok(result)
456+
}
457+
414458
/// Generate MoonBit bindings using wit-bindgen-moonbit library
415459
fn generate_moonbit_with_wit_bindgen(&self, content: &str, world_name: Option<&str>) -> Result<HashMap<String, String>, anyhow::Error> {
416460
let inline_path = Path::new("inline.wit");

0 commit comments

Comments
 (0)