From d4c646fa3cf6d8ca060aa6c7806c0543d0011de8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dirk=20B=C3=A4umer?= Date: Wed, 28 Aug 2024 13:10:25 +0200 Subject: [PATCH] Move wasm samples to latest wasm-component-model (#1092) --- wasm-component-model-async/package-lock.json | 8 ++--- wasm-component-model-async/package.json | 2 +- .../package-lock.json | 8 ++--- wasm-component-model-resource/package.json | 2 +- wasm-component-model/package-lock.json | 8 ++--- wasm-component-model/package.json | 2 +- wasm-component-model/src/calculator.ts | 29 ++++++++++++++++--- wasm-component-model/src/extension.ts | 7 +++++ wasm-component-model/src/lib.rs | 12 ++++---- wasm-component-model/wit/calculator.wit | 10 +++++-- 10 files changed, 61 insertions(+), 27 deletions(-) diff --git a/wasm-component-model-async/package-lock.json b/wasm-component-model-async/package-lock.json index 9951869b..2bcee52d 100644 --- a/wasm-component-model-async/package-lock.json +++ b/wasm-component-model-async/package-lock.json @@ -9,7 +9,7 @@ "version": "1.0.0", "license": "MIT", "dependencies": { - "@vscode/wasm-component-model": "0.1.0-pre.16" + "@vscode/wasm-component-model": "0.1.0-pre.17" }, "devDependencies": { "@types/node": "^18.14.6", @@ -794,9 +794,9 @@ "dev": true }, "node_modules/@vscode/wasm-component-model": { - "version": "0.1.0-pre.16", - "resolved": "https://registry.npmjs.org/@vscode/wasm-component-model/-/wasm-component-model-0.1.0-pre.16.tgz", - "integrity": "sha512-fe4J7Nz7PKlLuZ3z8zQNp7n/6w+RwDW2kCyHI0dRGQ0Htjz0al3guEynn+o/FywCamywwRUoQO9wIhRJBwvj/w==", + "version": "0.1.0-pre.17", + "resolved": "https://registry.npmjs.org/@vscode/wasm-component-model/-/wasm-component-model-0.1.0-pre.17.tgz", + "integrity": "sha512-/oKAi/MNOJskxtsvhKVK/6k+xgqrM/76nYs9zdmnWEuRzoCCmnEpShSRgLfRJrBsMUiVl6vwfJTsj07iqrYNaA==", "dependencies": { "semver": "^7.6.0", "uuid": "^9.0.1", diff --git a/wasm-component-model-async/package.json b/wasm-component-model-async/package.json index f6f6c8f0..a9e0f8b0 100644 --- a/wasm-component-model-async/package.json +++ b/wasm-component-model-async/package.json @@ -29,7 +29,7 @@ ] }, "dependencies": { - "@vscode/wasm-component-model": "0.1.0-pre.16" + "@vscode/wasm-component-model": "0.1.0-pre.17" }, "devDependencies": { "@types/vscode": "1.89.0", diff --git a/wasm-component-model-resource/package-lock.json b/wasm-component-model-resource/package-lock.json index 5f02a8c4..d981290f 100644 --- a/wasm-component-model-resource/package-lock.json +++ b/wasm-component-model-resource/package-lock.json @@ -9,7 +9,7 @@ "version": "1.0.0", "license": "MIT", "dependencies": { - "@vscode/wasm-component-model": "0.1.0-pre.16" + "@vscode/wasm-component-model": "0.1.0-pre.17" }, "devDependencies": { "@types/node": "^18.14.6", @@ -794,9 +794,9 @@ "dev": true }, "node_modules/@vscode/wasm-component-model": { - "version": "0.1.0-pre.16", - "resolved": "https://registry.npmjs.org/@vscode/wasm-component-model/-/wasm-component-model-0.1.0-pre.16.tgz", - "integrity": "sha512-fe4J7Nz7PKlLuZ3z8zQNp7n/6w+RwDW2kCyHI0dRGQ0Htjz0al3guEynn+o/FywCamywwRUoQO9wIhRJBwvj/w==", + "version": "0.1.0-pre.17", + "resolved": "https://registry.npmjs.org/@vscode/wasm-component-model/-/wasm-component-model-0.1.0-pre.17.tgz", + "integrity": "sha512-/oKAi/MNOJskxtsvhKVK/6k+xgqrM/76nYs9zdmnWEuRzoCCmnEpShSRgLfRJrBsMUiVl6vwfJTsj07iqrYNaA==", "dependencies": { "semver": "^7.6.0", "uuid": "^9.0.1", diff --git a/wasm-component-model-resource/package.json b/wasm-component-model-resource/package.json index 3027d58c..1b29e543 100644 --- a/wasm-component-model-resource/package.json +++ b/wasm-component-model-resource/package.json @@ -29,7 +29,7 @@ ] }, "dependencies": { - "@vscode/wasm-component-model": "0.1.0-pre.16" + "@vscode/wasm-component-model": "0.1.0-pre.17" }, "devDependencies": { "@types/vscode": "1.88.0", diff --git a/wasm-component-model/package-lock.json b/wasm-component-model/package-lock.json index 0d8740c9..d06d78ab 100644 --- a/wasm-component-model/package-lock.json +++ b/wasm-component-model/package-lock.json @@ -9,7 +9,7 @@ "version": "1.0.0", "license": "MIT", "dependencies": { - "@vscode/wasm-component-model": "0.1.0-pre.16" + "@vscode/wasm-component-model": "0.1.0-pre.17" }, "devDependencies": { "@types/node": "^18.14.6", @@ -794,9 +794,9 @@ "dev": true }, "node_modules/@vscode/wasm-component-model": { - "version": "0.1.0-pre.16", - "resolved": "https://registry.npmjs.org/@vscode/wasm-component-model/-/wasm-component-model-0.1.0-pre.16.tgz", - "integrity": "sha512-fe4J7Nz7PKlLuZ3z8zQNp7n/6w+RwDW2kCyHI0dRGQ0Htjz0al3guEynn+o/FywCamywwRUoQO9wIhRJBwvj/w==", + "version": "0.1.0-pre.17", + "resolved": "https://registry.npmjs.org/@vscode/wasm-component-model/-/wasm-component-model-0.1.0-pre.17.tgz", + "integrity": "sha512-/oKAi/MNOJskxtsvhKVK/6k+xgqrM/76nYs9zdmnWEuRzoCCmnEpShSRgLfRJrBsMUiVl6vwfJTsj07iqrYNaA==", "dependencies": { "semver": "^7.6.0", "uuid": "^9.0.1", diff --git a/wasm-component-model/package.json b/wasm-component-model/package.json index 93713a1b..54a62520 100644 --- a/wasm-component-model/package.json +++ b/wasm-component-model/package.json @@ -29,7 +29,7 @@ ] }, "dependencies": { - "@vscode/wasm-component-model": "0.1.0-pre.16" + "@vscode/wasm-component-model": "0.1.0-pre.17" }, "devDependencies": { "@types/vscode": "1.88.0", diff --git a/wasm-component-model/src/calculator.ts b/wasm-component-model/src/calculator.ts index d66b5867..f87c9585 100644 --- a/wasm-component-model/src/calculator.ts +++ b/wasm-component-model/src/calculator.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ /* eslint-disable @typescript-eslint/ban-types */ import * as $wcm from '@vscode/wasm-component-model'; -import type { u32, i32 } from '@vscode/wasm-component-model'; +import type { u32, i32, ptr, result } from '@vscode/wasm-component-model'; export namespace Types { export type Operands = { @@ -71,12 +71,27 @@ export namespace Types { } } export type Operation = Operation.Add | Operation.Sub | Operation.Mul | Operation.Div; + + export enum ErrorCode { + none = 'none', + overflow = 'overflow', + divideByZero = 'divideByZero' + } + export namespace ErrorCode { + export class Error_ extends $wcm.ResultError { + constructor(cause: ErrorCode) { + super(`ErrorCode: ${cause}`, cause); + } + } + } } export type Types = { }; export namespace calculator { export type Operation = Types.Operation; export const Operation = Types.Operation; + export type ErrorCode = Types.ErrorCode; + export const ErrorCode = Types.ErrorCode; export type Imports = { log: (msg: string) => void; }; @@ -87,6 +102,9 @@ export namespace calculator { export type Promisify = $wcm.$imports.Promisify; } export type Exports = { + /** + * @throws ErrorCode.Error_ + */ calc: (o: Operation) => u32; }; export namespace Exports { @@ -103,19 +121,22 @@ export namespace Types.$ { ['right', $wcm.u32], ]); export const Operation = new $wcm.VariantType([['add', Operands], ['sub', Operands], ['mul', Operands], ['div', Operands]], Types.Operation._ctor); + export const ErrorCode = new $wcm.EnumType(['none', 'overflow', 'divideByZero']); } export namespace Types._ { export const id = 'vscode:example/types' as const; export const witName = 'types' as const; export const types: Map = new Map([ ['Operands', $.Operands], - ['Operation', $.Operation] + ['Operation', $.Operation], + ['ErrorCode', $.ErrorCode] ]); export type WasmInterface = { }; } export namespace calculator.$ { export const Operation = Types.$.Operation; + export const ErrorCode = Types.$.ErrorCode; export namespace imports { export const log = new $wcm.FunctionType('log',[ ['msg', $wcm.wstring], @@ -124,7 +145,7 @@ export namespace calculator.$ { export namespace exports { export const calc = new $wcm.FunctionType('calc',[ ['o', Operation], - ], $wcm.u32); + ], new $wcm.ResultType($wcm.u32, ErrorCode, Types.ErrorCode.Error_)); } } export namespace calculator._ { @@ -159,7 +180,7 @@ export namespace calculator._ { } } export type Exports = { - 'calc': (o_Operation_case: i32, o_Operation_0: i32, o_Operation_1: i32) => i32; + 'calc': (o_Operation_case: i32, o_Operation_0: i32, o_Operation_1: i32, result: ptr>) => void; }; export function bind(service: calculator.Imports, code: $wcm.Code, context?: $wcm.ComponentModelContext): Promise; export function bind(service: calculator.Imports.Promisified, code: $wcm.Code, port: $wcm.RAL.ConnectionPort, context?: $wcm.ComponentModelContext): Promise; diff --git a/wasm-component-model/src/extension.ts b/wasm-component-model/src/extension.ts index f114f4af..4e0d7bba 100644 --- a/wasm-component-model/src/extension.ts +++ b/wasm-component-model/src/extension.ts @@ -54,5 +54,12 @@ export async function activate(context: vscode.ExtensionContext): Promise channel.appendLine(`Mul ${api.calc(mul)}`); const div = Types.Operation.Div({ left: 10, right: 2 }); channel.appendLine(`Div ${api.calc(div)}`); + try { + channel.appendLine(`Divide by Zero ${api.calc(Types.Operation.Div({ left: 10, right: 0 }))}`); + } catch (error) { + if (error instanceof Types.ErrorCode.Error_ && error.cause === Types.ErrorCode.divideByZero) { + channel.appendLine('Division by zero not allowed'); + } + } })); } \ No newline at end of file diff --git a/wasm-component-model/src/lib.rs b/wasm-component-model/src/lib.rs index b343c8f9..ffc96e9f 100644 --- a/wasm-component-model/src/lib.rs +++ b/wasm-component-model/src/lib.rs @@ -9,13 +9,13 @@ struct Calculator; impl Guest for Calculator { - fn calc(op: Operation) -> u32 { + fn calc(op: Operation) -> Result { log(&format!("Starting calculation: {:?}", op)); - let result = match op { - Operation::Add(operands) => operands.left + operands.right, - Operation::Sub(operands) => operands.left - operands.right, - Operation::Mul(operands) => operands.left * operands.right, - Operation::Div(operands) => operands.left / operands.right, + let result: Result = match op { + Operation::Add(operands) => Result::Ok(operands.left + operands.right), + Operation::Sub(operands) => Result::Ok(operands.left - operands.right), + Operation::Mul(operands) => Result::Ok(operands.left * operands.right), + Operation::Div(operands) => if operands.right == 0 { Result::Err(ErrorCode::DivideByZero) } else { Result::Ok(operands.left / operands.right) } }; log(&format!("Finished calculation: {:?}", op)); result diff --git a/wasm-component-model/wit/calculator.wit b/wasm-component-model/wit/calculator.wit index 569c3cf5..25300df8 100644 --- a/wasm-component-model/wit/calculator.wit +++ b/wasm-component-model/wit/calculator.wit @@ -13,10 +13,16 @@ interface types { mul(operands), div(operands) } + + enum error-code { + none, + overflow, + divide-by-zero + } } world calculator { - use types.{ operation }; + use types.{ operation, error-code }; import log: func(msg: string); - export calc: func(o: operation) -> u32; + export calc: func(o: operation) -> result; } \ No newline at end of file