Skip to content

Commit 65b0f49

Browse files
authored
feat: add support for generating Markdown documentation and update re… (#104)
…lated commands Signed-off-by: Gordon Smith <GordonJSmith@gmail.com>
1 parent 84e63a6 commit 65b0f49

File tree

6 files changed

+95
-2
lines changed

6 files changed

+95
-2
lines changed

package.json

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,11 @@
181181
"title": "Generate MoonBit Bindings",
182182
"category": "WIT"
183183
},
184+
{
185+
"command": "wit-idl.generateBindingsMarkdown",
186+
"title": "Generate Markdown Documentation",
187+
"category": "WIT"
188+
},
184189
{
185190
"command": "wit-idl.extractWit",
186191
"title": "Extract WIT",
@@ -271,6 +276,9 @@
271276
},
272277
{
273278
"command": "wit-idl.generateBindingsMoonBit"
279+
},
280+
{
281+
"command": "wit-idl.generateBindingsMarkdown"
274282
}
275283
],
276284
"commandPalette": [
@@ -308,6 +316,10 @@
308316
"command": "wit-idl.generateBindingsMoonBit",
309317
"when": "editorLangId == wit || witIdl.isWasmComponent"
310318
},
319+
{
320+
"command": "wit-idl.generateBindingsMarkdown",
321+
"when": "editorLangId == wit || witIdl.isWasmComponent"
322+
},
311323
{
312324
"command": "wit-idl.extractWit",
313325
"when": "witIdl.isWasmComponent"

src/extension.ts

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

674675
const onSaveListener = vscode.workspace.onDidSaveTextDocument(async (document) => {
675676
if (document.languageId === "wit") {
@@ -721,6 +722,7 @@ export function activate(context: vscode.ExtensionContext) {
721722
generateCSharpBindingsCommand,
722723
generateGoBindingsCommand,
723724
generateMoonBitBindingsCommand,
725+
generateMarkdownBindingsCommand,
724726
wasmToWitProvider,
725727
onSaveListener,
726728
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
@@ -26,6 +26,7 @@ wit-bindgen-cpp = "0.49"
2626
wit-bindgen-rust = "0.49"
2727
wit-bindgen-csharp = "0.49"
2828
wit-bindgen-moonbit = "0.49"
29+
wit-bindgen-markdown = "0.49"
2930
wit-component = "0.243"
3031
anyhow = "1.0.100"
3132

wit-bindgen-wasm/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +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`, `cpp` (or `c++`), `csharp` (or `c#`), `go`, `moonbit`
65+
- Supported languages: `rust`, `c`, `cpp` (or `c++`), `csharp` (or `c#`), `go`, `moonbit`, `markdown` (or `md`)
6666

6767
### Binary Safety Contract
6868

wit-bindgen-wasm/src/lib.rs

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ use wit_bindgen_c as c;
1313
use wit_bindgen_cpp as cpp;
1414
use wit_bindgen_csharp as csharp;
1515
use wit_bindgen_moonbit as moonbit;
16+
use wit_bindgen_markdown as markdown;
1617

1718
// When the `wee_alloc` feature is enabled, use `wee_alloc` as the global
1819
// allocator.
@@ -231,11 +232,12 @@ impl WitBindgen {
231232
"csharp" | "c#" => self.generate_csharp_bindings(content, world_name),
232233
"go" => self.generate_go_bindings(content, world_name),
233234
"moonbit" => self.generate_moonbit_bindings(content, world_name),
235+
"markdown" | "md" => self.generate_markdown_bindings(content, world_name),
234236
_ => {
235237
let mut error_files = HashMap::new();
236238
error_files.insert(
237239
"error.txt".to_string(),
238-
format!("// Unsupported language: {}\n// Supported languages: rust, c, cpp, csharp, go, moonbit", language)
240+
format!("// Unsupported language: {}\n// Supported languages: rust, c, cpp, csharp, go, moonbit, markdown", language)
239241
);
240242
error_files
241243
},
@@ -456,6 +458,52 @@ impl WitBindgen {
456458
}
457459
}
458460

461+
/// Generate Markdown documentation using wit-bindgen-markdown library
462+
fn generate_markdown_bindings(&self, content: &str, world_name: Option<String>) -> HashMap<String, String> {
463+
match self.generate_markdown_with_wit_bindgen(content, world_name.as_deref()) {
464+
Ok(files) => files,
465+
Err(e) => {
466+
console_error(&format!("wit-bindgen-markdown failed: {}", e));
467+
let mut error_files = HashMap::new();
468+
error_files.insert(
469+
"error.txt".to_string(),
470+
format!("Markdown generation failed: {}", e)
471+
);
472+
error_files
473+
}
474+
}
475+
}
476+
477+
/// Internal implementation for generating Markdown documentation.
478+
///
479+
/// This function performs the actual Markdown generation using the wit-bindgen-markdown library.
480+
/// It returns a `Result` containing a map of generated files, or an error if generation fails.
481+
fn generate_markdown_with_wit_bindgen(&self, content: &str, world_name: Option<&str>) -> Result<HashMap<String, String>, anyhow::Error> {
482+
let inline_path = Path::new("inline.wit");
483+
let mut resolve = Resolve::default();
484+
let package_id = resolve.push_str(inline_path, content)
485+
.with_context(|| "Failed to parse WIT content for Markdown generation")?;
486+
487+
let world_id = if let Some(world_name) = world_name {
488+
resolve.select_world(&[package_id], Some(world_name))?
489+
} else {
490+
resolve.select_world(&[package_id], None)?
491+
};
492+
493+
let opts = markdown::Opts::default();
494+
let mut generator = opts.build();
495+
let mut files = Files::default();
496+
497+
generator.generate(&resolve, world_id, &mut files)?;
498+
499+
let mut result = HashMap::new();
500+
for (filename, content) in files.iter() {
501+
result.insert(filename.to_string(), bytes_to_latin1_string(content));
502+
}
503+
504+
Ok(result)
505+
}
506+
459507
/// Generate MoonBit bindings using wit-bindgen-moonbit library
460508
fn generate_moonbit_with_wit_bindgen(&self, content: &str, world_name: Option<&str>) -> Result<HashMap<String, String>, anyhow::Error> {
461509
let inline_path = Path::new("inline.wit");

0 commit comments

Comments
 (0)