Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,11 @@
"title": "Generate MoonBit Bindings",
"category": "WIT"
},
{
"command": "wit-idl.generateBindingsMarkdown",
"title": "Generate Markdown Documentation",
"category": "WIT"
},
{
"command": "wit-idl.extractWit",
"title": "Extract WIT",
Expand Down Expand Up @@ -271,6 +276,9 @@
},
{
"command": "wit-idl.generateBindingsMoonBit"
},
{
"command": "wit-idl.generateBindingsMarkdown"
}
],
"commandPalette": [
Expand Down Expand Up @@ -308,6 +316,10 @@
"command": "wit-idl.generateBindingsMoonBit",
"when": "editorLangId == wit || witIdl.isWasmComponent"
},
{
"command": "wit-idl.generateBindingsMarkdown",
"when": "editorLangId == wit || witIdl.isWasmComponent"
},
{
"command": "wit-idl.extractWit",
"when": "witIdl.isWasmComponent"
Expand Down
2 changes: 2 additions & 0 deletions src/extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -670,6 +670,7 @@ export function activate(context: vscode.ExtensionContext) {
const generateCSharpBindingsCommand = createGenerateBindingsCommand("csharp", "CSharp");
const generateGoBindingsCommand = createGenerateBindingsCommand("go", "Go");
const generateMoonBitBindingsCommand = createGenerateBindingsCommand("moonbit", "MoonBit");
const generateMarkdownBindingsCommand = createGenerateBindingsCommand("markdown", "Markdown");

const onSaveListener = vscode.workspace.onDidSaveTextDocument(async (document) => {
if (document.languageId === "wit") {
Expand Down Expand Up @@ -721,6 +722,7 @@ export function activate(context: vscode.ExtensionContext) {
generateCSharpBindingsCommand,
generateGoBindingsCommand,
generateMoonBitBindingsCommand,
generateMarkdownBindingsCommand,
wasmToWitProvider,
onSaveListener,
onOpenListener,
Expand Down
30 changes: 30 additions & 0 deletions wit-bindgen-wasm/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions wit-bindgen-wasm/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ wit-bindgen-cpp = "0.49"
wit-bindgen-rust = "0.49"
wit-bindgen-csharp = "0.49"
wit-bindgen-moonbit = "0.49"
wit-bindgen-markdown = "0.49"
wit-component = "0.243"
anyhow = "1.0.100"

Expand Down
2 changes: 1 addition & 1 deletion wit-bindgen-wasm/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ main();
- `has_world_definition(content: string): boolean` - Check for world definitions
- `version(): string` - Get package version
- `generate_bindings(content: string, language: string, world_name?: string): string` - Generate language bindings (returns JSON with file map)
- Supported languages: `rust`, `c`, `cpp` (or `c++`), `csharp` (or `c#`), `go`, `moonbit`
- Supported languages: `rust`, `c`, `cpp` (or `c++`), `csharp` (or `c#`), `go`, `moonbit`, `markdown` (or `md`)

### Binary Safety Contract

Expand Down
50 changes: 49 additions & 1 deletion wit-bindgen-wasm/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ use wit_bindgen_c as c;
use wit_bindgen_cpp as cpp;
use wit_bindgen_csharp as csharp;
use wit_bindgen_moonbit as moonbit;
use wit_bindgen_markdown as markdown;

// When the `wee_alloc` feature is enabled, use `wee_alloc` as the global
// allocator.
Expand Down Expand Up @@ -231,11 +232,12 @@ impl WitBindgen {
"csharp" | "c#" => self.generate_csharp_bindings(content, world_name),
"go" => self.generate_go_bindings(content, world_name),
"moonbit" => self.generate_moonbit_bindings(content, world_name),
"markdown" | "md" => self.generate_markdown_bindings(content, world_name),
_ => {
let mut error_files = HashMap::new();
error_files.insert(
"error.txt".to_string(),
format!("// Unsupported language: {}\n// Supported languages: rust, c, cpp, csharp, go, moonbit", language)
format!("// Unsupported language: {}\n// Supported languages: rust, c, cpp, csharp, go, moonbit, markdown", language)
);
error_files
},
Expand Down Expand Up @@ -456,6 +458,52 @@ impl WitBindgen {
}
}

/// Generate Markdown documentation using wit-bindgen-markdown library
fn generate_markdown_bindings(&self, content: &str, world_name: Option<String>) -> HashMap<String, String> {
match self.generate_markdown_with_wit_bindgen(content, world_name.as_deref()) {
Ok(files) => files,
Err(e) => {
console_error(&format!("wit-bindgen-markdown failed: {}", e));
let mut error_files = HashMap::new();
error_files.insert(
"error.txt".to_string(),
format!("Markdown generation failed: {}", e)
);
error_files
}
}
}

/// Internal implementation for generating Markdown documentation.
///
/// This function performs the actual Markdown generation using the wit-bindgen-markdown library.
/// It returns a `Result` containing a map of generated files, or an error if generation fails.
fn generate_markdown_with_wit_bindgen(&self, content: &str, world_name: Option<&str>) -> Result<HashMap<String, String>, anyhow::Error> {
let inline_path = Path::new("inline.wit");
let mut resolve = Resolve::default();
let package_id = resolve.push_str(inline_path, content)
.with_context(|| "Failed to parse WIT content for Markdown generation")?;

let world_id = if let Some(world_name) = world_name {
resolve.select_world(&[package_id], Some(world_name))?
} else {
resolve.select_world(&[package_id], None)?
};

let opts = markdown::Opts::default();
let mut generator = opts.build();
let mut files = Files::default();

generator.generate(&resolve, world_id, &mut files)?;

let mut result = HashMap::new();
for (filename, content) in files.iter() {
result.insert(filename.to_string(), bytes_to_latin1_string(content));
}

Ok(result)
}

/// Generate MoonBit bindings using wit-bindgen-moonbit library
fn generate_moonbit_with_wit_bindgen(&self, content: &str, world_name: Option<&str>) -> Result<HashMap<String, String>, anyhow::Error> {
let inline_path = Path::new("inline.wit");
Expand Down
Loading