From 89219f1780a976b6d1ac4dca1baac9d2d556d567 Mon Sep 17 00:00:00 2001 From: ramil Date: Tue, 26 Jul 2022 01:55:01 +0300 Subject: [PATCH 01/65] codegen for wasm-go --- .../src/bindings/golang/wasm-go/baseTypes.ts | 18 + .../src/bindings/golang/wasm-go/functions.ts | 311 ++++++++++++++++++ .../bind/src/bindings/golang/wasm-go/index.ts | 177 ++++++++++ .../bindings/golang/wasm-go/reservedWords.ts | 201 +++++++++++ .../golang/wasm-go/templates/main-go.mustache | 22 ++ .../module-type/serialization-go.mustache | 69 ++++ .../templates/object-type/main-go.mustache | 18 + .../object-type/serialization-go.mustache | 22 ++ packages/schema/bind/src/bindings/index.ts | 5 +- packages/schema/bind/src/types.ts | 2 +- .../cases/bind/sanity/output/wasm-go/main.go | 24 ++ 11 files changed, 867 insertions(+), 2 deletions(-) create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/baseTypes.ts create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/functions.ts create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/index.ts create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/reservedWords.ts create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/main-go.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/module-type/serialization-go.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/main-go.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/serialization-go.mustache create mode 100644 packages/test-cases/cases/bind/sanity/output/wasm-go/main.go diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/baseTypes.ts b/packages/schema/bind/src/bindings/golang/wasm-go/baseTypes.ts new file mode 100644 index 0000000000..e667344d20 --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/baseTypes.ts @@ -0,0 +1,18 @@ +const baseTypes = { + u8: "u8", + u16: "u16", + u32: "u32", + i8: "i8", + i16: "i16", + i32: "i32", + string: "string", + bool: "bool", +}; + +export type BaseTypes = typeof baseTypes; + +export type BaseType = keyof BaseTypes; + +export function isBaseType(type: string): type is BaseType { + return type in baseTypes; +} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/functions.ts b/packages/schema/bind/src/bindings/golang/wasm-go/functions.ts new file mode 100644 index 0000000000..ab3b954496 --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/functions.ts @@ -0,0 +1,311 @@ +import { isBaseType } from "./baseTypes"; +import { reservedWordsAS } from "./reservedWords"; +import { MustacheFn } from "../../types"; + +export const handleKeywords: MustacheFn = () => { + return (text: string, render: (template: string) => string): string => { + const rendered: string = render(text); + if (reservedWordsAS.has(rendered)) { + return "m_" + rendered; + } + return rendered; + }; +}; + +export const toMsgPack: MustacheFn = () => { + return (value: string, render: (template: string) => string) => { + let type = render(value); + + let modifier = ""; + if (type[type.length - 1] === "!") { + type = type.substring(0, type.length - 1); + } else { + modifier = "Optional"; + } + + if (type[0] === "[") { + return modifier + "Array"; + } + if (type.startsWith("Map<")) { + return modifier + "ExtGenericMap"; + } + switch (type) { + case "Int": + return modifier + "Int32"; + case "UInt": + return modifier + "UInt32"; + case "Boolean": + return modifier + "Bool"; + default: + return modifier + type; + } + }; +}; + +export const toWasmInit: MustacheFn = () => { + return (value: string, render: (template: string) => string) => { + let type = render(value); + + if (type[type.length - 1] === "!") { + type = type.substring(0, type.length - 1); + } else { + const nullType = toWasm()(value, render); + const optional = "Option"; + const nullOptional = "| null"; + + if (nullType.endsWith(nullOptional)) { + return "null"; + } else if (nullType.startsWith(optional)) { + type = nullType.substring(6); + return `Option.None${type}()`; + } + } + + if (type[0] === "[") { + return "[]"; + } + + if (type.startsWith("Map<")) { + const openBracketIdx = type.indexOf("<"); + const closeBracketIdx = type.lastIndexOf(">"); + const [key, value] = type + .substring(openBracketIdx + 1, closeBracketIdx) + .split(",") + .map((x) => toWasm()(x.trim(), render)); + return `new Map<${key}, ${value}>()`; + } + + switch (type) { + case "Int": + case "Int8": + case "Int16": + case "Int32": + case "UInt": + case "UInt8": + case "UInt16": + case "UInt32": + return "0"; + case "String": + return `""`; + case "Boolean": + return "false"; + case "Bytes": + return `new ArrayBuffer(0)`; + case "BigInt": + return `BigInt.fromUInt16(0)`; + case "BigNumber": + return `new BigNumber(BigInt.fromUInt16(0), 0, 0)`; + case "JSON": + return `JSON.Value.Null()`; + default: + if (type.includes("Enum_")) { + return "0"; + } else { + return `new Types.${type}()`; + } + } + }; +}; + +export const toWasm: MustacheFn = () => { + return (value: string, render: (template: string) => string) => { + let type = render(value); + let isEnum = false; + + let optional = false; + if (type[type.length - 1] === "!") { + type = type.substring(0, type.length - 1); + } else { + optional = true; + } + + if (type[0] === "[") { + return toWasmArray(type, optional); + } + + if (type.startsWith("Map<")) { + return toWasmMap(type, optional); + } + + switch (type) { + case "Int": + type = "i32"; + break; + case "Int8": + type = "i8"; + break; + case "Int16": + type = "i16"; + break; + case "Int32": + type = "i32"; + break; + case "UInt": + case "UInt32": + type = "u32"; + break; + case "UInt8": + type = "u8"; + break; + case "UInt16": + type = "u16"; + break; + case "String": + type = "string"; + break; + case "Boolean": + type = "bool"; + break; + case "Bytes": + type = "ArrayBuffer"; + break; + case "BigInt": + type = "BigInt"; + break; + case "BigNumber": + type = "BigNumber"; + break; + case "JSON": + type = "JSON.Value"; + break; + default: + if (type.includes("Enum_")) { + type = `Types.${type.replace("Enum_", "")}`; + isEnum = true; + } else { + type = `Types.${type}`; + } + } + + return applyOptional(type, optional, isEnum); + }; +}; + +const toWasmArray = (type: string, optional: boolean): string => { + const result = type.match(/(\[)([[\]A-Za-z0-9_.!]+)(\])/); + + if (!result || result.length !== 4) { + throw Error(`Invalid Array: ${type}`); + } + + const wasmType = toWasm()(result[2], (str) => str); + return applyOptional("Array<" + wasmType + ">", optional, false); +}; + +const toWasmMap = (type: string, optional: boolean): string => { + const firstOpenBracketIdx = type.indexOf("<"); + const lastCloseBracketIdx = type.lastIndexOf(">"); + + if (!(firstOpenBracketIdx !== -1 && lastCloseBracketIdx !== -1)) { + throw new Error(`Invalid Map: ${type}`); + } + + const keyValTypes = type + .substring(firstOpenBracketIdx + 1, lastCloseBracketIdx) + .split(",") + .map((x) => x.trim()); + + if (keyValTypes.length !== 2 || !keyValTypes[0] || !keyValTypes[1]) { + throw new Error(`Invalid Map: ${type}`); + } + + const keyType = toWasm()(keyValTypes[0], (str) => str); + const valType = toWasm()(keyValTypes[1], (str) => str); + + return applyOptional(`Map<${keyType}, ${valType}>`, optional, false); +}; + +const applyOptional = ( + type: string, + optional: boolean, + isEnum: boolean +): string => { + if (optional) { + if ( + type.indexOf("Array") === 0 || + type.indexOf("string") === 0 || + (!isEnum && !isBaseType(type)) + ) { + return `${type} | null`; + } else { + return `Option<${type}>`; + } + } else { + return type; + } +}; + +function replaceAt(str: string, index: number, replacement: string): string { + return ( + str.substr(0, index) + replacement + str.substr(index + replacement.length) + ); +} + +function insertAt(str: string, index: number, insert: string): string { + return str.substr(0, index) + insert + str.substr(index); +} + +function removeAt(str: string, index: number): string { + return str.substr(0, index) + str.substr(index + 1); +} + +export const toLower: MustacheFn = () => { + return (value: string, render: (template: string) => string) => { + let type = render(value); + + for (let i = 0; i < type.length; ++i) { + const char = type.charAt(i); + const lower = char.toLowerCase(); + + if (char !== lower) { + // Replace the uppercase char w/ the lowercase version + type = replaceAt(type, i, lower); + + // if (i !== 0 && type[i - 1] !== "_") { + // // Make sure all lowercase conversions have an underscore before them + // type = insertAt(type, i, "_"); + // } + } + } + + return type; + }; +}; + +export const toFirstLower: MustacheFn = () => { + return (value: string, render: (template: string) => string) => { + let type = render(value); + + // First character must always be upper case + const firstChar = type.charAt(0); + const firstLower = firstChar.toLowerCase(); + type = replaceAt(type, 0, firstLower); + + return type; + }; +}; + +export const toUpper: MustacheFn = () => { + return (value: string, render: (template: string) => string) => { + let type = render(value); + + // First character must always be upper case + const firstChar = type.charAt(0); + const firstUpper = firstChar.toUpperCase(); + type = replaceAt(type, 0, firstUpper); + + // Look for any underscores, remove them if they exist, and make next letter uppercase + // for (let i = 0; i < type.length; ++i) { + // const char = type.charAt(i); + // + // if (char === "_") { + // const nextChar = type.charAt(i + 1); + // const nextCharUpper = nextChar.toUpperCase(); + // type = replaceAt(type, i + 1, nextCharUpper); + // type = removeAt(type, i); + // } + // } + + return type; + }; +}; diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/index.ts b/packages/schema/bind/src/bindings/golang/wasm-go/index.ts new file mode 100644 index 0000000000..fdc646f0e0 --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/index.ts @@ -0,0 +1,177 @@ +import * as Functions from "./functions"; +import { GenerateBindingFn } from "../.."; +import { renderTemplates, loadSubTemplates } from "../../utils/templates"; +import { BindOptions, BindOutput } from "../../.."; + +import { + Abi, + transformAbi, + addFirstLast, + extendType, + toPrefixedGraphQLType, +} from "@polywrap/schema-parse"; +import { OutputEntry, readDirectorySync } from "@polywrap/os-js"; +import path from "path"; + +const templatesDir = readDirectorySync(path.join(__dirname, "./templates")); +const subTemplates = loadSubTemplates(templatesDir.entries); +const templatePath = (subpath: string) => + path.join(__dirname, "./templates", subpath); + +export const generateBinding: GenerateBindingFn = ( + options: BindOptions +): BindOutput => { + const result: BindOutput = { + output: { + entries: [], + }, + outputDirAbs: options.outputDirAbs, + }; + const output = result.output; + const abi = applyTransforms(options.abi); + + // Generate object type folders + for (const objectType of abi.objectTypes) { + output.entries.push({ + type: "Directory", + name: objectType.type, + data: renderTemplates( + templatePath("object-type"), + objectType, + subTemplates + ), + }); + } + + // Generate imported folder + const importEntries: OutputEntry[] = []; + + // Generate imported module type folders + // for (const importedModuleType of abi.importedModuleTypes) { + // importEntries.push({ + // type: "Directory", + // name: importedModuleType.type, + // data: renderTemplates( + // templatePath("imported/module-type"), + // importedModuleType, + // subTemplates + // ), + // }); + // } + // + // // Generate imported env type folders + // for (const importedEnvType of abi.importedEnvTypes) { + // importEntries.push({ + // type: "Directory", + // name: importedEnvType.type, + // data: renderTemplates( + // templatePath("imported/env-type"), + // importedEnvType, + // subTemplates + // ), + // }); + // } + // + // // Generate imported enum type folders + // for (const importedEnumType of abi.importedEnumTypes) { + // importEntries.push({ + // type: "Directory", + // name: importedEnumType.type, + // data: renderTemplates( + // templatePath("imported/enum-type"), + // importedEnumType, + // subTemplates + // ), + // }); + // } + // + // // Generate imported object type folders + // for (const importedObectType of abi.importedObjectTypes) { + // importEntries.push({ + // type: "Directory", + // name: importedObectType.type, + // data: renderTemplates( + // templatePath("imported/object-type"), + // importedObectType, + // subTemplates + // ), + // }); + // } + // + // if (importEntries.length) { + // output.entries.push({ + // type: "Directory", + // name: "imported", + // data: [ + // ...importEntries, + // ...renderTemplates(templatePath("imported"), abi, subTemplates), + // ], + // }); + // } + // + // // Generate interface type folders + // for (const interfaceType of abi.interfaceTypes) { + // output.entries.push({ + // type: "Directory", + // name: interfaceType.type, + // data: renderTemplates( + // templatePath("interface-type"), + // interfaceType, + // subTemplates + // ), + // }); + // } + // + // Generate module type folders + if (abi.moduleType) { + output.entries.push({ + type: "Directory", + name: abi.moduleType.type, + data: renderTemplates( + templatePath("module-type"), + abi.moduleType, + subTemplates + ), + }); + } + + // Generate enum type folders + // for (const enumType of abi.enumTypes) { + // output.entries.push({ + // type: "Directory", + // name: enumType.type, + // data: renderTemplates(templatePath("enum-type"), enumType, subTemplates), + // }); + // } + // + // // Generate env type folders + // if (abi.envType) { + // output.entries.push({ + // type: "Directory", + // name: abi.envType.type, + // data: renderTemplates( + // templatePath("env-type"), + // abi.envType, + // subTemplates + // ), + // }); + // } + + // Generate root entry file + output.entries.push(...renderTemplates(templatePath(""), abi, subTemplates)); + + return result; +}; + +function applyTransforms(abi: Abi): Abi { + const transforms = [ + extendType(Functions), + addFirstLast, + toPrefixedGraphQLType, + ]; + + for (const transform of transforms) { + abi = transformAbi(abi, transform); + } + return abi; +} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/reservedWords.ts b/packages/schema/bind/src/bindings/golang/wasm-go/reservedWords.ts new file mode 100644 index 0000000000..f962c6f7b5 --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/reservedWords.ts @@ -0,0 +1,201 @@ +// based on: +// - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar#keywords +// - https://github.com/AssemblyScript/assemblyscript/blob/f54dbfb527842f3d68f18643bb614d104b4f0160/src/common.ts#L107 +// - https://github.com/AssemblyScript/assemblyscript/blob/f54dbfb527842f3d68f18643bb614d104b4f0160/src/tokenizer.ts#L181 +export const reservedWordsAS: Set = new Set([ + "async", + "await", + "arguments", + "abstract", + "as", + "break", + "const", + "class", + "catch", + "case", + "continue", + "constructor", + "default", + "declare", + "do", + "delete", + "debugger", + "else", + "enum", + "export", + "extends", + "for", + "from", + "function", + "finally", + "get", + "if", + "in", + "is", + "implements", + "import", + "instanceof", + "interface", + "keyof", + "let", + "module", + "new", + "namespace", + "of", + "private", + "package", + "public", + "protected", + "return", + "readonly", + "switch", + "static", + "set", + "super", + "this", + "type", + "try", + "throw", + "typeof", + "var", + "while", + "with", + "yield", + // types + "i8", + "i16", + "i32", + "i64", + "isize", + "u8", + "u16", + "u32", + "u64", + "usize", + "bool", + "f32", + "f64", + "v128", + "funcref", + "externref", + "anyref", + "eqref", + "i31ref", + "dataref", + "i8x16", + "u8x16", + "i16x8", + "u16x8", + "i32x4", + "u32x4", + "i64x2", + "u64x2", + "f32x4", + "f64x2", + "void", + "number", + "boolean", + "string", + "native", + "indexof", + "valueof", + "returnof", + "nonnull", + // aliases + "null", + "true", + "false", + // constants + "ASC_TARGET", + "ASC_RUNTIME", + "ASC_NO_ASSERT", + "ASC_MEMORY_BASE", + "ASC_TABLE_BASE", + "ASC_OPTIMIZE_LEVEL", + "ASC_SHRINK_LEVEL", + "ASC_LOW_MEMORY_LIMIT", + "ASC_EXPORT_RUNTIME", + "ASC_WASI", + "ASC_FEATURE_SIGN_EXTENSION", + "ASC_FEATURE_MUTABLE_GLOBALS", + "ASC_FEATURE_NONTRAPPING_F2I", + "ASC_FEATURE_BULK_MEMORY", + "ASC_FEATURE_SIMD", + "ASC_FEATURE_THREADS", + "ASC_FEATURE_EXCEPTION_HANDLING", + "ASC_FEATURE_TAIL_CALLS", + "ASC_FEATURE_REFERENCE_TYPES", + "ASC_FEATURE_MULTI_VALUE", + "ASC_FEATURE_GC", + "ASC_FEATURE_MEMORY64", + "ASC_VERSION_MAJOR", + "ASC_VERSION_MINOR", + "ASC_VERSION_PATCH", + // classes + "I8", + "I16", + "I32", + "I64", + "Isize", + "U8", + "U16", + "U32", + "U64", + "Usize", + "Bool", + "F32", + "F64", + "V128", + "Funcref", + "Externref", + "Anyref", + "Eqref", + "I31ref", + "Dataref", + "String", + "Object", + "Array", + "StaticArray", + "Set", + "Map", + "Function", + "ArrayBufferView", + "ArrayBuffer", + "Math", + "Mathf", + "NativeMath", + "NativeMathf", + "Int8Array", + "Int16Array", + "Int32Array", + "Int64Array", + "Uint8Array", + "Uint8ClampedArray", + "Uint16Array", + "Uint32Array", + "Uint64Array", + "Float32Array", + "Float64Array", + "TemplateStringsArray", + "Error", + // runtime + "abort", + "trace", + "seed", + "pow", + "ipow32", + "ipow64", + "mod", + "__alloc", + "__realloc", + "__free", + "__new", + "__renew", + "__link", + "__collect", + "__typeinfo", + "__instanceof", + "__visit", + "__newBuffer", + "__newArray", +]); diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/main-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/main-go.mustache new file mode 100644 index 0000000000..5907c2160f --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/main-go.mustache @@ -0,0 +1,22 @@ +package main + +import ( + "github.com/consideritdone/polywrap-go/examples/demo1/wrap/module" + "github.com/consideritdone/polywrap-go/polywrap" +) + +//export _wrap_invoke +func _wrap_invoke(methodSize, argsSize, envSize uint32) bool { + args := polywrap.WrapInvokeArgs(methodSize, argsSize) + + {{#moduleType}} + {{#methods}} + {{^first}}else {{/first}}if args.method == "{{name}}" { + return polywrap.WrapInvoke(args, envSize, module.{{#toUpper}}{{name}}{{/toUpper}}Wrapped) + } {{/methods}}{{/moduleType}}else { + return polywrap.WrapInvoke(args, envSize, nil) + } +} + +func main() { +} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/module-type/serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/module-type/serialization-go.mustache new file mode 100644 index 0000000000..f3149225b5 --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/module-type/serialization-go.mustache @@ -0,0 +1,69 @@ +package module + +import ( + "github.com/consideritdone/polywrap-go/examples/demo1/wrap/moduleTypes" + "github.com/consideritdone/polywrap-go/examples/demo1/wrap/sampleResult" + "github.com/consideritdone/polywrap-go/polywrap/msgpack" +) +{{#methods}} + +export class Args{{#toUpper}}{{name}}{{/toUpper}} { + {{#arguments}} + {{#handleKeywords}}{{name}}{{/handleKeywords}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}}; + {{/arguments}} +} + +export function deserialize{{#toUpper}}{{name}}{{/toUpper}}Args(argsBuf []byte): *moduleTypes.Args{{name}} { + context := msgpack.NewContext("Deserializing module-type: {{name}}") + {{#arguments.length}} + reader := msgpack.NewReadDecoder(context, argsBuf) + numFields := reader.ReadMapLength() + + {{#arguments}} + {{^object}} + let _{{name}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} = {{#toWasmInit}}{{toGraphQLType}}{{/toWasmInit}}; + {{/object}} + {{#required}} + let _{{name}}Set: bool = false; + {{/required}} + {{/arguments}} + + for i := numFields; i > 0; i-- { + const field = reader.readString(); + + reader.Context().Push(field, "unknown", "searching for property type") + {{#arguments}} + {{^first}}else {{/first}}if (field == "{{name}}") { + reader.Context().Push(field, "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "type found, reading property") + + {{#scalar}} + _{{name}} = reader.Read{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(); + {{/scalar}} + {{#required}} + _{{name}}Set = true; + {{/required}} + reader.Context().Pop() + } + {{/arguments}} + reader.context().pop(); + } + + {{#arguments}} + {{#required}} + {{^object}} + if !_{{name}}Set { + {{/object}} + panic(reader.Context().PrintWithContext("Missing required argument: '{{name}}: {{type}}'")) + } + {{/required}} + {{/arguments}} + {{/arguments.length}} + + return { + {{#arguments}} + {{#handleKeywords}}{{name}}{{/handleKeywords}}: _{{name}}{{^last}},{{/last}} + {{/arguments}} + }; +} + +{{/methods}} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/main-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/main-go.mustache new file mode 100644 index 0000000000..b0cfc417d3 --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/main-go.mustache @@ -0,0 +1,18 @@ +package {{#toFirstLower}}{{type}}{{/toFirstLower}} + +import "github.com/consideritdone/polywrap-go/polywrap/msgpack" + +type {{type}} struct { + Value string + {{#properties}} + {{#handleKeywords}}{{#toUpper}}{{name}}{{/toUpper}}{{/handleKeywords}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} + {{/properties}} +} + +func toBuffer(args SampleResult) []byte { + return serializeSampleResult(args) +} + +func Write(writer msgpack.Write, args SampleResult) { + writeSampleResult(writer, args) +} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/serialization-go.mustache new file mode 100644 index 0000000000..b168feedb1 --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/serialization-go.mustache @@ -0,0 +1,22 @@ +package {{#toFirstLower}}{{type}}{{/toFirstLower}} + +import "github.com/consideritdone/polywrap-go/polywrap/msgpack" + +func serialize{{type}}(args {{type}}) []byte { + context := msgpack.NewContext("Serializing (encoding) object-type: {{type}}") + encoder := msgpack.NewWriteEncoder(context) + write{{type}}(encoder, args) + + return encoder.Buffer() +} + +func write{{type}}(writer msgpack.Write, args {{type}}) { + writer.WriteMapLength({{properties.length}}) + {{#properties}} + writer.Context().Push("{{name}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") + writer.WriteString("{{name}}") + {{#scalar}} + writer.Write{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(args.{{#handleKeywords}}{{name}}{{/handleKeywords}}); + {{/scalar}} + {{/properties}} +} diff --git a/packages/schema/bind/src/bindings/index.ts b/packages/schema/bind/src/bindings/index.ts index 61e4cfa78e..0d56f2f487 100644 --- a/packages/schema/bind/src/bindings/index.ts +++ b/packages/schema/bind/src/bindings/index.ts @@ -3,8 +3,9 @@ import { BindLanguage } from "../"; import * as AssemblyScript from "./assemblyscript"; import * as Rust from "./rust"; import * as TypeScript from "./typescript"; +import * as Golang from "./golang"; -export { AssemblyScript, Rust, TypeScript }; +export { AssemblyScript, Rust, TypeScript, Golang }; export * from "./types"; export * from "./utils"; @@ -16,6 +17,8 @@ export function getGenerateBindingFn( return AssemblyScript.Wasm.generateBinding; case "wasm-rs": return Rust.Wasm.generateBinding; + case "wasm-go": + return Golang.Wasm.generateBinding; case "plugin-ts": return TypeScript.Plugin.generateBinding; case "app-ts": diff --git a/packages/schema/bind/src/types.ts b/packages/schema/bind/src/types.ts index 3ae6aa13dc..dca0689457 100644 --- a/packages/schema/bind/src/types.ts +++ b/packages/schema/bind/src/types.ts @@ -1,7 +1,7 @@ import { OutputDirectory } from "@polywrap/os-js"; import { WrapAbi } from "@polywrap/schema-parse"; -export type BindLanguage = "wasm-as" | "wasm-rs" | "plugin-ts" | "app-ts"; +export type BindLanguage = "wasm-as" | "wasm-rs" | "wasm-go" | "plugin-ts" | "app-ts"; export interface BindOutput { output: OutputDirectory; diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go new file mode 100644 index 0000000000..fa5dc8d666 --- /dev/null +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go @@ -0,0 +1,24 @@ +package main + +import ( + "github.com/consideritdone/polywrap-go/examples/demo1/wrap/module" + "github.com/consideritdone/polywrap-go/polywrap" +) + +//export _wrap_invoke +func _wrap_invoke(methodSize, argsSize, envSize uint32) bool { + args := polywrap.WrapInvokeArgs(methodSize, argsSize) + + if args.Method == "moduleMethod" { + return polywrap.WrapInvoke(args, envSize, module.ModuleMethodWrapped) + } else if args.Method == "objectMethod" { + return polywrap.WrapInvoke(args, envSize, module.ObjectMethodWrapped) + } else if args.Method == "optionalEnvMethod" { + return polywrap.WrapInvoke(args, envSize, module.OptionalEnvMethodWrapped) + } else { + return polywrap.WrapInvoke(args, envSize, nil) + } +} + +func main() { +} From e58ad8439d3f0c621ee0e491d5ec9531b91ded26 Mon Sep 17 00:00:00 2001 From: ramil Date: Wed, 3 Aug 2022 21:40:10 +0300 Subject: [PATCH 02/65] for debug only --- packages/schema/bind/src/__tests__/index.ts | 1 + .../bind/src/__tests__/test-cases.spec.ts | 38 ++++++++++++++++++- 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/packages/schema/bind/src/__tests__/index.ts b/packages/schema/bind/src/__tests__/index.ts index 1fd3557924..efe0d6ff43 100644 --- a/packages/schema/bind/src/__tests__/index.ts +++ b/packages/schema/bind/src/__tests__/index.ts @@ -64,6 +64,7 @@ export function fetchTestCases(): TestCases { const outputLanguages = fs .readdirSync(outputDir, { withFileTypes: true }) .filter((item: fs.Dirent) => item.isDirectory()) + .filter((item: fs.Dirent) => item.name == "wasm-go") .map((item: fs.Dirent) => { return { language: item.name, diff --git a/packages/schema/bind/src/__tests__/test-cases.spec.ts b/packages/schema/bind/src/__tests__/test-cases.spec.ts index 450600d723..9617eb6587 100644 --- a/packages/schema/bind/src/__tests__/test-cases.spec.ts +++ b/packages/schema/bind/src/__tests__/test-cases.spec.ts @@ -12,7 +12,7 @@ import { OutputEntry } from "@polywrap/os-js"; -import fs from "fs"; +import fs, {existsSync, mkdirSync} from "fs"; import path from "path"; describe("Polywrap Binding Test Suite", () => { @@ -74,6 +74,42 @@ describe("Polywrap Binding Test Suite", () => { JSON.stringify(expectedOutput, null, 2), ); + const paths: string[] = []; + + + const outputDirectoryEntry = (root: string, entry: OutputEntry) => { + const entryPath = path.join(root, entry.name); + paths.push(entryPath); + + switch (entry.type) { + case "File": { + writeFileSync(entryPath, entry.data); + break; + } + case "Directory": { + for (const subEntry of entry.data) { + if (!existsSync(entryPath)) { + mkdirSync(entryPath, { recursive: true }); + } + outputDirectoryEntry(entryPath, subEntry); + } + break; + } + default: { + throw Error( + `outputDirectoryEntry: Unknown entry type. Entry: ${JSON.stringify( + entry + )}` + ); + } + } + }; + + for (const entry of output.output.entries) { + outputDirectoryEntry(testResultDir, entry); + } + + expect(output).toMatchObject(expectedOutput); } }); From e3244985a76ad722e1a77646b56f64aa3002c5fb Mon Sep 17 00:00:00 2001 From: n0cte Date: Tue, 16 Aug 2022 14:40:27 +0300 Subject: [PATCH 03/65] Add serialization and deserialization for common types --- .../src/bindings/golang/wasm-go/functions.ts | 251 ++-- .../bind/src/bindings/golang/wasm-go/index.ts | 36 +- .../templates/deserialize_array.mustache | 23 + .../templates/deserialize_enum.mustache | 11 + .../templates/deserialize_map.mustache | 24 + .../templates/deserialize_object.mustache | 8 + .../templates/deserialize_scalar.mustache | 9 + .../templates/enum-type/type-go.mustache | 39 + .../templates/object-type/main-go.mustache | 35 +- .../object-type/serialization-go.mustache | 119 +- .../templates/serialize_array.mustache | 23 + .../wasm-go/templates/serialize_enum.mustache | 13 + .../wasm-go/templates/serialize_map.mustache | 24 + .../templates/serialize_object.mustache | 10 + .../templates/serialize_scalar.mustache | 13 + .../output/wasm-go/types/another_type.go | 27 + .../types/another_type_serialization.go | 94 ++ .../output/wasm-go/types/custom_enum.go | 38 + .../output/wasm-go/types/custom_type.go | 67 + .../types/custom_type_serialization.go | 1218 +++++++++++++++++ .../bind/sanity/output/wasm-go/types/env.go | 27 + .../output/wasm-go/types/env_serialization.go | 115 ++ 22 files changed, 2070 insertions(+), 154 deletions(-) create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_array.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_enum.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_map.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_object.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_scalar.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/enum-type/type-go.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_array.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_enum.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_map.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_object.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_scalar.mustache create mode 100644 packages/test-cases/cases/bind/sanity/output/wasm-go/types/another_type.go create mode 100644 packages/test-cases/cases/bind/sanity/output/wasm-go/types/another_type_serialization.go create mode 100644 packages/test-cases/cases/bind/sanity/output/wasm-go/types/custom_enum.go create mode 100644 packages/test-cases/cases/bind/sanity/output/wasm-go/types/custom_type.go create mode 100644 packages/test-cases/cases/bind/sanity/output/wasm-go/types/custom_type_serialization.go create mode 100644 packages/test-cases/cases/bind/sanity/output/wasm-go/types/env.go create mode 100644 packages/test-cases/cases/bind/sanity/output/wasm-go/types/env_serialization.go diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/functions.ts b/packages/schema/bind/src/bindings/golang/wasm-go/functions.ts index ab3b954496..ee1ab96b97 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/functions.ts +++ b/packages/schema/bind/src/bindings/golang/wasm-go/functions.ts @@ -2,6 +2,86 @@ import { isBaseType } from "./baseTypes"; import { reservedWordsAS } from "./reservedWords"; import { MustacheFn } from "../../types"; +let num = -1; + +export const startIter: MustacheFn = () => { + return (): string => { + num = -1; + return "" + } +} + +export const stopIter: MustacheFn = () => { + return (): string => { + num = -1; + return "" + } +} + +export const currIter: MustacheFn = () => { + return (text: string, render: (template: string) => string): string => { + const rendered: string = render(text); + return `${rendered}${num}`; + } +} + +export const nextIter: MustacheFn = () => { + return (text: string, render: (template: string) => string): string => { + const rendered: string = render(text); + return `${rendered}${++num}`; + } +} + +export const prevFullIter: MustacheFn = () => { + return (text: string, render: (template: string) => string): string => { + const rendered: string = render(text); + if (rendered == "stop") { + return ""; + } + return Array(num).fill(0).map((_, i) => `[${rendered}${i}]`).join(""); + } +} + +export const lastFullIter: MustacheFn = () => { + return (text: string, render: (template: string) => string): string => { + const rendered: string = render(text); + if (rendered == "stop") { + return ""; + } + return Array(num + 1).fill(0).map((_, i) => `[${rendered}${i}]`).join(""); + } +} + +export const writePointer: MustacheFn = () => { + return (text: string, render: (template: string) => string): string => { + const [type, value] = render(text).split(" - "); + let pointer = "*"; + if ({ + "BigInt": true, + "Json": true, + "Bytes": true, + }[type] ?? false) { + pointer = ""; + } + return `writer.Write${type}(${pointer}${value})` + } +} + +export const readPointer: MustacheFn = () => { + return (text: string, render: (template: string) => string): string => { + const [type, value] = render(text).split(" - "); + let pointer = "&"; + if ({ + "BigInt": true, + "Json": true, + "Bytes": true, + }[type] ?? false) { + pointer = ""; + } + return `${pointer}${value}` + } +} + export const handleKeywords: MustacheFn = () => { return (text: string, render: (template: string) => string): string => { const rendered: string = render(text); @@ -15,7 +95,6 @@ export const handleKeywords: MustacheFn = () => { export const toMsgPack: MustacheFn = () => { return (value: string, render: (template: string) => string) => { let type = render(value); - let modifier = ""; if (type[type.length - 1] === "!") { type = type.substring(0, type.length - 1); @@ -23,87 +102,45 @@ export const toMsgPack: MustacheFn = () => { modifier = "Optional"; } - if (type[0] === "[") { - return modifier + "Array"; - } - if (type.startsWith("Map<")) { - return modifier + "ExtGenericMap"; - } - switch (type) { - case "Int": - return modifier + "Int32"; - case "UInt": - return modifier + "UInt32"; - case "Boolean": - return modifier + "Bool"; - default: - return modifier + type; - } - }; -}; - -export const toWasmInit: MustacheFn = () => { - return (value: string, render: (template: string) => string) => { - let type = render(value); - - if (type[type.length - 1] === "!") { - type = type.substring(0, type.length - 1); - } else { - const nullType = toWasm()(value, render); - const optional = "Option"; - const nullOptional = "| null"; - - if (nullType.endsWith(nullOptional)) { - return "null"; - } else if (nullType.startsWith(optional)) { - type = nullType.substring(6); - return `Option.None${type}()`; - } - } - - if (type[0] === "[") { - return "[]"; - } - - if (type.startsWith("Map<")) { - const openBracketIdx = type.indexOf("<"); - const closeBracketIdx = type.lastIndexOf(">"); - const [key, value] = type - .substring(openBracketIdx + 1, closeBracketIdx) - .split(",") - .map((x) => toWasm()(x.trim(), render)); - return `new Map<${key}, ${value}>()`; - } - - switch (type) { - case "Int": - case "Int8": - case "Int16": - case "Int32": - case "UInt": - case "UInt8": - case "UInt16": - case "UInt32": - return "0"; - case "String": - return `""`; - case "Boolean": - return "false"; - case "Bytes": - return `new ArrayBuffer(0)`; - case "BigInt": - return `BigInt.fromUInt16(0)`; - case "BigNumber": - return `new BigNumber(BigInt.fromUInt16(0), 0, 0)`; - case "JSON": - return `JSON.Value.Null()`; - default: - if (type.includes("Enum_")) { - return "0"; - } else { - return `new Types.${type}()`; - } + let t = type; + if (type.startsWith("[")) { + t = "Array"; + } else if (type.startsWith("Map")) { + t = "Map"; + } else if (type.startsWith("Int8")) { + t = "I8" + } else if (type.startsWith("Int16")) { + t = "I16" + } else if (type.startsWith("Int32")) { + t = "I32" + } else if (type.startsWith("Int64")) { + t = "I64" + } else if (type.startsWith("Int")) { + t = "I32" + } else if (type.startsWith("UInt8")) { + t = "U8" + } else if (type.startsWith("UInt16")) { + t = "U16" + } else if (type.startsWith("UInt32")) { + t = "U32" + } else if (type.startsWith("UInt64")) { + t = "U64" + } else if (type.startsWith("UInt")) { + t = "U32" + } else if (type.startsWith("String")) { + t = "String" + } else if (type.startsWith("Boolean")) { + t = "Bool" + } else if (type.startsWith("Bytes")) { + t = "Bytes" + } else if (type.startsWith("BigInt")) { + t = "BigInt" + } else if (type.startsWith("BigNumber")) { + t = "BigInt" + } else if (type.startsWith("JSON")) { + t = "Json" } + return t; }; }; @@ -129,26 +166,34 @@ export const toWasm: MustacheFn = () => { switch (type) { case "Int": - type = "i32"; + type = "int32"; break; case "Int8": - type = "i8"; + type = "int8"; break; case "Int16": - type = "i16"; + type = "int16"; break; case "Int32": - type = "i32"; + type = "int32"; + break; + case "Int64": + type = "int64"; break; case "UInt": - case "UInt32": - type = "u32"; + type = "uint32"; break; case "UInt8": - type = "u8"; + type = "uint8"; break; case "UInt16": - type = "u16"; + type = "uint16"; + break; + case "UInt32": + type = "uint32"; + break; + case "UInt64": + type = "uint64"; break; case "String": type = "string"; @@ -157,23 +202,23 @@ export const toWasm: MustacheFn = () => { type = "bool"; break; case "Bytes": - type = "ArrayBuffer"; + type = "[]byte"; break; case "BigInt": - type = "BigInt"; + type = "*big.Int"; break; case "BigNumber": - type = "BigNumber"; + type = "*big.Int"; break; case "JSON": - type = "JSON.Value"; + type = "*fastjson.Value"; break; default: if (type.includes("Enum_")) { - type = `Types.${type.replace("Enum_", "")}`; + type = `${type.replace("Enum_", "")}`; isEnum = true; } else { - type = `Types.${type}`; + type = `${type}`; } } @@ -189,7 +234,7 @@ const toWasmArray = (type: string, optional: boolean): string => { } const wasmType = toWasm()(result[2], (str) => str); - return applyOptional("Array<" + wasmType + ">", optional, false); + return applyOptional(`[]${wasmType}`, optional, false); }; const toWasmMap = (type: string, optional: boolean): string => { @@ -212,7 +257,7 @@ const toWasmMap = (type: string, optional: boolean): string => { const keyType = toWasm()(keyValTypes[0], (str) => str); const valType = toWasm()(keyValTypes[1], (str) => str); - return applyOptional(`Map<${keyType}, ${valType}>`, optional, false); + return applyOptional(`map[${keyType}]${valType}`, optional, false); }; const applyOptional = ( @@ -220,16 +265,8 @@ const applyOptional = ( optional: boolean, isEnum: boolean ): string => { - if (optional) { - if ( - type.indexOf("Array") === 0 || - type.indexOf("string") === 0 || - (!isEnum && !isBaseType(type)) - ) { - return `${type} | null`; - } else { - return `Option<${type}>`; - } + if (optional && !type.startsWith("*") && !type.startsWith("[]") && !type.startsWith("map")) { + return `*${type}` } else { return type; } diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/index.ts b/packages/schema/bind/src/bindings/golang/wasm-go/index.ts index fdc646f0e0..4704b19d59 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/index.ts +++ b/packages/schema/bind/src/bindings/golang/wasm-go/index.ts @@ -136,26 +136,22 @@ export const generateBinding: GenerateBindingFn = ( } // Generate enum type folders - // for (const enumType of abi.enumTypes) { - // output.entries.push({ - // type: "Directory", - // name: enumType.type, - // data: renderTemplates(templatePath("enum-type"), enumType, subTemplates), - // }); - // } - // - // // Generate env type folders - // if (abi.envType) { - // output.entries.push({ - // type: "Directory", - // name: abi.envType.type, - // data: renderTemplates( - // templatePath("env-type"), - // abi.envType, - // subTemplates - // ), - // }); - // } + for (const enumType of abi.enumTypes) { + output.entries.push({ + type: "Directory", + name: enumType.type, + data: renderTemplates(templatePath("enum-type"), enumType, subTemplates), + }); + } + + // Generate env type folders + if (abi.envType) { + output.entries.push({ + type: "Directory", + name: abi.envType.type, + data: renderTemplates(templatePath("object-type"), abi.envType, subTemplates), + }); + } // Generate root entry file output.entries.push(...renderTemplates(templatePath(""), abi, subTemplates)); diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_array.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_array.mustache new file mode 100644 index 0000000000..59003f2d65 --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_array.mustache @@ -0,0 +1,23 @@ +if reader.IsNil() { + _{{name}}{{#lastFullIter}}i{{/lastFullIter}} = nil +} else { + {{#nextIter}}ln{{/nextIter}} := reader.ReadArrayLength() + _{{name}}{{#prevFullIter}}i{{/prevFullIter}} = make({{#toWasm}}{{toGraphQLType}}{{/toWasm}}, {{#currIter}}ln{{/currIter}}) + for {{#currIter}}i{{/currIter}} := uint32(0); {{#currIter}}i{{/currIter}} < {{#currIter}}ln{{/currIter}}; {{#currIter}}i{{/currIter}}++ { + {{#scalar}} + {{> deserialize_scalar}} + {{/scalar}} + {{#enum}} + {{> deserialize_enum}} + {{/enum}} + {{#array}} + {{> deserialize_array}} + {{/array}} + {{#map}} + {{> deserialize_map}} + {{/map}} + {{#object}} + {{> deserialize_object}} + {{/object}} + } +} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_enum.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_enum.mustache new file mode 100644 index 0000000000..f92f67096d --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_enum.mustache @@ -0,0 +1,11 @@ +{{#required}} +_{{name}}{{#lastFullIter}}i{{/lastFullIter}} = {{#toUpper}}{{type}}{{/toUpper}}(reader.ReadI32()) +Sanitize{{#toUpper}}{{type}}{{/toUpper}}Value(int32(_{{name}}{{#lastFullIter}}i{{/lastFullIter}})) +{{/required}} +{{^required}} +if !reader.IsNil() { + v := {{#toUpper}}{{type}}{{/toUpper}}(reader.ReadI32()) + Sanitize{{#toUpper}}{{type}}{{/toUpper}}Value(int32(v)) + _{{name}}{{#lastFullIter}}i{{/lastFullIter}} = &v +} +{{/required}} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_map.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_map.mustache new file mode 100644 index 0000000000..a88ea85f13 --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_map.mustache @@ -0,0 +1,24 @@ +if reader.IsNil() { + _{{name}}{{#lastFullIter}}i{{/lastFullIter}} = nil +} else { + {{#nextIter}}ln{{/nextIter}} := reader.ReadMapLength() + _{{name}}{{#prevFullIter}}i{{/prevFullIter}} = make({{#toWasm}}{{toGraphQLType}}{{/toWasm}}) + for {{#currIter}}j{{/currIter}} := uint32(0); {{#currIter}}j{{/currIter}} < {{#currIter}}ln{{/currIter}}; {{#currIter}}j{{/currIter}}++ { + {{#currIter}}i{{/currIter}} := reader.Read{{#key}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/key}}() + {{#scalar}} + {{> deserialize_scalar}} + {{/scalar}} + {{#enum}} + {{> deserialize_enum}} + {{/enum}} + {{#array}} + {{> deserialize_array}} + {{/array}} + {{#map}} + {{> deserialize_map}} + {{/map}} + {{#object}} + {{> deserialize_object}} + {{/object}} + } +} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_object.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_object.mustache new file mode 100644 index 0000000000..86cea2fe71 --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_object.mustache @@ -0,0 +1,8 @@ +if v := {{#toUpper}}{{type}}{{/toUpper}}Read(reader); v != nil { + {{#required}} + _{{name}}{{#lastFullIter}}i{{/lastFullIter}} = *v + {{/required}} + {{^required}} + _{{name}}{{#lastFullIter}}i{{/lastFullIter}} = v + {{/required}} +} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_scalar.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_scalar.mustache new file mode 100644 index 0000000000..1a7849f233 --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_scalar.mustache @@ -0,0 +1,9 @@ +{{#required}} +_{{name}}{{#lastFullIter}}i{{/lastFullIter}} = reader.Read{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}() +{{/required}} +{{^required}} +if !reader.IsNil() { + v := reader.Read{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(); + _{{name}}{{#lastFullIter}}i{{/lastFullIter}} = {{#readPointer}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}} - v{{/readPointer}} +} +{{/required}} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/enum-type/type-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/enum-type/type-go.mustache new file mode 100644 index 0000000000..a33f6f9723 --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/enum-type/type-go.mustache @@ -0,0 +1,39 @@ +package types + +type {{#toUpper}}{{type}}{{/toUpper}} int32 + +const ( + {{#constants}} + {{#toUpper}}{{type}}{{/toUpper}}{{.}} = iota + {{/constants}} + {{#toFirstLower}}{{type}}{{/toFirstLower}}Max = iota +) + +func Sanitize{{#toUpper}}{{type}}{{/toUpper}}Value(value int32) { + if !(value >= 0 && value < int32({{#toFirstLower}}{{type}}{{/toFirstLower}}Max)) { + panic("Invalid value for enum '{{#toUpper}}{{type}}{{/toUpper}}'") + } +} + +func Get{{#toUpper}}{{type}}{{/toUpper}}Value(key string) {{#toUpper}}{{type}}{{/toUpper}} { + switch key { + {{#constants}} + case "{{.}}": + return {{#toUpper}}{{type}}{{/toUpper}}{{.}} + {{/constants}} + default: + panic("Invalid key for enum '{{#toUpper}}{{type}}{{/toUpper}}'") + } +} + +func Get{{#toUpper}}{{type}}{{/toUpper}}Key(value {{#toUpper}}{{type}}{{/toUpper}}) string { + Sanitize{{#toUpper}}{{type}}{{/toUpper}}Value(int32(value)) + switch value { + {{#constants}} + case {{#toUpper}}{{type}}{{/toUpper}}{{.}}: + return "{{.}}" + {{/constants}} + default: + panic("Invalid value for enum '{{#toUpper}}{{type}}{{/toUpper}}'") + } +} \ No newline at end of file diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/main-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/main-go.mustache index b0cfc417d3..08d588529e 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/main-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/main-go.mustache @@ -1,18 +1,31 @@ -package {{#toFirstLower}}{{type}}{{/toFirstLower}} +package types -import "github.com/consideritdone/polywrap-go/polywrap/msgpack" +import ( + "github.com/consideritdone/polywrap-go/polywrap/msgpack" + "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" + "github.com/consideritdone/polywrap-go/polywrap/msgpack/container" + "github.com/valyala/fastjson" +) -type {{type}} struct { - Value string - {{#properties}} - {{#handleKeywords}}{{#toUpper}}{{name}}{{/toUpper}}{{/handleKeywords}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} - {{/properties}} +type {{#toUpper}}{{type}}{{/toUpper}} struct { + {{#properties}} + {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} + {{/properties}} } -func toBuffer(args SampleResult) []byte { - return serializeSampleResult(args) +func {{#toUpper}}{{type}}{{/toUpper}}ToBuffer(value *{{#toUpper}}{{type}}{{/toUpper}}) []byte { + return serialize{{#toUpper}}{{type}}{{/toUpper}}(value) } -func Write(writer msgpack.Write, args SampleResult) { - writeSampleResult(writer, args) +func {{#toUpper}}{{type}}{{/toUpper}}FromBuffer(data []byte) *{{#toUpper}}{{type}}{{/toUpper}} { + return deserialize{{#toUpper}}{{type}}{{/toUpper}}(data) } + +func {{#toUpper}}{{type}}{{/toUpper}}Write(writer msgpack.Write, value *{{#toUpper}}{{type}}{{/toUpper}}) { + write{{#toUpper}}{{type}}{{/toUpper}}(writer, value) +} + +func {{#toUpper}}{{type}}{{/toUpper}}Read(reader msgpack.Read) *{{#toUpper}}{{type}}{{/toUpper}} { + return read{{#toUpper}}{{type}}{{/toUpper}}(reader) +} + diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/serialization-go.mustache index b168feedb1..38c9f04e63 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/serialization-go.mustache @@ -1,22 +1,109 @@ -package {{#toFirstLower}}{{type}}{{/toFirstLower}} +package types -import "github.com/consideritdone/polywrap-go/polywrap/msgpack" +import ( + "github.com/consideritdone/polywrap-go/polywrap/msgpack" + "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" + "github.com/consideritdone/polywrap-go/polywrap/msgpack/container" + "github.com/valyala/fastjson" +) -func serialize{{type}}(args {{type}}) []byte { - context := msgpack.NewContext("Serializing (encoding) object-type: {{type}}") - encoder := msgpack.NewWriteEncoder(context) - write{{type}}(encoder, args) - - return encoder.Buffer() +func serialize{{#toUpper}}{{type}}{{/toUpper}}(value *{{#toUpper}}{{type}}{{/toUpper}}) []byte { + ctx := msgpack.NewContext("Serializing (encoding) env-type: {{#toUpper}}{{type}}{{/toUpper}}") + encoder := msgpack.NewWriteEncoder(ctx) + write{{#toUpper}}{{type}}{{/toUpper}}(encoder, value) + return encoder.Buffer() } -func write{{type}}(writer msgpack.Write, args {{type}}) { - writer.WriteMapLength({{properties.length}}) +func write{{#toUpper}}{{type}}{{/toUpper}}(writer msgpack.Write, value *{{#toUpper}}{{type}}{{/toUpper}}) { + writer.WriteMapLength({{properties.length}}) + {{#properties}} + writer.Context().Push("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") + writer.WriteString("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}") + {{#scalar}} + {{> serialize_scalar}} + {{/scalar}} + {{#array}} + {{#startIter}}{{/startIter}} + {{> serialize_array}} + {{#stopIter}}{{/stopIter}} + {{/array}} + {{#map}} + {{#startIter}}{{/startIter}} + {{> serialize_map}} + {{#stopIter}}{{/stopIter}} + {{/map}} + {{#object}} + {{> serialize_object}} + {{/object}} + {{#enum}} + {{> serialize_enum}} + {{/enum}} + writer.Context().Pop() + {{/properties}} +} + +func deserialize{{#toUpper}}{{type}}{{/toUpper}}(data []byte) *{{#toUpper}}{{type}}{{/toUpper}} { + ctx := msgpack.NewContext("Deserializing (decoding) env-type: {{#toUpper}}{{type}}{{/toUpper}}") + reader := msgpack.NewReadDecoder(ctx, data) + return read{{#toUpper}}{{type}}{{/toUpper}}(reader) +} + +func read{{#toUpper}}{{type}}{{/toUpper}}(reader msgpack.Read) *{{#toUpper}}{{type}}{{/toUpper}} { + var ( {{#properties}} - writer.Context().Push("{{name}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") - writer.WriteString("{{name}}") - {{#scalar}} - writer.Write{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(args.{{#handleKeywords}}{{name}}{{/handleKeywords}}); - {{/scalar}} + _{{name}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} + {{#required}} + _{{name}}Set bool + {{/required}} {{/properties}} -} + ) + + for i := int32(reader.ReadMapLength()); i > 0; i-- { + field := reader.ReadString() + reader.Context().Push(field, "unknown", "searching for property type"); + switch field { + {{#properties}} + case "{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}": + reader.Context().Push(field, "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "type found, reading property") + {{#scalar}} + {{> deserialize_scalar}} + {{/scalar}} + {{#enum}} + {{> deserialize_enum}} + {{/enum}} + {{#array}} + {{#startIter}}{{/startIter}} + {{> deserialize_array}} + {{#stopIter}}{{/stopIter}} + {{/array}} + {{#map}} + {{#startIter}}{{/startIter}} + {{> deserialize_map}} + {{#stopIter}}{{/stopIter}} + {{/map}} + {{#object}} + {{> deserialize_object}} + {{/object}} + {{#required}} + _{{name}}Set = true; + {{/required}} + reader.Context().Pop() + {{/properties}} + } + reader.Context().Pop() + } + + {{#properties}} + {{#required}} + if (!_{{name}}Set) { + panic(reader.Context().PrintWithContext("Missing required property: '{{name}}: {{type}}'")) + } + {{/required}} + {{/properties}} + + return &{{#toUpper}}{{type}}{{/toUpper}}{ + {{#properties}} + {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}: _{{name}}, + {{/properties}} + } +} \ No newline at end of file diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_array.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_array.mustache new file mode 100644 index 0000000000..2a807ea5b0 --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_array.mustache @@ -0,0 +1,23 @@ +if value.{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}{{#lastFullIter}}i{{/lastFullIter}} == nil { + writer.WriteNil() +} else if len(value.{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}{{#lastFullIter}}i{{/lastFullIter}}) == 0 { + writer.WriteNil() +} else { + for {{#nextIter}}i{{/nextIter}} := range value.{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}{{#prevFullIter}}i{{/prevFullIter}} { + {{#scalar}} + {{> serialize_scalar}} + {{/scalar}} + {{#enum}} + {{> serialize_enum}} + {{/enum}} + {{#array}} + {{> serialize_array}} + {{/array}} + {{#map}} + {{> serialize_map_value}} + {{/map}} + {{#object}} + {{> serialize_object}} + {{/object}} + } +} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_enum.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_enum.mustache new file mode 100644 index 0000000000..3a5f83b057 --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_enum.mustache @@ -0,0 +1,13 @@ +{ + v := value.{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}{{#lastFullIter}}i{{/lastFullIter}} + {{#required}} + writer.WriteI32(int32(v)); + {{/required}} + {{^required}} + if v == nil { + writer.WriteNil() + } else { + writer.WriteI32(int32(*v)); + } + {{/required}} +} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_map.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_map.mustache new file mode 100644 index 0000000000..ea96d27d16 --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_map.mustache @@ -0,0 +1,24 @@ +if value.{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} == nil { + writer.WriteNil() +} else if len(value.{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}) == 0 { + writer.WriteNil() +} else { + for {{#nextIter}}i{{/nextIter}} := range value.{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}{{#getPrevIter}}i{{/getPrevIter}} { + writer.Write{{#key}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/key}}({{#currIter}}i{{/currIter}}) + {{#scalar}} + {{> serialize_scalar}} + {{/scalar}} + {{#enum}} + {{> serialize_enum}} + {{/enum}} + {{#array}} + {{> serialize_array}} + {{/array}} + {{#map}} + {{> serialize_map}} + {{/map}} + {{#object}} + {{> serialize_object}} + {{/object}} + } +} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_object.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_object.mustache new file mode 100644 index 0000000000..95139e29c6 --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_object.mustache @@ -0,0 +1,10 @@ + +{ + v := value.{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}{{#lastFullIter}}i{{/lastFullIter}} + {{#required}} + {{#toUpper}}{{type}}{{/toUpper}}Write(writer, &v) + {{/required}} + {{^required}} + {{#toUpper}}{{type}}{{/toUpper}}Write(writer, v) + {{/required}} +} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_scalar.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_scalar.mustache new file mode 100644 index 0000000000..256dd0ec43 --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_scalar.mustache @@ -0,0 +1,13 @@ +{ + v := value.{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}{{#lastFullIter}}i{{/lastFullIter}} + {{#required}} + writer.Write{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(v) + {{/required}} + {{^required}} + if v == nil { + writer.WriteNil() + } else { + {{#writePointer}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}} - v{{/writePointer}} + } + {{/required}} +} diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/another_type.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/another_type.go new file mode 100644 index 0000000000..c66983302c --- /dev/null +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/another_type.go @@ -0,0 +1,27 @@ +package types + +import ( + "github.com/consideritdone/polywrap-go/polywrap/msgpack" +) + +type AnotherType struct { + Prop *string + Circular *CustomType + M_const *string +} + +func AnotherTypeToBuffer(value *AnotherType) []byte { + return serializeAnotherType(value) +} + +func AnotherTypeFromBuffer(data []byte) *AnotherType { + return deserializeAnotherType(data) +} + +func AnotherTypeWrite(writer msgpack.Write, value *AnotherType) { + writeAnotherType(writer, value) +} + +func AnotherTypeRead(reader msgpack.Read) *AnotherType { + return readAnotherType(reader) +} diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/another_type_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/another_type_serialization.go new file mode 100644 index 0000000000..682e6bde21 --- /dev/null +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/another_type_serialization.go @@ -0,0 +1,94 @@ +package types + +import ( + "github.com/consideritdone/polywrap-go/polywrap/msgpack" +) + +func serializeAnotherType(value *AnotherType) []byte { + ctx := msgpack.NewContext("Serializing (encoding) env-type: AnotherType") + encoder := msgpack.NewWriteEncoder(ctx) + writeAnotherType(encoder, value) + return encoder.Buffer() +} + +func writeAnotherType(writer msgpack.Write, value *AnotherType) { + writer.WriteMapLength(3) + writer.Context().Push("Prop", "*string", "writing property") + writer.WriteString("Prop") + { + v := value.Prop + if v == nil { + writer.WriteNil() + } else { + writer.WriteString(*v) + } + } + writer.Context().Pop() + writer.Context().Push("Circular", "*CustomType", "writing property") + writer.WriteString("Circular") + + { + v := value.Circular + CustomTypeWrite(writer, v) + } + writer.Context().Pop() + writer.Context().Push("M_const", "*string", "writing property") + writer.WriteString("M_const") + { + v := value.M_const + if v == nil { + writer.WriteNil() + } else { + writer.WriteString(*v) + } + } + writer.Context().Pop() +} + +func deserializeAnotherType(data []byte) *AnotherType { + ctx := msgpack.NewContext("Deserializing (decoding) env-type: AnotherType") + reader := msgpack.NewReadDecoder(ctx, data) + return readAnotherType(reader) +} + +func readAnotherType(reader msgpack.Read) *AnotherType { + var ( + _prop *string + _circular *CustomType + _const *string + ) + + for i := int32(reader.ReadMapLength()); i > 0; i-- { + field := reader.ReadString() + reader.Context().Push(field, "unknown", "searching for property type") + switch field { + case "Prop": + reader.Context().Push(field, "*string", "type found, reading property") + if !reader.IsNil() { + v := reader.ReadString() + _prop = &v + } + reader.Context().Pop() + case "Circular": + reader.Context().Push(field, "*CustomType", "type found, reading property") + if v := CustomTypeRead(reader); v != nil { + _circular = v + } + reader.Context().Pop() + case "M_const": + reader.Context().Push(field, "*string", "type found, reading property") + if !reader.IsNil() { + v := reader.ReadString() + _const = &v + } + reader.Context().Pop() + } + reader.Context().Pop() + } + + return &AnotherType{ + Prop: _prop, + Circular: _circular, + M_const: _const, + } +} diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/custom_enum.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/custom_enum.go new file mode 100644 index 0000000000..5ee8b8ac5d --- /dev/null +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/custom_enum.go @@ -0,0 +1,38 @@ +package types + +type CustomEnum int32 + +const ( + CustomEnumSTRING = iota + CustomEnumBYTES = iota + customEnumMax = iota +) + +func SanitizeCustomEnumValue(value int32) { + if !(value >= 0 && value < int32(customEnumMax)) { + panic("Invalid value for enum 'CustomEnum'") + } +} + +func GetCustomEnumValue(key string) CustomEnum { + switch key { + case "STRING": + return CustomEnumSTRING + case "BYTES": + return CustomEnumBYTES + default: + panic("Invalid key for enum 'CustomEnum'") + } +} + +func GetCustomEnumKey(value CustomEnum) string { + SanitizeCustomEnumValue(int32(value)) + switch value { + case CustomEnumSTRING: + return "STRING" + case CustomEnumBYTES: + return "BYTES" + default: + panic("Invalid value for enum 'CustomEnum'") + } +} diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/custom_type.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/custom_type.go new file mode 100644 index 0000000000..d2198e9826 --- /dev/null +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/custom_type.go @@ -0,0 +1,67 @@ +package types + +import ( + "github.com/consideritdone/polywrap-go/polywrap/msgpack" + "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" + "github.com/valyala/fastjson" +) + +type CustomType struct { + Str string + OptStr *string + U uint32 + OptU *uint32 + M_u8 uint8 + M_u16 uint16 + M_u32 uint32 + I int32 + M_i8 int8 + M_i16 int16 + M_i32 int32 + Bigint *big.Int + OptBigint *big.Int + Bignumber *big.Int + OptBignumber *big.Int + Json *fastjson.Value + OptJson *fastjson.Value + Bytes []byte + OptBytes []byte + M_boolean bool + OptBoolean *bool + UArray []uint32 + UOptArray []uint32 + OptUOptArray []*uint32 + OptStrOptArray []*string + UArrayArray [][]uint32 + UOptArrayOptArray [][]*uint32 + UArrayOptArrayArray [][][]uint32 + CrazyArray [][][][]uint32 + Object AnotherType + OptObject *AnotherType + ObjectArray []AnotherType + OptObjectArray []*AnotherType + En CustomEnum + OptEnum *CustomEnum + EnumArray []CustomEnum + OptEnumArray []*CustomEnum + Map map[string]int32 + MapOfArr map[string][]int32 + MapOfObj map[string]AnotherType + MapOfArrOfObj map[string][]AnotherType +} + +func CustomTypeToBuffer(value *CustomType) []byte { + return serializeCustomType(value) +} + +func CustomTypeFromBuffer(data []byte) *CustomType { + return deserializeCustomType(data) +} + +func CustomTypeWrite(writer msgpack.Write, value *CustomType) { + writeCustomType(writer, value) +} + +func CustomTypeRead(reader msgpack.Read) *CustomType { + return readCustomType(reader) +} diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/custom_type_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/custom_type_serialization.go new file mode 100644 index 0000000000..d986dab75f --- /dev/null +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/custom_type_serialization.go @@ -0,0 +1,1218 @@ +package types + +import ( + "github.com/consideritdone/polywrap-go/polywrap/msgpack" + "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" + "github.com/valyala/fastjson" +) + +func serializeCustomType(value *CustomType) []byte { + ctx := msgpack.NewContext("Serializing (encoding) env-type: CustomType") + encoder := msgpack.NewWriteEncoder(ctx) + writeCustomType(encoder, value) + return encoder.Buffer() +} + +func writeCustomType(writer msgpack.Write, value *CustomType) { + writer.WriteMapLength(41) + writer.Context().Push("Str", "string", "writing property") + writer.WriteString("Str") + { + v := value.Str + writer.WriteString(v) + } + writer.Context().Pop() + writer.Context().Push("OptStr", "*string", "writing property") + writer.WriteString("OptStr") + { + v := value.OptStr + if v == nil { + writer.WriteNil() + } else { + writer.WriteString(*v) + } + } + writer.Context().Pop() + writer.Context().Push("U", "uint32", "writing property") + writer.WriteString("U") + { + v := value.U + writer.WriteU32(v) + } + writer.Context().Pop() + writer.Context().Push("OptU", "*uint32", "writing property") + writer.WriteString("OptU") + { + v := value.OptU + if v == nil { + writer.WriteNil() + } else { + writer.WriteU32(*v) + } + } + writer.Context().Pop() + writer.Context().Push("M_u8", "uint8", "writing property") + writer.WriteString("M_u8") + { + v := value.M_u8 + writer.WriteU8(v) + } + writer.Context().Pop() + writer.Context().Push("M_u16", "uint16", "writing property") + writer.WriteString("M_u16") + { + v := value.M_u16 + writer.WriteU16(v) + } + writer.Context().Pop() + writer.Context().Push("M_u32", "uint32", "writing property") + writer.WriteString("M_u32") + { + v := value.M_u32 + writer.WriteU32(v) + } + writer.Context().Pop() + writer.Context().Push("I", "int32", "writing property") + writer.WriteString("I") + { + v := value.I + writer.WriteI32(v) + } + writer.Context().Pop() + writer.Context().Push("M_i8", "int8", "writing property") + writer.WriteString("M_i8") + { + v := value.M_i8 + writer.WriteI8(v) + } + writer.Context().Pop() + writer.Context().Push("M_i16", "int16", "writing property") + writer.WriteString("M_i16") + { + v := value.M_i16 + writer.WriteI16(v) + } + writer.Context().Pop() + writer.Context().Push("M_i32", "int32", "writing property") + writer.WriteString("M_i32") + { + v := value.M_i32 + writer.WriteI32(v) + } + writer.Context().Pop() + writer.Context().Push("Bigint", "*big.Int", "writing property") + writer.WriteString("Bigint") + { + v := value.Bigint + writer.WriteBigInt(v) + } + writer.Context().Pop() + writer.Context().Push("OptBigint", "*big.Int", "writing property") + writer.WriteString("OptBigint") + { + v := value.OptBigint + if v == nil { + writer.WriteNil() + } else { + writer.WriteBigInt(v) + } + } + writer.Context().Pop() + writer.Context().Push("Bignumber", "*big.Int", "writing property") + writer.WriteString("Bignumber") + { + v := value.Bignumber + writer.WriteBigInt(v) + } + writer.Context().Pop() + writer.Context().Push("OptBignumber", "*big.Int", "writing property") + writer.WriteString("OptBignumber") + { + v := value.OptBignumber + if v == nil { + writer.WriteNil() + } else { + writer.WriteBigInt(v) + } + } + writer.Context().Pop() + writer.Context().Push("Json", "*fastjson.Value", "writing property") + writer.WriteString("Json") + { + v := value.Json + writer.WriteJson(v) + } + writer.Context().Pop() + writer.Context().Push("OptJson", "*fastjson.Value", "writing property") + writer.WriteString("OptJson") + { + v := value.OptJson + if v == nil { + writer.WriteNil() + } else { + writer.WriteJson(v) + } + } + writer.Context().Pop() + writer.Context().Push("Bytes", "[]byte", "writing property") + writer.WriteString("Bytes") + { + v := value.Bytes + writer.WriteBytes(v) + } + writer.Context().Pop() + writer.Context().Push("OptBytes", "[]byte", "writing property") + writer.WriteString("OptBytes") + { + v := value.OptBytes + if v == nil { + writer.WriteNil() + } else { + writer.WriteBytes(v) + } + } + writer.Context().Pop() + writer.Context().Push("M_boolean", "bool", "writing property") + writer.WriteString("M_boolean") + { + v := value.M_boolean + writer.WriteBool(v) + } + writer.Context().Pop() + writer.Context().Push("OptBoolean", "*bool", "writing property") + writer.WriteString("OptBoolean") + { + v := value.OptBoolean + if v == nil { + writer.WriteNil() + } else { + writer.WriteBool(*v) + } + } + writer.Context().Pop() + writer.Context().Push("UArray", "[]uint32", "writing property") + writer.WriteString("UArray") + if value.UArray == nil { + writer.WriteNil() + } else if len(value.UArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.UArray { + { + v := value.UArray[i0] + writer.WriteU32(v) + } + } + } + writer.Context().Pop() + writer.Context().Push("UOptArray", "[]uint32", "writing property") + writer.WriteString("UOptArray") + if value.UOptArray == nil { + writer.WriteNil() + } else if len(value.UOptArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.UOptArray { + { + v := value.UOptArray[i0] + writer.WriteU32(v) + } + } + } + writer.Context().Pop() + writer.Context().Push("OptUOptArray", "[]*uint32", "writing property") + writer.WriteString("OptUOptArray") + if value.OptUOptArray == nil { + writer.WriteNil() + } else if len(value.OptUOptArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.OptUOptArray { + { + v := value.OptUOptArray[i0] + if v == nil { + writer.WriteNil() + } else { + writer.WriteU32(*v) + } + } + } + } + writer.Context().Pop() + writer.Context().Push("OptStrOptArray", "[]*string", "writing property") + writer.WriteString("OptStrOptArray") + if value.OptStrOptArray == nil { + writer.WriteNil() + } else if len(value.OptStrOptArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.OptStrOptArray { + { + v := value.OptStrOptArray[i0] + if v == nil { + writer.WriteNil() + } else { + writer.WriteString(*v) + } + } + } + } + writer.Context().Pop() + writer.Context().Push("UArrayArray", "[][]uint32", "writing property") + writer.WriteString("UArrayArray") + if value.UArrayArray == nil { + writer.WriteNil() + } else if len(value.UArrayArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.UArrayArray { + if value.UArrayArray[i0] == nil { + writer.WriteNil() + } else if len(value.UArrayArray[i0]) == 0 { + writer.WriteNil() + } else { + for i1 := range value.UArrayArray[i0] { + { + v := value.UArrayArray[i0][i1] + writer.WriteU32(v) + } + } + } + } + } + writer.Context().Pop() + writer.Context().Push("UOptArrayOptArray", "[][]*uint32", "writing property") + writer.WriteString("UOptArrayOptArray") + if value.UOptArrayOptArray == nil { + writer.WriteNil() + } else if len(value.UOptArrayOptArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.UOptArrayOptArray { + if value.UOptArrayOptArray[i0] == nil { + writer.WriteNil() + } else if len(value.UOptArrayOptArray[i0]) == 0 { + writer.WriteNil() + } else { + for i1 := range value.UOptArrayOptArray[i0] { + { + v := value.UOptArrayOptArray[i0][i1] + if v == nil { + writer.WriteNil() + } else { + writer.WriteU32(*v) + } + } + } + } + } + } + writer.Context().Pop() + writer.Context().Push("UArrayOptArrayArray", "[][][]uint32", "writing property") + writer.WriteString("UArrayOptArrayArray") + if value.UArrayOptArrayArray == nil { + writer.WriteNil() + } else if len(value.UArrayOptArrayArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.UArrayOptArrayArray { + if value.UArrayOptArrayArray[i0] == nil { + writer.WriteNil() + } else if len(value.UArrayOptArrayArray[i0]) == 0 { + writer.WriteNil() + } else { + for i1 := range value.UArrayOptArrayArray[i0] { + if value.UArrayOptArrayArray[i0][i1] == nil { + writer.WriteNil() + } else if len(value.UArrayOptArrayArray[i0][i1]) == 0 { + writer.WriteNil() + } else { + for i2 := range value.UArrayOptArrayArray[i0][i1] { + { + v := value.UArrayOptArrayArray[i0][i1][i2] + writer.WriteU32(v) + } + } + } + } + } + } + } + writer.Context().Pop() + writer.Context().Push("CrazyArray", "[][][][]uint32", "writing property") + writer.WriteString("CrazyArray") + if value.CrazyArray == nil { + writer.WriteNil() + } else if len(value.CrazyArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.CrazyArray { + if value.CrazyArray[i0] == nil { + writer.WriteNil() + } else if len(value.CrazyArray[i0]) == 0 { + writer.WriteNil() + } else { + for i1 := range value.CrazyArray[i0] { + if value.CrazyArray[i0][i1] == nil { + writer.WriteNil() + } else if len(value.CrazyArray[i0][i1]) == 0 { + writer.WriteNil() + } else { + for i2 := range value.CrazyArray[i0][i1] { + if value.CrazyArray[i0][i1][i2] == nil { + writer.WriteNil() + } else if len(value.CrazyArray[i0][i1][i2]) == 0 { + writer.WriteNil() + } else { + for i3 := range value.CrazyArray[i0][i1][i2] { + { + v := value.CrazyArray[i0][i1][i2][i3] + writer.WriteU32(v) + } + } + } + } + } + } + } + } + } + writer.Context().Pop() + writer.Context().Push("Object", "AnotherType", "writing property") + writer.WriteString("Object") + + { + v := value.Object + AnotherTypeWrite(writer, &v) + } + writer.Context().Pop() + writer.Context().Push("OptObject", "*AnotherType", "writing property") + writer.WriteString("OptObject") + + { + v := value.OptObject + AnotherTypeWrite(writer, v) + } + writer.Context().Pop() + writer.Context().Push("ObjectArray", "[]AnotherType", "writing property") + writer.WriteString("ObjectArray") + if value.ObjectArray == nil { + writer.WriteNil() + } else if len(value.ObjectArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.ObjectArray { + + { + v := value.ObjectArray[i0] + AnotherTypeWrite(writer, &v) + } + } + } + writer.Context().Pop() + writer.Context().Push("OptObjectArray", "[]*AnotherType", "writing property") + writer.WriteString("OptObjectArray") + if value.OptObjectArray == nil { + writer.WriteNil() + } else if len(value.OptObjectArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.OptObjectArray { + + { + v := value.OptObjectArray[i0] + AnotherTypeWrite(writer, v) + } + } + } + writer.Context().Pop() + writer.Context().Push("En", "CustomEnum", "writing property") + writer.WriteString("En") + { + v := value.En + writer.WriteI32(int32(v)); + } + writer.Context().Pop() + writer.Context().Push("OptEnum", "*CustomEnum", "writing property") + writer.WriteString("OptEnum") + { + v := value.OptEnum + if v == nil { + writer.WriteNil() + } else { + writer.WriteI32(int32(*v)); + } + } + writer.Context().Pop() + writer.Context().Push("EnumArray", "[]CustomEnum", "writing property") + writer.WriteString("EnumArray") + if value.EnumArray == nil { + writer.WriteNil() + } else if len(value.EnumArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.EnumArray { + { + v := value.EnumArray[i0] + writer.WriteI32(int32(v)); + } + } + } + writer.Context().Pop() + writer.Context().Push("OptEnumArray", "[]*CustomEnum", "writing property") + writer.WriteString("OptEnumArray") + if value.OptEnumArray == nil { + writer.WriteNil() + } else if len(value.OptEnumArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.OptEnumArray { + { + v := value.OptEnumArray[i0] + if v == nil { + writer.WriteNil() + } else { + writer.WriteI32(int32(*v)); + } + } + } + } + writer.Context().Pop() + writer.Context().Push("Map", "map[string]int32", "writing property") + writer.WriteString("Map") + if value.Map == nil { + writer.WriteNil() + } else if len(value.Map) == 0 { + writer.WriteNil() + } else { + for i0 := range value.Map { + writer.WriteString(i0) + { + v := value.Map[i0] + writer.WriteI32(v) + } + } + } + writer.Context().Pop() + writer.Context().Push("MapOfArr", "map[string][]int32", "writing property") + writer.WriteString("MapOfArr") + if value.MapOfArr == nil { + writer.WriteNil() + } else if len(value.MapOfArr) == 0 { + writer.WriteNil() + } else { + for i0 := range value.MapOfArr { + writer.WriteString(i0) + if value.MapOfArr[i0] == nil { + writer.WriteNil() + } else if len(value.MapOfArr[i0]) == 0 { + writer.WriteNil() + } else { + for i1 := range value.MapOfArr[i0] { + { + v := value.MapOfArr[i0][i1] + writer.WriteI32(v) + } + } + } + } + } + writer.Context().Pop() + writer.Context().Push("MapOfObj", "map[string]AnotherType", "writing property") + writer.WriteString("MapOfObj") + if value.MapOfObj == nil { + writer.WriteNil() + } else if len(value.MapOfObj) == 0 { + writer.WriteNil() + } else { + for i0 := range value.MapOfObj { + writer.WriteString(i0) + + { + v := value.MapOfObj[i0] + AnotherTypeWrite(writer, &v) + } + } + } + writer.Context().Pop() + writer.Context().Push("MapOfArrOfObj", "map[string][]AnotherType", "writing property") + writer.WriteString("MapOfArrOfObj") + if value.MapOfArrOfObj == nil { + writer.WriteNil() + } else if len(value.MapOfArrOfObj) == 0 { + writer.WriteNil() + } else { + for i0 := range value.MapOfArrOfObj { + writer.WriteString(i0) + if value.MapOfArrOfObj[i0] == nil { + writer.WriteNil() + } else if len(value.MapOfArrOfObj[i0]) == 0 { + writer.WriteNil() + } else { + for i1 := range value.MapOfArrOfObj[i0] { + + { + v := value.MapOfArrOfObj[i0][i1] + AnotherTypeWrite(writer, &v) + } + } + } + } + } + writer.Context().Pop() +} + +func deserializeCustomType(data []byte) *CustomType { + ctx := msgpack.NewContext("Deserializing (decoding) env-type: CustomType") + reader := msgpack.NewReadDecoder(ctx, data) + return readCustomType(reader) +} + +func readCustomType(reader msgpack.Read) *CustomType { + var ( + _str string + _strSet bool + _optStr *string + _u uint32 + _uSet bool + _optU *uint32 + _u8 uint8 + _u8Set bool + _u16 uint16 + _u16Set bool + _u32 uint32 + _u32Set bool + _i int32 + _iSet bool + _i8 int8 + _i8Set bool + _i16 int16 + _i16Set bool + _i32 int32 + _i32Set bool + _bigint *big.Int + _bigintSet bool + _optBigint *big.Int + _bignumber *big.Int + _bignumberSet bool + _optBignumber *big.Int + _json *fastjson.Value + _jsonSet bool + _optJson *fastjson.Value + _bytes []byte + _bytesSet bool + _optBytes []byte + _boolean bool + _booleanSet bool + _optBoolean *bool + _uArray []uint32 + _uArraySet bool + _uOptArray []uint32 + _optUOptArray []*uint32 + _optStrOptArray []*string + _uArrayArray [][]uint32 + _uArrayArraySet bool + _uOptArrayOptArray [][]*uint32 + _uOptArrayOptArraySet bool + _uArrayOptArrayArray [][][]uint32 + _uArrayOptArrayArraySet bool + _crazyArray [][][][]uint32 + _object AnotherType + _objectSet bool + _optObject *AnotherType + _objectArray []AnotherType + _objectArraySet bool + _optObjectArray []*AnotherType + _en CustomEnum + _enSet bool + _optEnum *CustomEnum + _enumArray []CustomEnum + _enumArraySet bool + _optEnumArray []*CustomEnum + _map map[string]int32 + _mapSet bool + _mapOfArr map[string][]int32 + _mapOfArrSet bool + _mapOfObj map[string]AnotherType + _mapOfObjSet bool + _mapOfArrOfObj map[string][]AnotherType + _mapOfArrOfObjSet bool + ) + + for i := int32(reader.ReadMapLength()); i > 0; i-- { + field := reader.ReadString() + reader.Context().Push(field, "unknown", "searching for property type"); + switch field { + case "Str": + reader.Context().Push(field, "string", "type found, reading property") + _str = reader.ReadString() + _strSet = true; + reader.Context().Pop() + case "OptStr": + reader.Context().Push(field, "*string", "type found, reading property") + if !reader.IsNil() { + v := reader.ReadString(); + _optStr = &v + } + reader.Context().Pop() + case "U": + reader.Context().Push(field, "uint32", "type found, reading property") + _u = reader.ReadU32() + _uSet = true; + reader.Context().Pop() + case "OptU": + reader.Context().Push(field, "*uint32", "type found, reading property") + if !reader.IsNil() { + v := reader.ReadU32(); + _optU = &v + } + reader.Context().Pop() + case "M_u8": + reader.Context().Push(field, "uint8", "type found, reading property") + _u8 = reader.ReadU8() + _u8Set = true; + reader.Context().Pop() + case "M_u16": + reader.Context().Push(field, "uint16", "type found, reading property") + _u16 = reader.ReadU16() + _u16Set = true; + reader.Context().Pop() + case "M_u32": + reader.Context().Push(field, "uint32", "type found, reading property") + _u32 = reader.ReadU32() + _u32Set = true; + reader.Context().Pop() + case "I": + reader.Context().Push(field, "int32", "type found, reading property") + _i = reader.ReadI32() + _iSet = true; + reader.Context().Pop() + case "M_i8": + reader.Context().Push(field, "int8", "type found, reading property") + _i8 = reader.ReadI8() + _i8Set = true; + reader.Context().Pop() + case "M_i16": + reader.Context().Push(field, "int16", "type found, reading property") + _i16 = reader.ReadI16() + _i16Set = true; + reader.Context().Pop() + case "M_i32": + reader.Context().Push(field, "int32", "type found, reading property") + _i32 = reader.ReadI32() + _i32Set = true; + reader.Context().Pop() + case "Bigint": + reader.Context().Push(field, "*big.Int", "type found, reading property") + _bigint = reader.ReadBigInt() + _bigintSet = true; + reader.Context().Pop() + case "OptBigint": + reader.Context().Push(field, "*big.Int", "type found, reading property") + if !reader.IsNil() { + v := reader.ReadBigInt(); + _optBigint = v + } + reader.Context().Pop() + case "Bignumber": + reader.Context().Push(field, "*big.Int", "type found, reading property") + _bignumber = reader.ReadBigInt() + _bignumberSet = true; + reader.Context().Pop() + case "OptBignumber": + reader.Context().Push(field, "*big.Int", "type found, reading property") + if !reader.IsNil() { + v := reader.ReadBigInt(); + _optBignumber = v + } + reader.Context().Pop() + case "Json": + reader.Context().Push(field, "*fastjson.Value", "type found, reading property") + _json = reader.ReadJson() + _jsonSet = true; + reader.Context().Pop() + case "OptJson": + reader.Context().Push(field, "*fastjson.Value", "type found, reading property") + if !reader.IsNil() { + v := reader.ReadJson(); + _optJson = v + } + reader.Context().Pop() + case "Bytes": + reader.Context().Push(field, "[]byte", "type found, reading property") + _bytes = reader.ReadBytes() + _bytesSet = true; + reader.Context().Pop() + case "OptBytes": + reader.Context().Push(field, "[]byte", "type found, reading property") + if !reader.IsNil() { + v := reader.ReadBytes(); + _optBytes = v + } + reader.Context().Pop() + case "M_boolean": + reader.Context().Push(field, "bool", "type found, reading property") + _boolean = reader.ReadBool() + _booleanSet = true; + reader.Context().Pop() + case "OptBoolean": + reader.Context().Push(field, "*bool", "type found, reading property") + if !reader.IsNil() { + v := reader.ReadBool(); + _optBoolean = &v + } + reader.Context().Pop() + case "UArray": + reader.Context().Push(field, "[]uint32", "type found, reading property") + if reader.IsNil() { + _uArray = nil + } else { + ln0 := reader.ReadArrayLength() + _uArray = make([]uint32, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + _uArray[i0] = reader.ReadU32() + } + } + _uArraySet = true; + reader.Context().Pop() + case "UOptArray": + reader.Context().Push(field, "[]uint32", "type found, reading property") + if reader.IsNil() { + _uOptArray = nil + } else { + ln0 := reader.ReadArrayLength() + _uOptArray = make([]uint32, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + _uOptArray[i0] = reader.ReadU32() + } + } + reader.Context().Pop() + case "OptUOptArray": + reader.Context().Push(field, "[]*uint32", "type found, reading property") + if reader.IsNil() { + _optUOptArray = nil + } else { + ln0 := reader.ReadArrayLength() + _optUOptArray = make([]*uint32, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + if !reader.IsNil() { + v := reader.ReadU32(); + _optUOptArray[i0] = &v + } + } + } + reader.Context().Pop() + case "OptStrOptArray": + reader.Context().Push(field, "[]*string", "type found, reading property") + if reader.IsNil() { + _optStrOptArray = nil + } else { + ln0 := reader.ReadArrayLength() + _optStrOptArray = make([]*string, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + if !reader.IsNil() { + v := reader.ReadString(); + _optStrOptArray[i0] = &v + } + } + } + reader.Context().Pop() + case "UArrayArray": + reader.Context().Push(field, "[][]uint32", "type found, reading property") + if reader.IsNil() { + _uArrayArray = nil + } else { + ln0 := reader.ReadArrayLength() + _uArrayArray = make([][]uint32, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + if reader.IsNil() { + _uArrayArray[i0] = nil + } else { + ln1 := reader.ReadArrayLength() + _uArrayArray[i0] = make([]uint32, ln1) + for i1 := uint32(0); i1 < ln1; i1++ { + _uArrayArray[i0][i1] = reader.ReadU32() + } + } + } + } + _uArrayArraySet = true; + reader.Context().Pop() + case "UOptArrayOptArray": + reader.Context().Push(field, "[][]*uint32", "type found, reading property") + if reader.IsNil() { + _uOptArrayOptArray = nil + } else { + ln0 := reader.ReadArrayLength() + _uOptArrayOptArray = make([][]*uint32, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + if reader.IsNil() { + _uOptArrayOptArray[i0] = nil + } else { + ln1 := reader.ReadArrayLength() + _uOptArrayOptArray[i0] = make([]*uint32, ln1) + for i1 := uint32(0); i1 < ln1; i1++ { + if !reader.IsNil() { + v := reader.ReadU32(); + _uOptArrayOptArray[i0][i1] = &v + } + } + } + } + } + _uOptArrayOptArraySet = true; + reader.Context().Pop() + case "UArrayOptArrayArray": + reader.Context().Push(field, "[][][]uint32", "type found, reading property") + if reader.IsNil() { + _uArrayOptArrayArray = nil + } else { + ln0 := reader.ReadArrayLength() + _uArrayOptArrayArray = make([][][]uint32, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + if reader.IsNil() { + _uArrayOptArrayArray[i0] = nil + } else { + ln1 := reader.ReadArrayLength() + _uArrayOptArrayArray[i0] = make([][]uint32, ln1) + for i1 := uint32(0); i1 < ln1; i1++ { + if reader.IsNil() { + _uArrayOptArrayArray[i0][i1] = nil + } else { + ln2 := reader.ReadArrayLength() + _uArrayOptArrayArray[i0][i1] = make([]uint32, ln2) + for i2 := uint32(0); i2 < ln2; i2++ { + _uArrayOptArrayArray[i0][i1][i2] = reader.ReadU32() + } + } + } + } + } + } + _uArrayOptArrayArraySet = true; + reader.Context().Pop() + case "CrazyArray": + reader.Context().Push(field, "[][][][]uint32", "type found, reading property") + if reader.IsNil() { + _crazyArray = nil + } else { + ln0 := reader.ReadArrayLength() + _crazyArray = make([][][][]uint32, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + if reader.IsNil() { + _crazyArray[i0] = nil + } else { + ln1 := reader.ReadArrayLength() + _crazyArray[i0] = make([][][]uint32, ln1) + for i1 := uint32(0); i1 < ln1; i1++ { + if reader.IsNil() { + _crazyArray[i0][i1] = nil + } else { + ln2 := reader.ReadArrayLength() + _crazyArray[i0][i1] = make([][]uint32, ln2) + for i2 := uint32(0); i2 < ln2; i2++ { + if reader.IsNil() { + _crazyArray[i0][i1][i2] = nil + } else { + ln3 := reader.ReadArrayLength() + _crazyArray[i0][i1][i2] = make([]uint32, ln3) + for i3 := uint32(0); i3 < ln3; i3++ { + _crazyArray[i0][i1][i2][i3] = reader.ReadU32() + } + } + } + } + } + } + } + } + reader.Context().Pop() + case "Object": + reader.Context().Push(field, "AnotherType", "type found, reading property") + if v := AnotherTypeRead(reader); v != nil { + _object = *v + } + _objectSet = true; + reader.Context().Pop() + case "OptObject": + reader.Context().Push(field, "*AnotherType", "type found, reading property") + if v := AnotherTypeRead(reader); v != nil { + _optObject = v + } + reader.Context().Pop() + case "ObjectArray": + reader.Context().Push(field, "[]AnotherType", "type found, reading property") + if reader.IsNil() { + _objectArray = nil + } else { + ln0 := reader.ReadArrayLength() + _objectArray = make([]AnotherType, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + if v := AnotherTypeRead(reader); v != nil { + _objectArray[i0] = *v + } + } + } + _objectArraySet = true; + reader.Context().Pop() + case "OptObjectArray": + reader.Context().Push(field, "[]*AnotherType", "type found, reading property") + if reader.IsNil() { + _optObjectArray = nil + } else { + ln0 := reader.ReadArrayLength() + _optObjectArray = make([]*AnotherType, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + if v := AnotherTypeRead(reader); v != nil { + _optObjectArray[i0] = v + } + } + } + reader.Context().Pop() + case "En": + reader.Context().Push(field, "CustomEnum", "type found, reading property") + _en = CustomEnum(reader.ReadI32()) + SanitizeCustomEnumValue(int32(_en)) + _enSet = true; + reader.Context().Pop() + case "OptEnum": + reader.Context().Push(field, "*CustomEnum", "type found, reading property") + if !reader.IsNil() { + v := CustomEnum(reader.ReadI32()) + SanitizeCustomEnumValue(int32(v)) + _optEnum = &v + } + reader.Context().Pop() + case "EnumArray": + reader.Context().Push(field, "[]CustomEnum", "type found, reading property") + if reader.IsNil() { + _enumArray = nil + } else { + ln0 := reader.ReadArrayLength() + _enumArray = make([]CustomEnum, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + _enumArray[i0] = CustomEnum(reader.ReadI32()) + SanitizeCustomEnumValue(int32(_enumArray[i0])) + } + } + _enumArraySet = true; + reader.Context().Pop() + case "OptEnumArray": + reader.Context().Push(field, "[]*CustomEnum", "type found, reading property") + if reader.IsNil() { + _optEnumArray = nil + } else { + ln0 := reader.ReadArrayLength() + _optEnumArray = make([]*CustomEnum, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + if !reader.IsNil() { + v := CustomEnum(reader.ReadI32()) + SanitizeCustomEnumValue(int32(v)) + _optEnumArray[i0] = &v + } + } + } + reader.Context().Pop() + case "Map": + reader.Context().Push(field, "map[string]int32", "type found, reading property") + if reader.IsNil() { + _map = nil + } else { + ln0 := reader.ReadMapLength() + _map = make(map[string]int32) + for j0 := uint32(0); j0 < ln0; j0++ { + i0 := reader.ReadString() + _map[i0] = reader.ReadI32() + } + } + _mapSet = true; + reader.Context().Pop() + case "MapOfArr": + reader.Context().Push(field, "map[string][]int32", "type found, reading property") + if reader.IsNil() { + _mapOfArr = nil + } else { + ln0 := reader.ReadMapLength() + _mapOfArr = make(map[string][]int32) + for j0 := uint32(0); j0 < ln0; j0++ { + i0 := reader.ReadString() + if reader.IsNil() { + _mapOfArr[i0] = nil + } else { + ln1 := reader.ReadArrayLength() + _mapOfArr[i0] = make([]int32, ln1) + for i1 := uint32(0); i1 < ln1; i1++ { + _mapOfArr[i0][i1] = reader.ReadI32() + } + } + } + } + _mapOfArrSet = true; + reader.Context().Pop() + case "MapOfObj": + reader.Context().Push(field, "map[string]AnotherType", "type found, reading property") + if reader.IsNil() { + _mapOfObj = nil + } else { + ln0 := reader.ReadMapLength() + _mapOfObj = make(map[string]AnotherType) + for j0 := uint32(0); j0 < ln0; j0++ { + i0 := reader.ReadString() + if v := AnotherTypeRead(reader); v != nil { + _mapOfObj[i0] = *v + } + } + } + _mapOfObjSet = true; + reader.Context().Pop() + case "MapOfArrOfObj": + reader.Context().Push(field, "map[string][]AnotherType", "type found, reading property") + if reader.IsNil() { + _mapOfArrOfObj = nil + } else { + ln0 := reader.ReadMapLength() + _mapOfArrOfObj = make(map[string][]AnotherType) + for j0 := uint32(0); j0 < ln0; j0++ { + i0 := reader.ReadString() + if reader.IsNil() { + _mapOfArrOfObj[i0] = nil + } else { + ln1 := reader.ReadArrayLength() + _mapOfArrOfObj[i0] = make([]AnotherType, ln1) + for i1 := uint32(0); i1 < ln1; i1++ { + if v := AnotherTypeRead(reader); v != nil { + _mapOfArrOfObj[i0][i1] = *v + } + } + } + } + } + _mapOfArrOfObjSet = true; + reader.Context().Pop() + } + reader.Context().Pop() + } + + if (!_strSet) { + panic(reader.Context().PrintWithContext("Missing required property: 'str: String'")) + } + if (!_uSet) { + panic(reader.Context().PrintWithContext("Missing required property: 'u: UInt'")) + } + if (!_u8Set) { + panic(reader.Context().PrintWithContext("Missing required property: 'u8: UInt8'")) + } + if (!_u16Set) { + panic(reader.Context().PrintWithContext("Missing required property: 'u16: UInt16'")) + } + if (!_u32Set) { + panic(reader.Context().PrintWithContext("Missing required property: 'u32: UInt32'")) + } + if (!_iSet) { + panic(reader.Context().PrintWithContext("Missing required property: 'i: Int'")) + } + if (!_i8Set) { + panic(reader.Context().PrintWithContext("Missing required property: 'i8: Int8'")) + } + if (!_i16Set) { + panic(reader.Context().PrintWithContext("Missing required property: 'i16: Int16'")) + } + if (!_i32Set) { + panic(reader.Context().PrintWithContext("Missing required property: 'i32: Int32'")) + } + if (!_bigintSet) { + panic(reader.Context().PrintWithContext("Missing required property: 'bigint: BigInt'")) + } + if (!_bignumberSet) { + panic(reader.Context().PrintWithContext("Missing required property: 'bignumber: BigNumber'")) + } + if (!_jsonSet) { + panic(reader.Context().PrintWithContext("Missing required property: 'json: JSON'")) + } + if (!_bytesSet) { + panic(reader.Context().PrintWithContext("Missing required property: 'bytes: Bytes'")) + } + if (!_booleanSet) { + panic(reader.Context().PrintWithContext("Missing required property: 'boolean: Boolean'")) + } + if (!_uArraySet) { + panic(reader.Context().PrintWithContext("Missing required property: 'uArray: [UInt]'")) + } + if (!_uArrayArraySet) { + panic(reader.Context().PrintWithContext("Missing required property: 'uArrayArray: [[UInt]]'")) + } + if (!_uOptArrayOptArraySet) { + panic(reader.Context().PrintWithContext("Missing required property: 'uOptArrayOptArray: [[UInt32]]'")) + } + if (!_uArrayOptArrayArraySet) { + panic(reader.Context().PrintWithContext("Missing required property: 'uArrayOptArrayArray: [[[UInt32]]]'")) + } + if (!_objectSet) { + panic(reader.Context().PrintWithContext("Missing required property: 'object: AnotherType'")) + } + if (!_objectArraySet) { + panic(reader.Context().PrintWithContext("Missing required property: 'objectArray: [AnotherType]'")) + } + if (!_enSet) { + panic(reader.Context().PrintWithContext("Missing required property: 'en: CustomEnum'")) + } + if (!_enumArraySet) { + panic(reader.Context().PrintWithContext("Missing required property: 'enumArray: [CustomEnum]'")) + } + if (!_mapSet) { + panic(reader.Context().PrintWithContext("Missing required property: 'map: Map'")) + } + if (!_mapOfArrSet) { + panic(reader.Context().PrintWithContext("Missing required property: 'mapOfArr: Map'")) + } + if (!_mapOfObjSet) { + panic(reader.Context().PrintWithContext("Missing required property: 'mapOfObj: Map'")) + } + if (!_mapOfArrOfObjSet) { + panic(reader.Context().PrintWithContext("Missing required property: 'mapOfArrOfObj: Map'")) + } + + return &CustomType{ + Str: _str, + OptStr: _optStr, + U: _u, + OptU: _optU, + M_u8: _u8, + M_u16: _u16, + M_u32: _u32, + I: _i, + M_i8: _i8, + M_i16: _i16, + M_i32: _i32, + Bigint: _bigint, + OptBigint: _optBigint, + Bignumber: _bignumber, + OptBignumber: _optBignumber, + Json: _json, + OptJson: _optJson, + Bytes: _bytes, + OptBytes: _optBytes, + M_boolean: _boolean, + OptBoolean: _optBoolean, + UArray: _uArray, + UOptArray: _uOptArray, + OptUOptArray: _optUOptArray, + OptStrOptArray: _optStrOptArray, + UArrayArray: _uArrayArray, + UOptArrayOptArray: _uOptArrayOptArray, + UArrayOptArrayArray: _uArrayOptArrayArray, + CrazyArray: _crazyArray, + Object: _object, + OptObject: _optObject, + ObjectArray: _objectArray, + OptObjectArray: _optObjectArray, + En: _en, + OptEnum: _optEnum, + EnumArray: _enumArray, + OptEnumArray: _optEnumArray, + Map: _map, + MapOfArr: _mapOfArr, + MapOfObj: _mapOfObj, + MapOfArrOfObj: _mapOfArrOfObj, + } +} \ No newline at end of file diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/env.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/env.go new file mode 100644 index 0000000000..3ee18a765c --- /dev/null +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/env.go @@ -0,0 +1,27 @@ +package types + +import ( + "github.com/consideritdone/polywrap-go/polywrap/msgpack" +) + +type Env struct { + Prop string + OptProp *string + OptMap map[string]*int32 +} + +func EnvToBuffer(value *Env) []byte { + return serializeEnv(value) +} + +func EnvFromBuffer(data []byte) *Env { + return deserializeEnv(data) +} + +func EnvWrite(writer msgpack.Write, value *Env) { + writeEnv(writer, value) +} + +func EnvRead(reader msgpack.Read) *Env { + return readEnv(reader) +} diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/env_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/env_serialization.go new file mode 100644 index 0000000000..5b7e8a9345 --- /dev/null +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/env_serialization.go @@ -0,0 +1,115 @@ +package types + +import ( + "github.com/consideritdone/polywrap-go/polywrap/msgpack" +) + +func serializeEnv(value *Env) []byte { + ctx := msgpack.NewContext("Serializing (encoding) env-type: Env") + encoder := msgpack.NewWriteEncoder(ctx) + writeEnv(encoder, value) + return encoder.Buffer() +} + +func writeEnv(writer msgpack.Write, value *Env) { + writer.WriteMapLength(3) + writer.Context().Push("Prop", "string", "writing property") + writer.WriteString("Prop") + { + v := value.Prop + writer.WriteString(v) + } + writer.Context().Pop() + writer.Context().Push("OptProp", "*string", "writing property") + writer.WriteString("OptProp") + { + v := value.OptProp + if v == nil { + writer.WriteNil() + } else { + writer.WriteString(*v) + } + } + writer.Context().Pop() + writer.Context().Push("OptMap", "map[string]*int32", "writing property") + writer.WriteString("OptMap") + if value.OptMap == nil { + writer.WriteNil() + } else if len(value.OptMap) == 0 { + writer.WriteNil() + } else { + for i0 := range value.OptMap { + writer.WriteString(i0) + { + v := value.OptMap[i0] + if v == nil { + writer.WriteNil() + } else { + writer.WriteI32(*v) + } + } + } + } + writer.Context().Pop() +} + +func deserializeEnv(data []byte) *Env { + ctx := msgpack.NewContext("Deserializing (decoding) env-type: Env") + reader := msgpack.NewReadDecoder(ctx, data) + return readEnv(reader) +} + +func readEnv(reader msgpack.Read) *Env { + var ( + _prop string + _propSet bool + _optProp *string + _optMap map[string]*int32 + ) + + for i := int32(reader.ReadMapLength()); i > 0; i-- { + field := reader.ReadString() + reader.Context().Push(field, "unknown", "searching for property type") + switch field { + case "Prop": + reader.Context().Push(field, "string", "type found, reading property") + _prop = reader.ReadString() + _propSet = true + reader.Context().Pop() + case "OptProp": + reader.Context().Push(field, "*string", "type found, reading property") + if !reader.IsNil() { + v := reader.ReadString() + _optProp = &v + } + reader.Context().Pop() + case "OptMap": + reader.Context().Push(field, "map[string]*int32", "type found, reading property") + if reader.IsNil() { + _optMap = nil + } else { + ln0 := reader.ReadMapLength() + _optMap = make(map[string]*int32) + for j0 := uint32(0); j0 < ln0; j0++ { + i0 := reader.ReadString() + if !reader.IsNil() { + v := reader.ReadI32() + _optMap[i0] = &v + } + } + } + reader.Context().Pop() + } + reader.Context().Pop() + } + + if !_propSet { + panic(reader.Context().PrintWithContext("Missing required property: 'prop: String'")) + } + + return &Env{ + Prop: _prop, + OptProp: _optProp, + OptMap: _optMap, + } +} From 5ad800a731b17c5eacf7fb0eb0caeeccc2cf3e31 Mon Sep 17 00:00:00 2001 From: ramil Date: Tue, 16 Aug 2022 15:06:00 +0300 Subject: [PATCH 04/65] debug: parse template filename --- .../bind/src/bindings/golang/wasm-go/index.ts | 74 +++++++++++-------- packages/schema/bind/src/bindings/utils.ts | 2 +- 2 files changed, 44 insertions(+), 32 deletions(-) diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/index.ts b/packages/schema/bind/src/bindings/golang/wasm-go/index.ts index 4704b19d59..e577b0da3a 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/index.ts +++ b/packages/schema/bind/src/bindings/golang/wasm-go/index.ts @@ -34,7 +34,7 @@ export const generateBinding: GenerateBindingFn = ( for (const objectType of abi.objectTypes) { output.entries.push({ type: "Directory", - name: objectType.type, + name: "abc", data: renderTemplates( templatePath("object-type"), objectType, @@ -43,6 +43,18 @@ export const generateBinding: GenerateBindingFn = ( }); } + // if (abi.moduleType) { + // output.entries.push({ + // type: "Directory", + // name: "types", + // data: renderTemplates( + // templatePath("types"), + // abi.moduleType, + // subTemplates + // ), + // }); + // } + // Generate imported folder const importEntries: OutputEntry[] = []; @@ -123,38 +135,38 @@ export const generateBinding: GenerateBindingFn = ( // } // // Generate module type folders - if (abi.moduleType) { - output.entries.push({ - type: "Directory", - name: abi.moduleType.type, - data: renderTemplates( - templatePath("module-type"), - abi.moduleType, - subTemplates - ), - }); - } - - // Generate enum type folders - for (const enumType of abi.enumTypes) { - output.entries.push({ - type: "Directory", - name: enumType.type, - data: renderTemplates(templatePath("enum-type"), enumType, subTemplates), - }); - } - - // Generate env type folders - if (abi.envType) { - output.entries.push({ - type: "Directory", - name: abi.envType.type, - data: renderTemplates(templatePath("object-type"), abi.envType, subTemplates), - }); - } + // if (abi.moduleType) { + // output.entries.push({ + // type: "Directory", + // name: abi.moduleType.type, + // data: renderTemplates( + // templatePath("module-type"), + // abi.moduleType, + // subTemplates + // ), + // }); + // } + // + // // Generate enum type folders + // for (const enumType of abi.enumTypes) { + // output.entries.push({ + // type: "Directory", + // name: enumType.type, + // data: renderTemplates(templatePath("enum-type"), enumType, subTemplates), + // }); + // } + // + // // Generate env type folders + // if (abi.envType) { + // output.entries.push({ + // type: "Directory", + // name: abi.envType.type, + // data: renderTemplates(templatePath("object-type"), abi.envType, subTemplates), + // }); + // } // Generate root entry file - output.entries.push(...renderTemplates(templatePath(""), abi, subTemplates)); + // output.entries.push(...renderTemplates(templatePath(""), abi, subTemplates)); return result; }; diff --git a/packages/schema/bind/src/bindings/utils.ts b/packages/schema/bind/src/bindings/utils.ts index fac191d695..f3be1c7846 100644 --- a/packages/schema/bind/src/bindings/utils.ts +++ b/packages/schema/bind/src/bindings/utils.ts @@ -27,7 +27,7 @@ export function renderTemplates( if (data) { output.push({ type: "File", - name: name.replace("-", "."), + name: name.replace("-", ".").replace("%type%", (view as {type: string}).type.toLowerCase()), data, }); } From bbf6f57a706aa01f49b9a9fe7c46be32140dd6c0 Mon Sep 17 00:00:00 2001 From: n0cte Date: Fri, 19 Aug 2022 02:39:50 +0300 Subject: [PATCH 05/65] add serialization and deserialization for impors, interfaces, modules --- .../src/bindings/golang/wasm-go/functions.ts | 8 + .../bind/src/bindings/golang/wasm-go/index.ts | 216 +++++++++--------- ...ype-go.mustache => Enum%type%-go.mustache} | 0 .../Env%type%-go.mustache} | 0 .../Env%type%Serialization-go.mustache} | 0 .../imported/enum-type/Enum%type%-go.mustache | 39 ++++ .../imported/env-type/Env%type%-go.mustache | 31 +++ .../Env%type%Serialization-go.mustache | 109 +++++++++ .../interface-type/%type%-go.mustache | 19 ++ .../%type%Serialization-go.mustache | 84 +++++++ .../module-type/%type%Wrapped-go.mustache | 39 ++++ .../object-type/Object%type%-go.mustache | 31 +++ .../Object%type%Serialization-go.mustache | 109 +++++++++ .../interface-type/%type%-go.mustache | 19 ++ .../%type%Serialization-go.mustache | 115 ++++++++++ .../module-type/%type%Wrapped-go.mustache | 35 +++ .../module-type/serialization-go.mustache | 69 ------ .../object-type/Object%type%-go.mustache | 31 +++ .../Object%type%Serialization-go.mustache | 109 +++++++++ .../value_deserialize_array.mustache | 23 ++ .../templates/value_deserialize_enum.mustache | 11 + .../templates/value_deserialize_map.mustache | 24 ++ .../value_deserialize_object.mustache | 8 + .../value_deserialize_scalar.mustache | 9 + .../templates/value_serialize_array.mustache | 23 ++ .../templates/value_serialize_enum.mustache | 13 ++ .../templates/value_serialize_map.mustache | 24 ++ .../templates/value_serialize_object.mustache | 9 + .../templates/value_serialize_scalar.mustache | 13 ++ packages/schema/bind/src/bindings/utils.ts | 15 +- 30 files changed, 1060 insertions(+), 175 deletions(-) rename packages/schema/bind/src/bindings/golang/wasm-go/templates/enum-type/{type-go.mustache => Enum%type%-go.mustache} (100%) rename packages/schema/bind/src/bindings/golang/wasm-go/templates/{object-type/main-go.mustache => env-type/Env%type%-go.mustache} (100%) rename packages/schema/bind/src/bindings/golang/wasm-go/templates/{object-type/serialization-go.mustache => env-type/Env%type%Serialization-go.mustache} (100%) create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/enum-type/Enum%type%-go.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/env-type/Env%type%-go.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/env-type/Env%type%Serialization-go.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/interface-type/%type%-go.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/module-type/%type%Serialization-go.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/module-type/%type%Wrapped-go.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/object-type/Object%type%-go.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/object-type/Object%type%Serialization-go.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/interface-type/%type%-go.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/module-type/%type%Serialization-go.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/module-type/%type%Wrapped-go.mustache delete mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/module-type/serialization-go.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/Object%type%-go.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/Object%type%Serialization-go.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_array.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_enum.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_map.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_object.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_scalar.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_array.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_enum.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_map.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_object.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_scalar.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/functions.ts b/packages/schema/bind/src/bindings/golang/wasm-go/functions.ts index ee1ab96b97..9b6c0d1470 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/functions.ts +++ b/packages/schema/bind/src/bindings/golang/wasm-go/functions.ts @@ -82,6 +82,14 @@ export const readPointer: MustacheFn = () => { } } +export const toSnakeCase: MustacheFn = () => { + return (text: string, render: (template: string) => string): string => { + text = render(text).replace( /([A-Z])/g, "_$1"); + text = text.startsWith("_") ? text.slice(1) : text; + return text.toLowerCase(); + } +} + export const handleKeywords: MustacheFn = () => { return (text: string, render: (template: string) => string): string => { const rendered: string = render(text); diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/index.ts b/packages/schema/bind/src/bindings/golang/wasm-go/index.ts index e577b0da3a..bd4823ffda 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/index.ts +++ b/packages/schema/bind/src/bindings/golang/wasm-go/index.ts @@ -18,6 +18,12 @@ const subTemplates = loadSubTemplates(templatesDir.entries); const templatePath = (subpath: string) => path.join(__dirname, "./templates", subpath); +function camel2snake(str: string): string { + str = str.replace( /([A-Z])/g, "_$1"); + str = str.startsWith("_") ? str.slice(1) : str; + return str.toLowerCase(); +} + export const generateBinding: GenerateBindingFn = ( options: BindOptions ): BindOutput => { @@ -34,7 +40,7 @@ export const generateBinding: GenerateBindingFn = ( for (const objectType of abi.objectTypes) { output.entries.push({ type: "Directory", - name: "abc", + name: "types", data: renderTemplates( templatePath("object-type"), objectType, @@ -59,114 +65,114 @@ export const generateBinding: GenerateBindingFn = ( const importEntries: OutputEntry[] = []; // Generate imported module type folders - // for (const importedModuleType of abi.importedModuleTypes) { - // importEntries.push({ - // type: "Directory", - // name: importedModuleType.type, - // data: renderTemplates( - // templatePath("imported/module-type"), - // importedModuleType, - // subTemplates - // ), - // }); - // } - // + for (const importedModuleType of abi.importedModuleTypes) { + importEntries.push({ + type: "Directory", + name: `${camel2snake(importedModuleType.namespace)}`, + data: renderTemplates( + templatePath("imported/module-type"), + importedModuleType, + subTemplates + ), + }); + } + // // Generate imported env type folders - // for (const importedEnvType of abi.importedEnvTypes) { - // importEntries.push({ - // type: "Directory", - // name: importedEnvType.type, - // data: renderTemplates( - // templatePath("imported/env-type"), - // importedEnvType, - // subTemplates - // ), - // }); - // } - // - // // Generate imported enum type folders - // for (const importedEnumType of abi.importedEnumTypes) { - // importEntries.push({ - // type: "Directory", - // name: importedEnumType.type, - // data: renderTemplates( - // templatePath("imported/enum-type"), - // importedEnumType, - // subTemplates - // ), - // }); - // } - // - // // Generate imported object type folders - // for (const importedObectType of abi.importedObjectTypes) { - // importEntries.push({ - // type: "Directory", - // name: importedObectType.type, - // data: renderTemplates( - // templatePath("imported/object-type"), - // importedObectType, - // subTemplates - // ), - // }); - // } - // - // if (importEntries.length) { - // output.entries.push({ - // type: "Directory", - // name: "imported", - // data: [ - // ...importEntries, - // ...renderTemplates(templatePath("imported"), abi, subTemplates), - // ], - // }); - // } - // - // // Generate interface type folders - // for (const interfaceType of abi.interfaceTypes) { - // output.entries.push({ - // type: "Directory", - // name: interfaceType.type, - // data: renderTemplates( - // templatePath("interface-type"), - // interfaceType, - // subTemplates - // ), - // }); - // } - // + for (const importedEnvType of abi.importedEnvTypes) { + importEntries.push({ + type: "Directory", + name: `${camel2snake(importedEnvType.namespace)}`, + data: renderTemplates( + templatePath("imported/env-type"), + importedEnvType, + subTemplates + ), + }); + } + + // Generate imported enum type folders + for (const importedEnumType of abi.importedEnumTypes) { + importEntries.push({ + type: "Directory", + name: `${camel2snake(importedEnumType.namespace)}`, + data: renderTemplates( + templatePath("imported/enum-type"), + importedEnumType, + subTemplates + ), + }); + } + + // Generate imported object type folders + for (const importedObectType of abi.importedObjectTypes) { + importEntries.push({ + type: "Directory", + name: `${camel2snake(importedObectType.namespace)}`, + data: renderTemplates( + templatePath("imported/object-type"), + importedObectType, + subTemplates + ), + }); + } + + if (importEntries.length) { + output.entries.push({ + type: "Directory", + name: "imported", + data: [ + ...importEntries, + ...renderTemplates(templatePath("imported"), abi, subTemplates), + ], + }); + } + + // Generate interface type folders + for (const interfaceType of abi.interfaceTypes) { + output.entries.push({ + type: "Directory", + name: "interfaces", + data: renderTemplates( + templatePath("interface-type"), + interfaceType, + subTemplates + ), + }); + } + // Generate module type folders - // if (abi.moduleType) { - // output.entries.push({ - // type: "Directory", - // name: abi.moduleType.type, - // data: renderTemplates( - // templatePath("module-type"), - // abi.moduleType, - // subTemplates - // ), - // }); - // } - // - // // Generate enum type folders - // for (const enumType of abi.enumTypes) { - // output.entries.push({ - // type: "Directory", - // name: enumType.type, - // data: renderTemplates(templatePath("enum-type"), enumType, subTemplates), - // }); - // } - // - // // Generate env type folders - // if (abi.envType) { - // output.entries.push({ - // type: "Directory", - // name: abi.envType.type, - // data: renderTemplates(templatePath("object-type"), abi.envType, subTemplates), - // }); - // } + if (abi.moduleType) { + output.entries.push({ + type: "Directory", + name: "types", + data: renderTemplates( + templatePath("module-type"), + abi.moduleType, + subTemplates + ), + }); + } + + // Generate enum type folders + for (const enumType of abi.enumTypes) { + output.entries.push({ + type: "Directory", + name: "types", + data: renderTemplates(templatePath("enum-type"), enumType, subTemplates), + }); + } + + // Generate env type folders + if (abi.envType) { + output.entries.push({ + type: "Directory", + name: "types", + data: renderTemplates(templatePath("object-type"), abi.envType, subTemplates), + }); + } // Generate root entry file - // output.entries.push(...renderTemplates(templatePath(""), abi, subTemplates)); + output.entries.push(...renderTemplates(templatePath(""), abi, subTemplates)); return result; }; diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/enum-type/type-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/enum-type/Enum%type%-go.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/enum-type/type-go.mustache rename to packages/schema/bind/src/bindings/golang/wasm-go/templates/enum-type/Enum%type%-go.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/main-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/env-type/Env%type%-go.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/main-go.mustache rename to packages/schema/bind/src/bindings/golang/wasm-go/templates/env-type/Env%type%-go.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/env-type/Env%type%Serialization-go.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/serialization-go.mustache rename to packages/schema/bind/src/bindings/golang/wasm-go/templates/env-type/Env%type%Serialization-go.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/enum-type/Enum%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/enum-type/Enum%type%-go.mustache new file mode 100644 index 0000000000..f4713678fc --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/enum-type/Enum%type%-go.mustache @@ -0,0 +1,39 @@ +package {{#toSnakeCase}}{{namespace}}{{/toSnakeCase}} + +type {{#toUpper}}{{type}}{{/toUpper}} int32 + +const ( + {{#constants}} + {{#toUpper}}{{type}}{{/toUpper}}{{.}} = iota + {{/constants}} + {{#toFirstLower}}{{type}}{{/toFirstLower}}Max = iota +) + +func Sanitize{{#toUpper}}{{type}}{{/toUpper}}Value(value int32) { + if !(value >= 0 && value < int32({{#toFirstLower}}{{type}}{{/toFirstLower}}Max)) { + panic("Invalid value for enum '{{#toUpper}}{{type}}{{/toUpper}}'") + } +} + +func Get{{#toUpper}}{{type}}{{/toUpper}}Value(key string) {{#toUpper}}{{type}}{{/toUpper}} { + switch key { + {{#constants}} + case "{{.}}": + return {{#toUpper}}{{type}}{{/toUpper}}{{.}} + {{/constants}} + default: + panic("Invalid key for enum '{{#toUpper}}{{type}}{{/toUpper}}'") + } +} + +func Get{{#toUpper}}{{type}}{{/toUpper}}Key(value {{#toUpper}}{{type}}{{/toUpper}}) string { + Sanitize{{#toUpper}}{{type}}{{/toUpper}}Value(int32(value)) + switch value { + {{#constants}} + case {{#toUpper}}{{type}}{{/toUpper}}{{.}}: + return "{{.}}" + {{/constants}} + default: + panic("Invalid value for enum '{{#toUpper}}{{type}}{{/toUpper}}'") + } +} \ No newline at end of file diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/env-type/Env%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/env-type/Env%type%-go.mustache new file mode 100644 index 0000000000..ec612efbee --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/env-type/Env%type%-go.mustache @@ -0,0 +1,31 @@ +package {{#toSnakeCase}}{{namespace}}{{/toSnakeCase}} + +import ( + "github.com/consideritdone/polywrap-go/polywrap/msgpack" + "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" + "github.com/consideritdone/polywrap-go/polywrap/msgpack/container" + "github.com/valyala/fastjson" +) + +type {{#toUpper}}{{type}}{{/toUpper}} struct { + {{#properties}} + {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} + {{/properties}} +} + +func {{#toUpper}}{{type}}{{/toUpper}}ToBuffer(value *{{#toUpper}}{{type}}{{/toUpper}}) []byte { + return serialize{{#toUpper}}{{type}}{{/toUpper}}(value) +} + +func {{#toUpper}}{{type}}{{/toUpper}}FromBuffer(data []byte) *{{#toUpper}}{{type}}{{/toUpper}} { + return deserialize{{#toUpper}}{{type}}{{/toUpper}}(data) +} + +func {{#toUpper}}{{type}}{{/toUpper}}Write(writer msgpack.Write, value *{{#toUpper}}{{type}}{{/toUpper}}) { + write{{#toUpper}}{{type}}{{/toUpper}}(writer, value) +} + +func {{#toUpper}}{{type}}{{/toUpper}}Read(reader msgpack.Read) *{{#toUpper}}{{type}}{{/toUpper}} { + return read{{#toUpper}}{{type}}{{/toUpper}}(reader) +} + diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/env-type/Env%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/env-type/Env%type%Serialization-go.mustache new file mode 100644 index 0000000000..c8a2d79e65 --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/env-type/Env%type%Serialization-go.mustache @@ -0,0 +1,109 @@ +package {{#toSnakeCase}}{{namespace}}{{/toSnakeCase}} + +import ( + "github.com/consideritdone/polywrap-go/polywrap/msgpack" + "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" + "github.com/consideritdone/polywrap-go/polywrap/msgpack/container" + "github.com/valyala/fastjson" +) + +func serialize{{#toUpper}}{{type}}{{/toUpper}}(value *{{#toUpper}}{{type}}{{/toUpper}}) []byte { + ctx := msgpack.NewContext("Serializing (encoding) env-type: {{#toUpper}}{{type}}{{/toUpper}}") + encoder := msgpack.NewWriteEncoder(ctx) + write{{#toUpper}}{{type}}{{/toUpper}}(encoder, value) + return encoder.Buffer() +} + +func write{{#toUpper}}{{type}}{{/toUpper}}(writer msgpack.Write, value *{{#toUpper}}{{type}}{{/toUpper}}) { + writer.WriteMapLength({{properties.length}}) + {{#properties}} + writer.Context().Push("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") + writer.WriteString("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}") + {{#scalar}} + {{> serialize_scalar}} + {{/scalar}} + {{#array}} + {{#startIter}}{{/startIter}} + {{> serialize_array}} + {{#stopIter}}{{/stopIter}} + {{/array}} + {{#map}} + {{#startIter}}{{/startIter}} + {{> serialize_map}} + {{#stopIter}}{{/stopIter}} + {{/map}} + {{#object}} + {{> serialize_object}} + {{/object}} + {{#enum}} + {{> serialize_enum}} + {{/enum}} + writer.Context().Pop() + {{/properties}} +} + +func deserialize{{#toUpper}}{{type}}{{/toUpper}}(data []byte) *{{#toUpper}}{{type}}{{/toUpper}} { + ctx := msgpack.NewContext("Deserializing (decoding) env-type: {{#toUpper}}{{type}}{{/toUpper}}") + reader := msgpack.NewReadDecoder(ctx, data) + return read{{#toUpper}}{{type}}{{/toUpper}}(reader) +} + +func read{{#toUpper}}{{type}}{{/toUpper}}(reader msgpack.Read) *{{#toUpper}}{{type}}{{/toUpper}} { + var ( + {{#properties}} + _{{name}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} + {{#required}} + _{{name}}Set bool + {{/required}} + {{/properties}} + ) + + for i := int32(reader.ReadMapLength()); i > 0; i-- { + field := reader.ReadString() + reader.Context().Push(field, "unknown", "searching for property type"); + switch field { + {{#properties}} + case "{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}": + reader.Context().Push(field, "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "type found, reading property") + {{#scalar}} + {{> deserialize_scalar}} + {{/scalar}} + {{#enum}} + {{> deserialize_enum}} + {{/enum}} + {{#array}} + {{#startIter}}{{/startIter}} + {{> deserialize_array}} + {{#stopIter}}{{/stopIter}} + {{/array}} + {{#map}} + {{#startIter}}{{/startIter}} + {{> deserialize_map}} + {{#stopIter}}{{/stopIter}} + {{/map}} + {{#object}} + {{> deserialize_object}} + {{/object}} + {{#required}} + _{{name}}Set = true; + {{/required}} + reader.Context().Pop() + {{/properties}} + } + reader.Context().Pop() + } + + {{#properties}} + {{#required}} + if (!_{{name}}Set) { + panic(reader.Context().PrintWithContext("Missing required property: '{{name}}: {{type}}'")) + } + {{/required}} + {{/properties}} + + return &{{#toUpper}}{{type}}{{/toUpper}}{ + {{#properties}} + {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}: _{{name}}, + {{/properties}} + } +} \ No newline at end of file diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/interface-type/%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/interface-type/%type%-go.mustache new file mode 100644 index 0000000000..2db03af454 --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/interface-type/%type%-go.mustache @@ -0,0 +1,19 @@ +package {{#toSnakeCase}}{{namespace}}{{/toSnakeCase}} + +{{#capabilities}} +{{#getImplementations}} +{{#enabled}} +import "github.com/consideritdone/polywrap-go/polywrap" +{{/enabled}} +{{/getImplementations}} +{{/capabilities}} + +{{#capabilities}} +{{#getImplementations}} +{{#enabled}} +func {{#toUpper}}{{namespace}}{{/toUpper}}Implementations() []string { + return polywrap.WrapGetImplementations("{{uri}}") +} +{{/enabled}} +{{/getImplementations}} +{{/capabilities}} \ No newline at end of file diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/module-type/%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/module-type/%type%Serialization-go.mustache new file mode 100644 index 0000000000..45e7b0762d --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/module-type/%type%Serialization-go.mustache @@ -0,0 +1,84 @@ +package {{#toSnakeCase}}{{namespace}}{{/toSnakeCase}} + +import ( + "github.com/consideritdone/polywrap-go/polywrap/msgpack" + "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" + "github.com/consideritdone/polywrap-go/polywrap/msgpack/container" + "github.com/valyala/fastjson" +) + +{{#methods}} +type Args{{#toUpper}}{{name}}{{/toUpper}} struct { + {{#arguments}} + {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} + {{/arguments}} +} + +func Serialize{{#toUpper}}{{name}}{{/toUpper}}Args(value *Args{{#toUpper}}{{name}}{{/toUpper}}) []byte { + ctx := msgpack.NewContext("Serializing module-type: {{#toUpper}}{{name}}{{/toUpper}}") + encoder := msgpack.NewWriteEncoder(ctx) + Write{{#toUpper}}{{name}}{{/toUpper}}Args(encoder, value); + return encoder.Buffer() +} + +func Write{{#toUpper}}{{name}}{{/toUpper}}Args(writer msgpack.Write, value *Args{{#toUpper}}{{name}}{{/toUpper}}) { + writer.WriteMapLength({{arguments.length}}) + {{#arguments}} + writer.Context().Push("{{name}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") + writer.WriteString("{{name}}") + {{#scalar}} + {{> value_serialize_scalar}} + {{/scalar}} + {{#array}} + {{#startIter}}{{/startIter}} + {{> value_serialize_array}} + {{#stopIter}}{{/stopIter}} + {{/array}} + {{#map}} + {{#startIter}}{{/startIter}} + {{> value_serialize_map}} + {{#stopIter}}{{/stopIter}} + {{/map}} + {{#object}} + {{> value_serialize_object}} + {{/object}} + {{#enum}} + {{> value_serialize_enum}} + {{/enum}} + writer.Context().Pop() + {{/arguments}} +} + +export function Deserialize{{#toUpper}}{{name}}{{/toUpper}}Result(argsBuf []byte): {{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}} { + ctx := msgpack.NewContext("Deserializing module-type: {{#toUpper}}{{name}}{{/toUpper}}") + reader := msgpack.NewReadDecoder(ctx, argsBuf) + + {{#return}} + reader.Context().Push("{{name}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "reading function output"); + var value {{#toWasm}}{{toGraphQLType}}{{/toWasm}} + {{#scalar}} + {{> value_deserialize_scalar}} + {{/scalar}} + {{#array}} + {{#startIter}}{{/startIter}} + {{> value_deserialize_array}} + {{#stopIter}}{{/stopIter}} + {{/array}} + {{#map}} + {{#startIter}}{{/startIter}} + {{> value_deserialize_map}} + {{#stopIter}}{{/stopIter}} + {{/map}} + {{#object}} + {{> value_deserialize_object}} + {{/object}} + {{#enum}} + {{> value_deserialize_enum}} + {{/enum}} + writer.Context().Pop() + return value + {{/return}} +} + +{{/methods}} + diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/module-type/%type%Wrapped-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/module-type/%type%Wrapped-go.mustache new file mode 100644 index 0000000000..b7d1e09512 --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/module-type/%type%Wrapped-go.mustache @@ -0,0 +1,39 @@ +package {{#toSnakeCase}}{{namespace}}{{/toSnakeCase}} + +{{#methods.length}} +import ( + "github.com/consideritdone/polywrap-go/polywrap" + "some/library/to/methods" +) +{{/methods.length}} + +{{^isInterface}} +{{#methods}} +func {{#toUpper}}{{type}}{{/toUpper}}{{#toUpper}}{{name}}{{/toUpper}}(args *Args{{#toUpper}}{{name}}{{/toUpper}}) ({{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}, error) { + argsBuf := Serialize{{#toUpper}}{{name}}{{/toUpper}}Args(args) + data, err := polywrap.WrapSubinvoke("{{uri}}", "{{name}}", argsBuf) + if err != nil { + return nil, result.Error() + } + return Deserialize{{#toUpper}}{{name}}{{/toUpper}}Result(result.unwrap()), nil +} +{{^last}} + +{{/last}} +{{/methods}} +{{/isInterface}} +{{#isInterface}} +{{#methods}} +func {{#toUpper}}{{type}}{{/toUpper}}{{#toUpper}}{{name}}{{/toUpper}}(uri string, args *Args{{#toUpper}}{{name}}{{/toUpper}}) ({{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}, error) { + argsBuf := Serialize{{#toUpper}}{{name}}{{/toUpper}}Args(args) + data, err := polywrap.WrapSubinvokeImplementation("{{uri}}", uri, "{{name}}", argsBuf) + if err != nil { + return nil, err + } + return Deserialize{{#toUpper}}{{name}}{{/toUpper}}Result(data), nil +} +{{^last}} + +{{/last}} +{{/methods}} +{{/isInterface}} \ No newline at end of file diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/object-type/Object%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/object-type/Object%type%-go.mustache new file mode 100644 index 0000000000..ec612efbee --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/object-type/Object%type%-go.mustache @@ -0,0 +1,31 @@ +package {{#toSnakeCase}}{{namespace}}{{/toSnakeCase}} + +import ( + "github.com/consideritdone/polywrap-go/polywrap/msgpack" + "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" + "github.com/consideritdone/polywrap-go/polywrap/msgpack/container" + "github.com/valyala/fastjson" +) + +type {{#toUpper}}{{type}}{{/toUpper}} struct { + {{#properties}} + {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} + {{/properties}} +} + +func {{#toUpper}}{{type}}{{/toUpper}}ToBuffer(value *{{#toUpper}}{{type}}{{/toUpper}}) []byte { + return serialize{{#toUpper}}{{type}}{{/toUpper}}(value) +} + +func {{#toUpper}}{{type}}{{/toUpper}}FromBuffer(data []byte) *{{#toUpper}}{{type}}{{/toUpper}} { + return deserialize{{#toUpper}}{{type}}{{/toUpper}}(data) +} + +func {{#toUpper}}{{type}}{{/toUpper}}Write(writer msgpack.Write, value *{{#toUpper}}{{type}}{{/toUpper}}) { + write{{#toUpper}}{{type}}{{/toUpper}}(writer, value) +} + +func {{#toUpper}}{{type}}{{/toUpper}}Read(reader msgpack.Read) *{{#toUpper}}{{type}}{{/toUpper}} { + return read{{#toUpper}}{{type}}{{/toUpper}}(reader) +} + diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/object-type/Object%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/object-type/Object%type%Serialization-go.mustache new file mode 100644 index 0000000000..c8a2d79e65 --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/object-type/Object%type%Serialization-go.mustache @@ -0,0 +1,109 @@ +package {{#toSnakeCase}}{{namespace}}{{/toSnakeCase}} + +import ( + "github.com/consideritdone/polywrap-go/polywrap/msgpack" + "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" + "github.com/consideritdone/polywrap-go/polywrap/msgpack/container" + "github.com/valyala/fastjson" +) + +func serialize{{#toUpper}}{{type}}{{/toUpper}}(value *{{#toUpper}}{{type}}{{/toUpper}}) []byte { + ctx := msgpack.NewContext("Serializing (encoding) env-type: {{#toUpper}}{{type}}{{/toUpper}}") + encoder := msgpack.NewWriteEncoder(ctx) + write{{#toUpper}}{{type}}{{/toUpper}}(encoder, value) + return encoder.Buffer() +} + +func write{{#toUpper}}{{type}}{{/toUpper}}(writer msgpack.Write, value *{{#toUpper}}{{type}}{{/toUpper}}) { + writer.WriteMapLength({{properties.length}}) + {{#properties}} + writer.Context().Push("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") + writer.WriteString("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}") + {{#scalar}} + {{> serialize_scalar}} + {{/scalar}} + {{#array}} + {{#startIter}}{{/startIter}} + {{> serialize_array}} + {{#stopIter}}{{/stopIter}} + {{/array}} + {{#map}} + {{#startIter}}{{/startIter}} + {{> serialize_map}} + {{#stopIter}}{{/stopIter}} + {{/map}} + {{#object}} + {{> serialize_object}} + {{/object}} + {{#enum}} + {{> serialize_enum}} + {{/enum}} + writer.Context().Pop() + {{/properties}} +} + +func deserialize{{#toUpper}}{{type}}{{/toUpper}}(data []byte) *{{#toUpper}}{{type}}{{/toUpper}} { + ctx := msgpack.NewContext("Deserializing (decoding) env-type: {{#toUpper}}{{type}}{{/toUpper}}") + reader := msgpack.NewReadDecoder(ctx, data) + return read{{#toUpper}}{{type}}{{/toUpper}}(reader) +} + +func read{{#toUpper}}{{type}}{{/toUpper}}(reader msgpack.Read) *{{#toUpper}}{{type}}{{/toUpper}} { + var ( + {{#properties}} + _{{name}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} + {{#required}} + _{{name}}Set bool + {{/required}} + {{/properties}} + ) + + for i := int32(reader.ReadMapLength()); i > 0; i-- { + field := reader.ReadString() + reader.Context().Push(field, "unknown", "searching for property type"); + switch field { + {{#properties}} + case "{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}": + reader.Context().Push(field, "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "type found, reading property") + {{#scalar}} + {{> deserialize_scalar}} + {{/scalar}} + {{#enum}} + {{> deserialize_enum}} + {{/enum}} + {{#array}} + {{#startIter}}{{/startIter}} + {{> deserialize_array}} + {{#stopIter}}{{/stopIter}} + {{/array}} + {{#map}} + {{#startIter}}{{/startIter}} + {{> deserialize_map}} + {{#stopIter}}{{/stopIter}} + {{/map}} + {{#object}} + {{> deserialize_object}} + {{/object}} + {{#required}} + _{{name}}Set = true; + {{/required}} + reader.Context().Pop() + {{/properties}} + } + reader.Context().Pop() + } + + {{#properties}} + {{#required}} + if (!_{{name}}Set) { + panic(reader.Context().PrintWithContext("Missing required property: '{{name}}: {{type}}'")) + } + {{/required}} + {{/properties}} + + return &{{#toUpper}}{{type}}{{/toUpper}}{ + {{#properties}} + {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}: _{{name}}, + {{/properties}} + } +} \ No newline at end of file diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/interface-type/%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/interface-type/%type%-go.mustache new file mode 100644 index 0000000000..46cc9be8e0 --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/interface-type/%type%-go.mustache @@ -0,0 +1,19 @@ +package interfaces + +{{#capabilities}} +{{#getImplementations}} +{{#enabled}} +import "github.com/consideritdone/polywrap-go/polywrap" +{{/enabled}} +{{/getImplementations}} +{{/capabilities}} + +{{#capabilities}} +{{#getImplementations}} +{{#enabled}} +func {{#toUpper}}{{namespace}}{{/toUpper}}Implementations() []string { + return polywrap.WrapGetImplementations("{{uri}}") +} +{{/enabled}} +{{/getImplementations}} +{{/capabilities}} \ No newline at end of file diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/module-type/%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/module-type/%type%Serialization-go.mustache new file mode 100644 index 0000000000..9dff688252 --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/module-type/%type%Serialization-go.mustache @@ -0,0 +1,115 @@ +package types + +import ( + "github.com/consideritdone/polywrap-go/polywrap/msgpack" + "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" + "github.com/consideritdone/polywrap-go/polywrap/msgpack/container" + "github.com/valyala/fastjson" +) + +{{#methods}} +type Args{{#toUpper}}{{name}}{{/toUpper}} struct { + {{#arguments}} + {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} + {{/arguments}} +} + +func Deserialize{{#toUpper}}{{name}}{{/toUpper}}Args(argsBuf []byte) *Args{{#toUpper}}{{name}}{{/toUpper}} { + ctx := msgpack.NewContext("Deserializing module-type: {{#toUpper}}{{name}}{{/toUpper}}") + {{#arguments.length}} + reader := msgpack.NewReadDecoder(ctx, argsBuf) + + var ( + {{#arguments}} + _{{name}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} + {{#required}} + _{{name}}Set bool + {{/required}} + {{/arguments}} + ) + + for i := int32(reader.ReadMapLength()); i > 0; i-- { + field := reader.ReadString() + reader.Context().Push(field, "unknown", "searching for property type"); + reader.Context().Pop() + switch field { + {{#arguments}} + case "{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}": + reader.Context().Push(field, "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "type found, reading property") + {{#scalar}} + {{> deserialize_scalar}} + {{/scalar}} + {{#enum}} + {{> deserialize_enum}} + {{/enum}} + {{#array}} + {{#startIter}}{{/startIter}} + {{> deserialize_array}} + {{#stopIter}}{{/stopIter}} + {{/array}} + {{#map}} + {{#startIter}}{{/startIter}} + {{> deserialize_map}} + {{#stopIter}}{{/stopIter}} + {{/map}} + {{#object}} + {{> deserialize_object}} + {{/object}} + {{#required}} + _{{name}}Set = true; + {{/required}} + reader.Context().Pop() + {{/arguments}} + } + } + + {{#arguments}} + {{#required}} + if (!_{{name}}Set) { + panic(reader.Context().PrintWithContext("Missing required property: '{{name}}: {{type}}'")) + } + {{/required}} + {{/arguments}} + {{/arguments.length}} + + return &Args{{#toUpper}}{{name}}{{/toUpper}}{ + {{#arguments}} + {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}: _{{name}}, + {{/arguments}} + } +} + +func Serialize{{#toUpper}}{{name}}{{/toUpper}}Result(value {{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}) []byte { + ctx := msgpack.NewContext("Serializing module-type: {{#toUpper}}{{name}}{{/toUpper}}") + encoder := msgpack.NewWriteEncoder(ctx) + Write{{#toUpper}}{{name}}{{/toUpper}}Result(encoder, value); + return encoder.Buffer() +} + +func Write{{#toUpper}}{{name}}{{/toUpper}}Result(writer msgpack.Write, value {{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}) { + {{#return}} + writer.Context().Push("{{name}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property"); + {{#scalar}} + {{> value_serialize_scalar}} + {{/scalar}} + {{#array}} + {{#startIter}}{{/startIter}} + {{> value_serialize_array}} + {{#stopIter}}{{/stopIter}} + {{/array}} + {{#map}} + {{#startIter}}{{/startIter}} + {{> value_serialize_map}} + {{#stopIter}}{{/stopIter}} + {{/map}} + {{#object}} + {{> value_serialize_object}} + {{/object}} + {{#enum}} + {{> value_serialize_enum}} + {{/enum}} + writer.Context().Pop() + {{/return}} +} + +{{/methods}} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/module-type/%type%Wrapped-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/module-type/%type%Wrapped-go.mustache new file mode 100644 index 0000000000..5e24b3b48a --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/module-type/%type%Wrapped-go.mustache @@ -0,0 +1,35 @@ +package types + +{{#methods.length}} +import ( + "github.com/consideritdone/polywrap-go/polywrap" + "some/library/to/methods" +) +{{/methods.length}} + +{{#methods}} +func {{#toUpper}}{{name}}{{/toUpper}}Wrapped(argsBuf []byte, envSize uint32) []byte { + var env *Env + {{#env}} + {{#required}} + if (envSize == 0) { + panic("Environment is not set, and it is required by method 'objectMethod'") + } + {{/required}} + if (envSize > 0) { + envBuf := polywrap.WrapLoadEnv(envSize); + env = EnvFromBuffer(envBuf); + } + {{/env}} + + {{#arguments.length}} + args: = Deserialize{{#toUpper}}{{name}}{{/toUpper}}Args(argsBuf) + {{/arguments.length}} + + result := methods.{{#toUpper}}{{name}}{{/toUpper}}({{#arguments.length}}args{{/arguments.length}}{{^arguments.length}}nil{{/arguments.length}}{{#env}}, env{{/env}}) + return Serialize{{#toUpper}}{{name}}{{/toUpper}}Result(result); +} +{{^last}} + +{{/last}} +{{/methods}} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/module-type/serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/module-type/serialization-go.mustache deleted file mode 100644 index f3149225b5..0000000000 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/module-type/serialization-go.mustache +++ /dev/null @@ -1,69 +0,0 @@ -package module - -import ( - "github.com/consideritdone/polywrap-go/examples/demo1/wrap/moduleTypes" - "github.com/consideritdone/polywrap-go/examples/demo1/wrap/sampleResult" - "github.com/consideritdone/polywrap-go/polywrap/msgpack" -) -{{#methods}} - -export class Args{{#toUpper}}{{name}}{{/toUpper}} { - {{#arguments}} - {{#handleKeywords}}{{name}}{{/handleKeywords}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}}; - {{/arguments}} -} - -export function deserialize{{#toUpper}}{{name}}{{/toUpper}}Args(argsBuf []byte): *moduleTypes.Args{{name}} { - context := msgpack.NewContext("Deserializing module-type: {{name}}") - {{#arguments.length}} - reader := msgpack.NewReadDecoder(context, argsBuf) - numFields := reader.ReadMapLength() - - {{#arguments}} - {{^object}} - let _{{name}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} = {{#toWasmInit}}{{toGraphQLType}}{{/toWasmInit}}; - {{/object}} - {{#required}} - let _{{name}}Set: bool = false; - {{/required}} - {{/arguments}} - - for i := numFields; i > 0; i-- { - const field = reader.readString(); - - reader.Context().Push(field, "unknown", "searching for property type") - {{#arguments}} - {{^first}}else {{/first}}if (field == "{{name}}") { - reader.Context().Push(field, "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "type found, reading property") - - {{#scalar}} - _{{name}} = reader.Read{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(); - {{/scalar}} - {{#required}} - _{{name}}Set = true; - {{/required}} - reader.Context().Pop() - } - {{/arguments}} - reader.context().pop(); - } - - {{#arguments}} - {{#required}} - {{^object}} - if !_{{name}}Set { - {{/object}} - panic(reader.Context().PrintWithContext("Missing required argument: '{{name}}: {{type}}'")) - } - {{/required}} - {{/arguments}} - {{/arguments.length}} - - return { - {{#arguments}} - {{#handleKeywords}}{{name}}{{/handleKeywords}}: _{{name}}{{^last}},{{/last}} - {{/arguments}} - }; -} - -{{/methods}} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/Object%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/Object%type%-go.mustache new file mode 100644 index 0000000000..08d588529e --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/Object%type%-go.mustache @@ -0,0 +1,31 @@ +package types + +import ( + "github.com/consideritdone/polywrap-go/polywrap/msgpack" + "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" + "github.com/consideritdone/polywrap-go/polywrap/msgpack/container" + "github.com/valyala/fastjson" +) + +type {{#toUpper}}{{type}}{{/toUpper}} struct { + {{#properties}} + {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} + {{/properties}} +} + +func {{#toUpper}}{{type}}{{/toUpper}}ToBuffer(value *{{#toUpper}}{{type}}{{/toUpper}}) []byte { + return serialize{{#toUpper}}{{type}}{{/toUpper}}(value) +} + +func {{#toUpper}}{{type}}{{/toUpper}}FromBuffer(data []byte) *{{#toUpper}}{{type}}{{/toUpper}} { + return deserialize{{#toUpper}}{{type}}{{/toUpper}}(data) +} + +func {{#toUpper}}{{type}}{{/toUpper}}Write(writer msgpack.Write, value *{{#toUpper}}{{type}}{{/toUpper}}) { + write{{#toUpper}}{{type}}{{/toUpper}}(writer, value) +} + +func {{#toUpper}}{{type}}{{/toUpper}}Read(reader msgpack.Read) *{{#toUpper}}{{type}}{{/toUpper}} { + return read{{#toUpper}}{{type}}{{/toUpper}}(reader) +} + diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/Object%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/Object%type%Serialization-go.mustache new file mode 100644 index 0000000000..38c9f04e63 --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/Object%type%Serialization-go.mustache @@ -0,0 +1,109 @@ +package types + +import ( + "github.com/consideritdone/polywrap-go/polywrap/msgpack" + "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" + "github.com/consideritdone/polywrap-go/polywrap/msgpack/container" + "github.com/valyala/fastjson" +) + +func serialize{{#toUpper}}{{type}}{{/toUpper}}(value *{{#toUpper}}{{type}}{{/toUpper}}) []byte { + ctx := msgpack.NewContext("Serializing (encoding) env-type: {{#toUpper}}{{type}}{{/toUpper}}") + encoder := msgpack.NewWriteEncoder(ctx) + write{{#toUpper}}{{type}}{{/toUpper}}(encoder, value) + return encoder.Buffer() +} + +func write{{#toUpper}}{{type}}{{/toUpper}}(writer msgpack.Write, value *{{#toUpper}}{{type}}{{/toUpper}}) { + writer.WriteMapLength({{properties.length}}) + {{#properties}} + writer.Context().Push("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") + writer.WriteString("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}") + {{#scalar}} + {{> serialize_scalar}} + {{/scalar}} + {{#array}} + {{#startIter}}{{/startIter}} + {{> serialize_array}} + {{#stopIter}}{{/stopIter}} + {{/array}} + {{#map}} + {{#startIter}}{{/startIter}} + {{> serialize_map}} + {{#stopIter}}{{/stopIter}} + {{/map}} + {{#object}} + {{> serialize_object}} + {{/object}} + {{#enum}} + {{> serialize_enum}} + {{/enum}} + writer.Context().Pop() + {{/properties}} +} + +func deserialize{{#toUpper}}{{type}}{{/toUpper}}(data []byte) *{{#toUpper}}{{type}}{{/toUpper}} { + ctx := msgpack.NewContext("Deserializing (decoding) env-type: {{#toUpper}}{{type}}{{/toUpper}}") + reader := msgpack.NewReadDecoder(ctx, data) + return read{{#toUpper}}{{type}}{{/toUpper}}(reader) +} + +func read{{#toUpper}}{{type}}{{/toUpper}}(reader msgpack.Read) *{{#toUpper}}{{type}}{{/toUpper}} { + var ( + {{#properties}} + _{{name}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} + {{#required}} + _{{name}}Set bool + {{/required}} + {{/properties}} + ) + + for i := int32(reader.ReadMapLength()); i > 0; i-- { + field := reader.ReadString() + reader.Context().Push(field, "unknown", "searching for property type"); + switch field { + {{#properties}} + case "{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}": + reader.Context().Push(field, "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "type found, reading property") + {{#scalar}} + {{> deserialize_scalar}} + {{/scalar}} + {{#enum}} + {{> deserialize_enum}} + {{/enum}} + {{#array}} + {{#startIter}}{{/startIter}} + {{> deserialize_array}} + {{#stopIter}}{{/stopIter}} + {{/array}} + {{#map}} + {{#startIter}}{{/startIter}} + {{> deserialize_map}} + {{#stopIter}}{{/stopIter}} + {{/map}} + {{#object}} + {{> deserialize_object}} + {{/object}} + {{#required}} + _{{name}}Set = true; + {{/required}} + reader.Context().Pop() + {{/properties}} + } + reader.Context().Pop() + } + + {{#properties}} + {{#required}} + if (!_{{name}}Set) { + panic(reader.Context().PrintWithContext("Missing required property: '{{name}}: {{type}}'")) + } + {{/required}} + {{/properties}} + + return &{{#toUpper}}{{type}}{{/toUpper}}{ + {{#properties}} + {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}: _{{name}}, + {{/properties}} + } +} \ No newline at end of file diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_array.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_array.mustache new file mode 100644 index 0000000000..8a852d06e1 --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_array.mustache @@ -0,0 +1,23 @@ +if reader.IsNil() { + value{{#lastFullIter}}i{{/lastFullIter}} = nil +} else { + {{#nextIter}}ln{{/nextIter}} := reader.ReadArrayLength() + value{{#prevFullIter}}i{{/prevFullIter}} = make({{#toWasm}}{{toGraphQLType}}{{/toWasm}}, {{#currIter}}ln{{/currIter}}) + for {{#currIter}}i{{/currIter}} := uint32(0); {{#currIter}}i{{/currIter}} < {{#currIter}}ln{{/currIter}}; {{#currIter}}i{{/currIter}}++ { + {{#scalar}} + {{> deserialize_scalar}} + {{/scalar}} + {{#enum}} + {{> deserialize_enum}} + {{/enum}} + {{#array}} + {{> deserialize_array}} + {{/array}} + {{#map}} + {{> deserialize_map}} + {{/map}} + {{#object}} + {{> deserialize_object}} + {{/object}} + } +} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_enum.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_enum.mustache new file mode 100644 index 0000000000..72dcb0b7ed --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_enum.mustache @@ -0,0 +1,11 @@ +{{#required}} +value{{#lastFullIter}}i{{/lastFullIter}} = {{#toUpper}}{{type}}{{/toUpper}}(reader.ReadI32()) +Sanitize{{#toUpper}}{{type}}{{/toUpper}}Value(int32(_{{name}}{{#lastFullIter}}i{{/lastFullIter}})) +{{/required}} +{{^required}} +if !reader.IsNil() { + v := {{#toUpper}}{{type}}{{/toUpper}}(reader.ReadI32()) + Sanitize{{#toUpper}}{{type}}{{/toUpper}}Value(int32(v)) + value{{#lastFullIter}}i{{/lastFullIter}} = &v +} +{{/required}} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_map.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_map.mustache new file mode 100644 index 0000000000..5861374a16 --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_map.mustache @@ -0,0 +1,24 @@ +if reader.IsNil() { + value{{#lastFullIter}}i{{/lastFullIter}} = nil +} else { + {{#nextIter}}ln{{/nextIter}} := reader.ReadMapLength() + value{{#prevFullIter}}i{{/prevFullIter}} = make({{#toWasm}}{{toGraphQLType}}{{/toWasm}}) + for {{#currIter}}j{{/currIter}} := uint32(0); {{#currIter}}j{{/currIter}} < {{#currIter}}ln{{/currIter}}; {{#currIter}}j{{/currIter}}++ { + {{#currIter}}i{{/currIter}} := reader.Read{{#key}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/key}}() + {{#scalar}} + {{> deserialize_scalar}} + {{/scalar}} + {{#enum}} + {{> deserialize_enum}} + {{/enum}} + {{#array}} + {{> deserialize_array}} + {{/array}} + {{#map}} + {{> deserialize_map}} + {{/map}} + {{#object}} + {{> deserialize_object}} + {{/object}} + } +} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_object.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_object.mustache new file mode 100644 index 0000000000..645435c97c --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_object.mustache @@ -0,0 +1,8 @@ +if v := {{#toUpper}}{{type}}{{/toUpper}}Read(reader); v != nil { + {{#required}} + value{{#lastFullIter}}i{{/lastFullIter}} = *v + {{/required}} + {{^required}} + value{{#lastFullIter}}i{{/lastFullIter}} = v + {{/required}} +} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_scalar.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_scalar.mustache new file mode 100644 index 0000000000..c917632081 --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_scalar.mustache @@ -0,0 +1,9 @@ +{{#required}} +value{{#lastFullIter}}i{{/lastFullIter}} = reader.Read{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}() +{{/required}} +{{^required}} +if !reader.IsNil() { + v := reader.Read{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(); + value{{#lastFullIter}}i{{/lastFullIter}} = {{#readPointer}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}} - v{{/readPointer}} +} +{{/required}} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_array.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_array.mustache new file mode 100644 index 0000000000..9c759d825b --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_array.mustache @@ -0,0 +1,23 @@ +if value{{#lastFullIter}}i{{/lastFullIter}} == nil { + writer.WriteNil() +} else if len(value{{#lastFullIter}}i{{/lastFullIter}}) == 0 { + writer.WriteNil() +} else { + for {{#nextIter}}i{{/nextIter}} := range value{{#prevFullIter}}i{{/prevFullIter}} { + {{#scalar}} + {{> value_serialize_scalar}} + {{/scalar}} + {{#enum}} + {{> value_serialize_enum}} + {{/enum}} + {{#array}} + {{> value_serialize_array}} + {{/array}} + {{#map}} + {{> value_serialize_map}} + {{/map}} + {{#object}} + {{> value_serialize_object}} + {{/object}} + } +} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_enum.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_enum.mustache new file mode 100644 index 0000000000..c6567e8c24 --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_enum.mustache @@ -0,0 +1,13 @@ +{ + v := value{{#lastFullIter}}i{{/lastFullIter}} + {{#required}} + writer.WriteI32(int32(v)); + {{/required}} + {{^required}} + if v == nil { + writer.WriteNil() + } else { + writer.WriteI32(int32(*v)); + } + {{/required}} +} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_map.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_map.mustache new file mode 100644 index 0000000000..d60bb55b17 --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_map.mustache @@ -0,0 +1,24 @@ +if value == nil { + writer.WriteNil() +} else if len(value) == 0 { + writer.WriteNil() +} else { + for {{#nextIter}}i{{/nextIter}} := range value{{#getPrevIter}}i{{/getPrevIter}} { + writer.Write{{#key}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/key}}({{#currIter}}i{{/currIter}}) + {{#scalar}} + {{> value_serialize_scalar}} + {{/scalar}} + {{#enum}} + {{> value_serialize_enum}} + {{/enum}} + {{#array}} + {{> value_serialize_array}} + {{/array}} + {{#map}} + {{> value_serialize_map}} + {{/map}} + {{#object}} + {{> value_serialize_object}} + {{/object}} + } +} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_object.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_object.mustache new file mode 100644 index 0000000000..aa5894e0ba --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_object.mustache @@ -0,0 +1,9 @@ +{ + v := value{{#lastFullIter}}i{{/lastFullIter}} + {{#required}} + {{#toUpper}}{{type}}{{/toUpper}}Write(writer, &v) + {{/required}} + {{^required}} + {{#toUpper}}{{type}}{{/toUpper}}Write(writer, v) + {{/required}} +} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_scalar.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_scalar.mustache new file mode 100644 index 0000000000..6aa89267b1 --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_scalar.mustache @@ -0,0 +1,13 @@ +{ + v := value{{#lastFullIter}}i{{/lastFullIter}} + {{#required}} + writer.Write{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(v) + {{/required}} + {{^required}} + if v == nil { + writer.WriteNil() + } else { + {{#writePointer}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}} - v{{/writePointer}} + } + {{/required}} +} diff --git a/packages/schema/bind/src/bindings/utils.ts b/packages/schema/bind/src/bindings/utils.ts index f3be1c7846..07e0d96949 100644 --- a/packages/schema/bind/src/bindings/utils.ts +++ b/packages/schema/bind/src/bindings/utils.ts @@ -1,7 +1,20 @@ import { OutputEntry, readDirectorySync } from "@polywrap/os-js"; +import { GenericDefinition } from "@polywrap/schema-parse"; import Mustache from "mustache"; import path from "path"; +function transformName(str: string, view: unknown): string { + str = str.replace("-", "."); + if (!str.endsWith(".go")) { + return str; + } + const def = view as GenericDefinition; + str = str.replace("%type%", def.type) + .replace( /([A-Z])/g, "_$1") + .toLowerCase(); + return str.startsWith("_") ? str.slice(1) : str; +} + export function renderTemplates( templateDirAbs: string, view: unknown, @@ -27,7 +40,7 @@ export function renderTemplates( if (data) { output.push({ type: "File", - name: name.replace("-", ".").replace("%type%", (view as {type: string}).type.toLowerCase()), + name: transformName(name, view), data, }); } From 7e99c54450f523ccff25dd831d56eb5719c5a506 Mon Sep 17 00:00:00 2001 From: n0cte Date: Tue, 23 Aug 2022 00:24:34 +0300 Subject: [PATCH 06/65] prettify generated golang code --- .../src/bindings/golang/wasm-go/functions.ts | 45 +- .../templates/deserialize_array.mustache | 40 +- .../templates/deserialize_enum.mustache | 6 +- .../templates/deserialize_map.mustache | 42 +- .../templates/deserialize_object.mustache | 12 +- .../templates/deserialize_scalar.mustache | 4 +- .../enum-type/Enum%type%-go.mustache | 28 +- .../templates/env-type/Env%type%-go.mustache | 16 +- .../Env%type%Serialization-go.mustache | 159 ++- .../imported/enum-type/Enum%type%-go.mustache | 28 +- .../imported/env-type/Env%type%-go.mustache | 16 +- .../Env%type%Serialization-go.mustache | 155 ++- .../interface-type/%type%-go.mustache | 4 +- .../%type%Serialization-go.mustache | 134 +- .../module-type/%type%Wrapped-go.mustache | 28 +- .../object-type/Object%type%-go.mustache | 16 +- .../Object%type%Serialization-go.mustache | 159 ++- .../interface-type/%type%-go.mustache | 4 +- .../golang/wasm-go/templates/main-go.mustache | 24 +- .../%type%Serialization-go.mustache | 191 +-- .../module-type/%type%Wrapped-go.mustache | 40 +- .../object-type/Object%type%-go.mustache | 16 +- .../Object%type%Serialization-go.mustache | 160 ++- .../templates/serialize_array.mustache | 38 +- .../wasm-go/templates/serialize_enum.mustache | 22 +- .../wasm-go/templates/serialize_map.mustache | 40 +- .../templates/serialize_object.mustache | 15 +- .../templates/serialize_scalar.mustache | 22 +- .../value_deserialize_array.mustache | 40 +- .../templates/value_deserialize_enum.mustache | 6 +- .../templates/value_deserialize_map.mustache | 42 +- .../value_deserialize_object.mustache | 12 +- .../value_deserialize_scalar.mustache | 4 +- .../templates/value_serialize_array.mustache | 38 +- .../templates/value_serialize_enum.mustache | 22 +- .../templates/value_serialize_map.mustache | 40 +- .../templates/value_serialize_object.mustache | 14 +- .../templates/value_serialize_scalar.mustache | 22 +- .../test_import/enum_test_import__enum.go | 38 + .../test_import/env_test_import__env.go | 25 + .../env_test_import__env_serialization.go | 57 + .../object_test_import__another_object.go | 25 + ...st_import__another_object_serialization.go | 57 + .../test_import/object_test_import__object.go | 32 + ...bject_test_import__object_serialization.go | 253 ++++ .../test_import__module_serialization.go | 245 ++++ .../test_import__module_wrapped.go | 24 + .../output/wasm-go/interfaces/test_import.go | 7 + .../cases/bind/sanity/output/wasm-go/main.go | 16 +- .../types/custom_type_serialization.go | 1218 ----------------- .../{custom_enum.go => enum_custom_enum.go} | 0 .../wasm-go/types/module_serialization.go | 436 ++++++ .../output/wasm-go/types/module_wrapped.go | 45 + ...another_type.go => object_another_type.go} | 0 ...o => object_another_type_serialization.go} | 1 - .../{custom_type.go => object_custom_type.go} | 0 .../types/object_custom_type_serialization.go | 1211 ++++++++++++++++ .../wasm-go/types/{env.go => object_env.go} | 0 ...ization.go => object_env_serialization.go} | 1 - 59 files changed, 3328 insertions(+), 2067 deletions(-) create mode 100644 packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/enum_test_import__enum.go create mode 100644 packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env.go create mode 100644 packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env_serialization.go create mode 100644 packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object.go create mode 100644 packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object_serialization.go create mode 100644 packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object.go create mode 100644 packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object_serialization.go create mode 100644 packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_serialization.go create mode 100644 packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_wrapped.go create mode 100644 packages/test-cases/cases/bind/sanity/output/wasm-go/interfaces/test_import.go delete mode 100644 packages/test-cases/cases/bind/sanity/output/wasm-go/types/custom_type_serialization.go rename packages/test-cases/cases/bind/sanity/output/wasm-go/types/{custom_enum.go => enum_custom_enum.go} (100%) create mode 100644 packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_serialization.go create mode 100644 packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_wrapped.go rename packages/test-cases/cases/bind/sanity/output/wasm-go/types/{another_type.go => object_another_type.go} (100%) rename packages/test-cases/cases/bind/sanity/output/wasm-go/types/{another_type_serialization.go => object_another_type_serialization.go} (99%) rename packages/test-cases/cases/bind/sanity/output/wasm-go/types/{custom_type.go => object_custom_type.go} (100%) create mode 100644 packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go rename packages/test-cases/cases/bind/sanity/output/wasm-go/types/{env.go => object_env.go} (100%) rename packages/test-cases/cases/bind/sanity/output/wasm-go/types/{env_serialization.go => object_env_serialization.go} (99%) diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/functions.ts b/packages/schema/bind/src/bindings/golang/wasm-go/functions.ts index 9b6c0d1470..1265e1d045 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/functions.ts +++ b/packages/schema/bind/src/bindings/golang/wasm-go/functions.ts @@ -84,12 +84,55 @@ export const readPointer: MustacheFn = () => { export const toSnakeCase: MustacheFn = () => { return (text: string, render: (template: string) => string): string => { - text = render(text).replace( /([A-Z])/g, "_$1"); + text = render(text).replace(/([A-Z])/g, "_$1"); text = text.startsWith("_") ? text.slice(1) : text; return text.toLowerCase(); } } +export const makeImports: MustacheFn = () => { + return (text: string, render: (template: string) => string): string => { + const types = render(text).split(",") + const exist: {[key:string]: boolean} = {}; + for (const t of types){ + switch (t) { + case "*big.Int": + exist["github.com/consideritdone/polywrap-go/polywrap/msgpack/big"] = true; + break + case "*fastjson.Value": + exist["github.com/valyala/fastjson"] = true; + break; + } + } + let imports: Array = ["github.com/consideritdone/polywrap-go/polywrap/msgpack"]; + imports.push(...Object.keys(exist)); + const txt = imports.sort().map(imp => `\t"${imp}"`).join("\n"); + return `import (\n${txt}\n)` + } +} + +export const stuctProps: MustacheFn = () => { + return (text: string, render: (template: string) => string): string => { + let props: [string, string][] = render(text).split("\n") + .map(line => line.trimEnd()) + .filter(line => line !== "") + .map(line => line.split(" ") as [string, string]) + let maxPropNameLn = 0; + for (const [propName] of props) { + if (propName.length > maxPropNameLn) { + maxPropNameLn = propName.length + } + } + for (let i = 0; i < props.length; i++) { + if (props[i][0].length < maxPropNameLn) { + props[i][0] += Array(maxPropNameLn - props[i][0].length).fill(" ").join(""); + } + props[i][0] = "\t" + props[i][0]; + } + return props.map(v => v.join(" ")).join("\n") + "\n"; + } +} + export const handleKeywords: MustacheFn = () => { return (text: string, render: (template: string) => string): string => { const rendered: string = render(text); diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_array.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_array.mustache index 59003f2d65..c66ee906d9 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_array.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_array.mustache @@ -1,23 +1,23 @@ if reader.IsNil() { - _{{name}}{{#lastFullIter}}i{{/lastFullIter}} = nil + _{{name}}{{#lastFullIter}}i{{/lastFullIter}} = nil } else { - {{#nextIter}}ln{{/nextIter}} := reader.ReadArrayLength() - _{{name}}{{#prevFullIter}}i{{/prevFullIter}} = make({{#toWasm}}{{toGraphQLType}}{{/toWasm}}, {{#currIter}}ln{{/currIter}}) - for {{#currIter}}i{{/currIter}} := uint32(0); {{#currIter}}i{{/currIter}} < {{#currIter}}ln{{/currIter}}; {{#currIter}}i{{/currIter}}++ { - {{#scalar}} - {{> deserialize_scalar}} - {{/scalar}} - {{#enum}} - {{> deserialize_enum}} - {{/enum}} - {{#array}} - {{> deserialize_array}} - {{/array}} - {{#map}} - {{> deserialize_map}} - {{/map}} - {{#object}} - {{> deserialize_object}} - {{/object}} - } + {{#nextIter}}ln{{/nextIter}} := reader.ReadArrayLength() + _{{name}}{{#prevFullIter}}i{{/prevFullIter}} = make({{#toWasm}}{{toGraphQLType}}{{/toWasm}}, {{#currIter}}ln{{/currIter}}) + for {{#currIter}}i{{/currIter}} := uint32(0); {{#currIter}}i{{/currIter}} < {{#currIter}}ln{{/currIter}}; {{#currIter}}i{{/currIter}}++ { + {{#scalar}} + {{> deserialize_scalar}} + {{/scalar}} + {{#enum}} + {{> deserialize_enum}} + {{/enum}} + {{#array}} + {{> deserialize_array}} + {{/array}} + {{#map}} + {{> deserialize_map}} + {{/map}} + {{#object}} + {{> deserialize_object}} + {{/object}} + } } diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_enum.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_enum.mustache index f92f67096d..b5ac1f35bb 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_enum.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_enum.mustache @@ -4,8 +4,8 @@ Sanitize{{#toUpper}}{{type}}{{/toUpper}}Value(int32(_{{name}}{{#lastFullIter}}i{ {{/required}} {{^required}} if !reader.IsNil() { - v := {{#toUpper}}{{type}}{{/toUpper}}(reader.ReadI32()) - Sanitize{{#toUpper}}{{type}}{{/toUpper}}Value(int32(v)) - _{{name}}{{#lastFullIter}}i{{/lastFullIter}} = &v + v := {{#toUpper}}{{type}}{{/toUpper}}(reader.ReadI32()) + Sanitize{{#toUpper}}{{type}}{{/toUpper}}Value(int32(v)) + _{{name}}{{#lastFullIter}}i{{/lastFullIter}} = &v } {{/required}} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_map.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_map.mustache index a88ea85f13..409d6c97db 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_map.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_map.mustache @@ -1,24 +1,24 @@ if reader.IsNil() { - _{{name}}{{#lastFullIter}}i{{/lastFullIter}} = nil + _{{name}}{{#lastFullIter}}i{{/lastFullIter}} = nil } else { - {{#nextIter}}ln{{/nextIter}} := reader.ReadMapLength() - _{{name}}{{#prevFullIter}}i{{/prevFullIter}} = make({{#toWasm}}{{toGraphQLType}}{{/toWasm}}) - for {{#currIter}}j{{/currIter}} := uint32(0); {{#currIter}}j{{/currIter}} < {{#currIter}}ln{{/currIter}}; {{#currIter}}j{{/currIter}}++ { - {{#currIter}}i{{/currIter}} := reader.Read{{#key}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/key}}() - {{#scalar}} - {{> deserialize_scalar}} - {{/scalar}} - {{#enum}} - {{> deserialize_enum}} - {{/enum}} - {{#array}} - {{> deserialize_array}} - {{/array}} - {{#map}} - {{> deserialize_map}} - {{/map}} - {{#object}} - {{> deserialize_object}} - {{/object}} - } + {{#nextIter}}ln{{/nextIter}} := reader.ReadMapLength() + _{{name}}{{#prevFullIter}}i{{/prevFullIter}} = make({{#toWasm}}{{toGraphQLType}}{{/toWasm}}) + for {{#currIter}}j{{/currIter}} := uint32(0); {{#currIter}}j{{/currIter}} < {{#currIter}}ln{{/currIter}}; {{#currIter}}j{{/currIter}}++ { + {{#currIter}}i{{/currIter}} := reader.Read{{#key}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/key}}() + {{#scalar}} + {{> deserialize_scalar}} + {{/scalar}} + {{#enum}} + {{> deserialize_enum}} + {{/enum}} + {{#array}} + {{> deserialize_array}} + {{/array}} + {{#map}} + {{> deserialize_map}} + {{/map}} + {{#object}} + {{> deserialize_object}} + {{/object}} + } } diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_object.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_object.mustache index 86cea2fe71..6fc0c5ba2f 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_object.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_object.mustache @@ -1,8 +1,8 @@ if v := {{#toUpper}}{{type}}{{/toUpper}}Read(reader); v != nil { - {{#required}} - _{{name}}{{#lastFullIter}}i{{/lastFullIter}} = *v - {{/required}} - {{^required}} - _{{name}}{{#lastFullIter}}i{{/lastFullIter}} = v - {{/required}} + {{#required}} + _{{name}}{{#lastFullIter}}i{{/lastFullIter}} = *v + {{/required}} + {{^required}} + _{{name}}{{#lastFullIter}}i{{/lastFullIter}} = v + {{/required}} } diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_scalar.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_scalar.mustache index 1a7849f233..2c65dc5c0e 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_scalar.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_scalar.mustache @@ -3,7 +3,7 @@ _{{name}}{{#lastFullIter}}i{{/lastFullIter}} = reader.Read{{#toMsgPack}}{{toGrap {{/required}} {{^required}} if !reader.IsNil() { - v := reader.Read{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(); - _{{name}}{{#lastFullIter}}i{{/lastFullIter}} = {{#readPointer}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}} - v{{/readPointer}} + v := reader.Read{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}() + _{{name}}{{#lastFullIter}}i{{/lastFullIter}} = {{#readPointer}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}} - v{{/readPointer}} } {{/required}} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/enum-type/Enum%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/enum-type/Enum%type%-go.mustache index a33f6f9723..f88d287c1b 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/enum-type/Enum%type%-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/enum-type/Enum%type%-go.mustache @@ -3,10 +3,12 @@ package types type {{#toUpper}}{{type}}{{/toUpper}} int32 const ( - {{#constants}} - {{#toUpper}}{{type}}{{/toUpper}}{{.}} = iota - {{/constants}} - {{#toFirstLower}}{{type}}{{/toFirstLower}}Max = iota +{{#stuctProps}} +{{#constants}} +{{#toUpper}}{{type}}{{/toUpper}}{{.}} = iota +{{/constants}} +{{#toFirstLower}}{{type}}{{/toFirstLower}}Max = iota +{{/stuctProps}} ) func Sanitize{{#toUpper}}{{type}}{{/toUpper}}Value(value int32) { @@ -17,10 +19,10 @@ func Sanitize{{#toUpper}}{{type}}{{/toUpper}}Value(value int32) { func Get{{#toUpper}}{{type}}{{/toUpper}}Value(key string) {{#toUpper}}{{type}}{{/toUpper}} { switch key { - {{#constants}} - case "{{.}}": - return {{#toUpper}}{{type}}{{/toUpper}}{{.}} - {{/constants}} + {{#constants}} + case "{{.}}": + return {{#toUpper}}{{type}}{{/toUpper}}{{.}} + {{/constants}} default: panic("Invalid key for enum '{{#toUpper}}{{type}}{{/toUpper}}'") } @@ -29,11 +31,11 @@ func Get{{#toUpper}}{{type}}{{/toUpper}}Value(key string) {{#toUpper}}{{type}}{{ func Get{{#toUpper}}{{type}}{{/toUpper}}Key(value {{#toUpper}}{{type}}{{/toUpper}}) string { Sanitize{{#toUpper}}{{type}}{{/toUpper}}Value(int32(value)) switch value { - {{#constants}} - case {{#toUpper}}{{type}}{{/toUpper}}{{.}}: - return "{{.}}" - {{/constants}} + {{#constants}} + case {{#toUpper}}{{type}}{{/toUpper}}{{.}}: + return "{{.}}" + {{/constants}} default: panic("Invalid value for enum '{{#toUpper}}{{type}}{{/toUpper}}'") } -} \ No newline at end of file +} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/env-type/Env%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/env-type/Env%type%-go.mustache index 08d588529e..4cc1a1eea6 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/env-type/Env%type%-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/env-type/Env%type%-go.mustache @@ -1,16 +1,13 @@ package types -import ( - "github.com/consideritdone/polywrap-go/polywrap/msgpack" - "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" - "github.com/consideritdone/polywrap-go/polywrap/msgpack/container" - "github.com/valyala/fastjson" -) +{{#makeImports}}{{#properties}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/properties}}{{/makeImports}} type {{#toUpper}}{{type}}{{/toUpper}} struct { - {{#properties}} - {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} - {{/properties}} + {{#stuctProps}} + {{#properties}} + {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} + {{/properties}} + {{/stuctProps}} } func {{#toUpper}}{{type}}{{/toUpper}}ToBuffer(value *{{#toUpper}}{{type}}{{/toUpper}}) []byte { @@ -28,4 +25,3 @@ func {{#toUpper}}{{type}}{{/toUpper}}Write(writer msgpack.Write, value *{{#toUpp func {{#toUpper}}{{type}}{{/toUpper}}Read(reader msgpack.Read) *{{#toUpper}}{{type}}{{/toUpper}} { return read{{#toUpper}}{{type}}{{/toUpper}}(reader) } - diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/env-type/Env%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/env-type/Env%type%Serialization-go.mustache index 38c9f04e63..0574f0e584 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/env-type/Env%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/env-type/Env%type%Serialization-go.mustache @@ -1,11 +1,6 @@ package types -import ( - "github.com/consideritdone/polywrap-go/polywrap/msgpack" - "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" - "github.com/consideritdone/polywrap-go/polywrap/msgpack/container" - "github.com/valyala/fastjson" -) +{{#makeImports}}{{#properties}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/properties}}{{/makeImports}} func serialize{{#toUpper}}{{type}}{{/toUpper}}(value *{{#toUpper}}{{type}}{{/toUpper}}) []byte { ctx := msgpack.NewContext("Serializing (encoding) env-type: {{#toUpper}}{{type}}{{/toUpper}}") @@ -16,30 +11,30 @@ func serialize{{#toUpper}}{{type}}{{/toUpper}}(value *{{#toUpper}}{{type}}{{/toU func write{{#toUpper}}{{type}}{{/toUpper}}(writer msgpack.Write, value *{{#toUpper}}{{type}}{{/toUpper}}) { writer.WriteMapLength({{properties.length}}) - {{#properties}} - writer.Context().Push("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") - writer.WriteString("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}") - {{#scalar}} - {{> serialize_scalar}} - {{/scalar}} - {{#array}} - {{#startIter}}{{/startIter}} - {{> serialize_array}} - {{#stopIter}}{{/stopIter}} - {{/array}} - {{#map}} - {{#startIter}}{{/startIter}} - {{> serialize_map}} - {{#stopIter}}{{/stopIter}} - {{/map}} - {{#object}} - {{> serialize_object}} - {{/object}} - {{#enum}} - {{> serialize_enum}} - {{/enum}} - writer.Context().Pop() - {{/properties}} + {{#properties}} + writer.Context().Push("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") + writer.WriteString("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}") + {{#scalar}} + {{> serialize_scalar}} + {{/scalar}} + {{#array}} + {{#startIter}}{{/startIter}} + {{> serialize_array}} + {{#stopIter}}{{/stopIter}} + {{/array}} + {{#map}} + {{#startIter}}{{/startIter}} + {{> serialize_map}} + {{#stopIter}}{{/stopIter}} + {{/map}} + {{#object}} + {{> serialize_object}} + {{/object}} + {{#enum}} + {{> serialize_enum}} + {{/enum}} + writer.Context().Pop() + {{/properties}} } func deserialize{{#toUpper}}{{type}}{{/toUpper}}(data []byte) *{{#toUpper}}{{type}}{{/toUpper}} { @@ -49,61 +44,65 @@ func deserialize{{#toUpper}}{{type}}{{/toUpper}}(data []byte) *{{#toUpper}}{{typ } func read{{#toUpper}}{{type}}{{/toUpper}}(reader msgpack.Read) *{{#toUpper}}{{type}}{{/toUpper}} { - var ( - {{#properties}} - _{{name}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} - {{#required}} - _{{name}}Set bool - {{/required}} - {{/properties}} - ) + var ( + {{#stuctProps}} + {{#properties}} + _{{name}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} + {{#required}} + _{{name}}Set bool + {{/required}} + {{/properties}} + {{/stuctProps}} + ) for i := int32(reader.ReadMapLength()); i > 0; i-- { field := reader.ReadString() - reader.Context().Push(field, "unknown", "searching for property type"); + reader.Context().Push(field, "unknown", "searching for property type") switch field { - {{#properties}} - case "{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}": - reader.Context().Push(field, "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "type found, reading property") - {{#scalar}} - {{> deserialize_scalar}} - {{/scalar}} - {{#enum}} - {{> deserialize_enum}} - {{/enum}} - {{#array}} - {{#startIter}}{{/startIter}} - {{> deserialize_array}} - {{#stopIter}}{{/stopIter}} - {{/array}} - {{#map}} - {{#startIter}}{{/startIter}} - {{> deserialize_map}} - {{#stopIter}}{{/stopIter}} - {{/map}} - {{#object}} - {{> deserialize_object}} - {{/object}} - {{#required}} - _{{name}}Set = true; - {{/required}} - reader.Context().Pop() - {{/properties}} + {{#properties}} + case "{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}": + reader.Context().Push(field, "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "type found, reading property") + {{#scalar}} + {{> deserialize_scalar}} + {{/scalar}} + {{#enum}} + {{> deserialize_enum}} + {{/enum}} + {{#array}} + {{#startIter}}{{/startIter}} + {{> deserialize_array}} + {{#stopIter}}{{/stopIter}} + {{/array}} + {{#map}} + {{#startIter}}{{/startIter}} + {{> deserialize_map}} + {{#stopIter}}{{/stopIter}} + {{/map}} + {{#object}} + {{> deserialize_object}} + {{/object}} + {{#required}} + _{{name}}Set = true + {{/required}} + reader.Context().Pop() + {{/properties}} } - reader.Context().Pop() + reader.Context().Pop() } - {{#properties}} - {{#required}} - if (!_{{name}}Set) { - panic(reader.Context().PrintWithContext("Missing required property: '{{name}}: {{type}}'")) - } - {{/required}} - {{/properties}} + {{#properties}} + {{#required}} + if !_{{name}}Set { + panic(reader.Context().PrintWithContext("Missing required property: '{{name}}: {{type}}'")) + } + {{/required}} + {{/properties}} - return &{{#toUpper}}{{type}}{{/toUpper}}{ - {{#properties}} - {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}: _{{name}}, - {{/properties}} - } -} \ No newline at end of file + return &{{#toUpper}}{{type}}{{/toUpper}}{ + {{#stuctProps}} + {{#properties}} + {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}: _{{name}}, + {{/properties}} + {{/stuctProps}} + } +} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/enum-type/Enum%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/enum-type/Enum%type%-go.mustache index f4713678fc..1bd32360c5 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/enum-type/Enum%type%-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/enum-type/Enum%type%-go.mustache @@ -3,10 +3,12 @@ package {{#toSnakeCase}}{{namespace}}{{/toSnakeCase}} type {{#toUpper}}{{type}}{{/toUpper}} int32 const ( - {{#constants}} - {{#toUpper}}{{type}}{{/toUpper}}{{.}} = iota - {{/constants}} - {{#toFirstLower}}{{type}}{{/toFirstLower}}Max = iota +{{#stuctProps}} +{{#constants}} +{{#toUpper}}{{type}}{{/toUpper}}{{.}} = iota +{{/constants}} +{{#toFirstLower}}{{type}}{{/toFirstLower}}Max = iota +{{/stuctProps}} ) func Sanitize{{#toUpper}}{{type}}{{/toUpper}}Value(value int32) { @@ -17,10 +19,10 @@ func Sanitize{{#toUpper}}{{type}}{{/toUpper}}Value(value int32) { func Get{{#toUpper}}{{type}}{{/toUpper}}Value(key string) {{#toUpper}}{{type}}{{/toUpper}} { switch key { - {{#constants}} - case "{{.}}": - return {{#toUpper}}{{type}}{{/toUpper}}{{.}} - {{/constants}} + {{#constants}} + case "{{.}}": + return {{#toUpper}}{{type}}{{/toUpper}}{{.}} + {{/constants}} default: panic("Invalid key for enum '{{#toUpper}}{{type}}{{/toUpper}}'") } @@ -29,11 +31,11 @@ func Get{{#toUpper}}{{type}}{{/toUpper}}Value(key string) {{#toUpper}}{{type}}{{ func Get{{#toUpper}}{{type}}{{/toUpper}}Key(value {{#toUpper}}{{type}}{{/toUpper}}) string { Sanitize{{#toUpper}}{{type}}{{/toUpper}}Value(int32(value)) switch value { - {{#constants}} - case {{#toUpper}}{{type}}{{/toUpper}}{{.}}: - return "{{.}}" - {{/constants}} + {{#constants}} + case {{#toUpper}}{{type}}{{/toUpper}}{{.}}: + return "{{.}}" + {{/constants}} default: panic("Invalid value for enum '{{#toUpper}}{{type}}{{/toUpper}}'") } -} \ No newline at end of file +} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/env-type/Env%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/env-type/Env%type%-go.mustache index ec612efbee..7f50e2c6a6 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/env-type/Env%type%-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/env-type/Env%type%-go.mustache @@ -1,16 +1,13 @@ package {{#toSnakeCase}}{{namespace}}{{/toSnakeCase}} -import ( - "github.com/consideritdone/polywrap-go/polywrap/msgpack" - "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" - "github.com/consideritdone/polywrap-go/polywrap/msgpack/container" - "github.com/valyala/fastjson" -) +{{#makeImports}}{{#properties}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/properties}}{{/makeImports}} type {{#toUpper}}{{type}}{{/toUpper}} struct { - {{#properties}} - {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} - {{/properties}} +{{#stuctProps}} +{{#properties}} +{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} +{{/properties}} +{{/stuctProps}} } func {{#toUpper}}{{type}}{{/toUpper}}ToBuffer(value *{{#toUpper}}{{type}}{{/toUpper}}) []byte { @@ -28,4 +25,3 @@ func {{#toUpper}}{{type}}{{/toUpper}}Write(writer msgpack.Write, value *{{#toUpp func {{#toUpper}}{{type}}{{/toUpper}}Read(reader msgpack.Read) *{{#toUpper}}{{type}}{{/toUpper}} { return read{{#toUpper}}{{type}}{{/toUpper}}(reader) } - diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/env-type/Env%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/env-type/Env%type%Serialization-go.mustache index c8a2d79e65..ac4ea04a6f 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/env-type/Env%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/env-type/Env%type%Serialization-go.mustache @@ -1,11 +1,6 @@ package {{#toSnakeCase}}{{namespace}}{{/toSnakeCase}} -import ( - "github.com/consideritdone/polywrap-go/polywrap/msgpack" - "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" - "github.com/consideritdone/polywrap-go/polywrap/msgpack/container" - "github.com/valyala/fastjson" -) +{{#makeImports}}{{#properties}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/properties}}{{/makeImports}} func serialize{{#toUpper}}{{type}}{{/toUpper}}(value *{{#toUpper}}{{type}}{{/toUpper}}) []byte { ctx := msgpack.NewContext("Serializing (encoding) env-type: {{#toUpper}}{{type}}{{/toUpper}}") @@ -16,30 +11,30 @@ func serialize{{#toUpper}}{{type}}{{/toUpper}}(value *{{#toUpper}}{{type}}{{/toU func write{{#toUpper}}{{type}}{{/toUpper}}(writer msgpack.Write, value *{{#toUpper}}{{type}}{{/toUpper}}) { writer.WriteMapLength({{properties.length}}) - {{#properties}} - writer.Context().Push("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") - writer.WriteString("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}") - {{#scalar}} - {{> serialize_scalar}} - {{/scalar}} - {{#array}} - {{#startIter}}{{/startIter}} - {{> serialize_array}} - {{#stopIter}}{{/stopIter}} - {{/array}} - {{#map}} - {{#startIter}}{{/startIter}} - {{> serialize_map}} - {{#stopIter}}{{/stopIter}} - {{/map}} - {{#object}} - {{> serialize_object}} - {{/object}} - {{#enum}} - {{> serialize_enum}} - {{/enum}} - writer.Context().Pop() - {{/properties}} + {{#properties}} + writer.Context().Push("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") + writer.WriteString("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}") + {{#scalar}} + {{> serialize_scalar}} + {{/scalar}} + {{#array}} + {{#startIter}}{{/startIter}} + {{> serialize_array}} + {{#stopIter}}{{/stopIter}} + {{/array}} + {{#map}} + {{#startIter}}{{/startIter}} + {{> serialize_map}} + {{#stopIter}}{{/stopIter}} + {{/map}} + {{#object}} + {{> serialize_object}} + {{/object}} + {{#enum}} + {{> serialize_enum}} + {{/enum}} + writer.Context().Pop() + {{/properties}} } func deserialize{{#toUpper}}{{type}}{{/toUpper}}(data []byte) *{{#toUpper}}{{type}}{{/toUpper}} { @@ -50,60 +45,64 @@ func deserialize{{#toUpper}}{{type}}{{/toUpper}}(data []byte) *{{#toUpper}}{{typ func read{{#toUpper}}{{type}}{{/toUpper}}(reader msgpack.Read) *{{#toUpper}}{{type}}{{/toUpper}} { var ( - {{#properties}} - _{{name}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} - {{#required}} - _{{name}}Set bool - {{/required}} - {{/properties}} + {{#stuctProps}} + {{#properties}} + _{{name}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} + {{#required}} + _{{name}}Set bool + {{/required}} + {{/properties}} + {{/stuctProps}} ) for i := int32(reader.ReadMapLength()); i > 0; i-- { field := reader.ReadString() - reader.Context().Push(field, "unknown", "searching for property type"); + reader.Context().Push(field, "unknown", "searching for property type") switch field { - {{#properties}} - case "{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}": - reader.Context().Push(field, "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "type found, reading property") - {{#scalar}} - {{> deserialize_scalar}} - {{/scalar}} - {{#enum}} - {{> deserialize_enum}} - {{/enum}} - {{#array}} - {{#startIter}}{{/startIter}} - {{> deserialize_array}} - {{#stopIter}}{{/stopIter}} - {{/array}} - {{#map}} - {{#startIter}}{{/startIter}} - {{> deserialize_map}} - {{#stopIter}}{{/stopIter}} - {{/map}} - {{#object}} - {{> deserialize_object}} - {{/object}} - {{#required}} - _{{name}}Set = true; - {{/required}} - reader.Context().Pop() - {{/properties}} + {{#properties}} + case "{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}": + reader.Context().Push(field, "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "type found, reading property") + {{#scalar}} + {{> deserialize_scalar}} + {{/scalar}} + {{#enum}} + {{> deserialize_enum}} + {{/enum}} + {{#array}} + {{#startIter}}{{/startIter}} + {{> deserialize_array}} + {{#stopIter}}{{/stopIter}} + {{/array}} + {{#map}} + {{#startIter}}{{/startIter}} + {{> deserialize_map}} + {{#stopIter}}{{/stopIter}} + {{/map}} + {{#object}} + {{> deserialize_object}} + {{/object}} + {{#required}} + _{{name}}Set = true + {{/required}} + reader.Context().Pop() + {{/properties}} } - reader.Context().Pop() + reader.Context().Pop() } - {{#properties}} - {{#required}} - if (!_{{name}}Set) { - panic(reader.Context().PrintWithContext("Missing required property: '{{name}}: {{type}}'")) - } - {{/required}} - {{/properties}} + {{#properties}} + {{#required}} + if !_{{name}}Set { + panic(reader.Context().PrintWithContext("Missing required property: '{{name}}: {{type}}'")) + } + {{/required}} + {{/properties}} - return &{{#toUpper}}{{type}}{{/toUpper}}{ - {{#properties}} - {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}: _{{name}}, - {{/properties}} - } -} \ No newline at end of file + return &{{#toUpper}}{{type}}{{/toUpper}}{ + {{#stuctProps}} + {{#properties}} + {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}: _{{name}}, + {{/properties}} + {{/stuctProps}} + } +} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/interface-type/%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/interface-type/%type%-go.mustache index 2db03af454..c63551016a 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/interface-type/%type%-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/interface-type/%type%-go.mustache @@ -12,8 +12,8 @@ import "github.com/consideritdone/polywrap-go/polywrap" {{#getImplementations}} {{#enabled}} func {{#toUpper}}{{namespace}}{{/toUpper}}Implementations() []string { - return polywrap.WrapGetImplementations("{{uri}}") + return polywrap.WrapGetImplementations("{{uri}}") } {{/enabled}} {{/getImplementations}} -{{/capabilities}} \ No newline at end of file +{{/capabilities}} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/module-type/%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/module-type/%type%Serialization-go.mustache index 45e7b0762d..e908e48bfc 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/module-type/%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/module-type/%type%Serialization-go.mustache @@ -1,84 +1,82 @@ package {{#toSnakeCase}}{{namespace}}{{/toSnakeCase}} -import ( - "github.com/consideritdone/polywrap-go/polywrap/msgpack" - "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" - "github.com/consideritdone/polywrap-go/polywrap/msgpack/container" - "github.com/valyala/fastjson" -) +{{#makeImports}}{{#arguments}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/arguments}}{{/makeImports}} {{#methods}} type Args{{#toUpper}}{{name}}{{/toUpper}} struct { - {{#arguments}} - {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} - {{/arguments}} +{{#stuctProps}} +{{#arguments}} +{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} +{{/arguments}} +{{/stuctProps}} } func Serialize{{#toUpper}}{{name}}{{/toUpper}}Args(value *Args{{#toUpper}}{{name}}{{/toUpper}}) []byte { - ctx := msgpack.NewContext("Serializing module-type: {{#toUpper}}{{name}}{{/toUpper}}") - encoder := msgpack.NewWriteEncoder(ctx) - Write{{#toUpper}}{{name}}{{/toUpper}}Args(encoder, value); - return encoder.Buffer() + ctx := msgpack.NewContext("Serializing module-type: {{#toUpper}}{{name}}{{/toUpper}}") + encoder := msgpack.NewWriteEncoder(ctx) + Write{{#toUpper}}{{name}}{{/toUpper}}Args(encoder, value) + return encoder.Buffer() } func Write{{#toUpper}}{{name}}{{/toUpper}}Args(writer msgpack.Write, value *Args{{#toUpper}}{{name}}{{/toUpper}}) { - writer.WriteMapLength({{arguments.length}}) - {{#arguments}} - writer.Context().Push("{{name}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") - writer.WriteString("{{name}}") - {{#scalar}} - {{> value_serialize_scalar}} - {{/scalar}} - {{#array}} - {{#startIter}}{{/startIter}} - {{> value_serialize_array}} - {{#stopIter}}{{/stopIter}} - {{/array}} - {{#map}} - {{#startIter}}{{/startIter}} - {{> value_serialize_map}} - {{#stopIter}}{{/stopIter}} - {{/map}} - {{#object}} - {{> value_serialize_object}} - {{/object}} - {{#enum}} - {{> value_serialize_enum}} - {{/enum}} - writer.Context().Pop() - {{/arguments}} + writer.WriteMapLength({{arguments.length}}) + {{#arguments}} + writer.Context().Push("{{name}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") + writer.WriteString("{{name}}") + {{#scalar}} + {{> serialize_scalar}} + {{/scalar}} + {{#array}} + {{#startIter}}{{/startIter}} + {{> serialize_array}} + {{#stopIter}}{{/stopIter}} + {{/array}} + {{#map}} + {{#startIter}}{{/startIter}} + {{> serialize_map}} + {{#stopIter}}{{/stopIter}} + {{/map}} + {{#object}} + {{> serialize_object}} + {{/object}} + {{#enum}} + {{> serialize_enum}} + {{/enum}} + writer.Context().Pop() + {{/arguments}} } -export function Deserialize{{#toUpper}}{{name}}{{/toUpper}}Result(argsBuf []byte): {{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}} { - ctx := msgpack.NewContext("Deserializing module-type: {{#toUpper}}{{name}}{{/toUpper}}") - reader := msgpack.NewReadDecoder(ctx, argsBuf) +func Deserialize{{#toUpper}}{{name}}{{/toUpper}}Result(argsBuf []byte) {{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}} { + ctx := msgpack.NewContext("Deserializing module-type: {{#toUpper}}{{name}}{{/toUpper}}") + reader := msgpack.NewReadDecoder(ctx, argsBuf) - {{#return}} - reader.Context().Push("{{name}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "reading function output"); - var value {{#toWasm}}{{toGraphQLType}}{{/toWasm}} - {{#scalar}} - {{> value_deserialize_scalar}} - {{/scalar}} - {{#array}} - {{#startIter}}{{/startIter}} - {{> value_deserialize_array}} - {{#stopIter}}{{/stopIter}} - {{/array}} - {{#map}} - {{#startIter}}{{/startIter}} - {{> value_deserialize_map}} - {{#stopIter}}{{/stopIter}} - {{/map}} - {{#object}} - {{> value_deserialize_object}} - {{/object}} - {{#enum}} - {{> value_deserialize_enum}} - {{/enum}} - writer.Context().Pop() - return value - {{/return}} + {{#return}} + reader.Context().Push("{{name}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "reading function output") + var value {{#toWasm}}{{toGraphQLType}}{{/toWasm}} + {{#scalar}} + {{> value_deserialize_scalar}} + {{/scalar}} + {{#array}} + {{#startIter}}{{/startIter}} + {{> value_deserialize_array}} + {{#stopIter}}{{/stopIter}} + {{/array}} + {{#map}} + {{#startIter}}{{/startIter}} + {{> value_deserialize_map}} + {{#stopIter}}{{/stopIter}} + {{/map}} + {{#object}} + {{> value_deserialize_object}} + {{/object}} + {{#enum}} + {{> value_deserialize_enum}} + {{/enum}} + reader.Context().Pop() + return value + {{/return}} } +{{^last}} -{{/methods}} - +{{/last}} +{{/methods}} \ No newline at end of file diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/module-type/%type%Wrapped-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/module-type/%type%Wrapped-go.mustache index b7d1e09512..1340695e91 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/module-type/%type%Wrapped-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/module-type/%type%Wrapped-go.mustache @@ -2,20 +2,20 @@ package {{#toSnakeCase}}{{namespace}}{{/toSnakeCase}} {{#methods.length}} import ( - "github.com/consideritdone/polywrap-go/polywrap" - "some/library/to/methods" + "github.com/consideritdone/polywrap-go/polywrap" + "some/library/to/methods" ) {{/methods.length}} {{^isInterface}} {{#methods}} func {{#toUpper}}{{type}}{{/toUpper}}{{#toUpper}}{{name}}{{/toUpper}}(args *Args{{#toUpper}}{{name}}{{/toUpper}}) ({{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}, error) { - argsBuf := Serialize{{#toUpper}}{{name}}{{/toUpper}}Args(args) - data, err := polywrap.WrapSubinvoke("{{uri}}", "{{name}}", argsBuf) - if err != nil { - return nil, result.Error() - } - return Deserialize{{#toUpper}}{{name}}{{/toUpper}}Result(result.unwrap()), nil + argsBuf := Serialize{{#toUpper}}{{name}}{{/toUpper}}Args(args) + data, err := polywrap.WrapSubinvoke("{{uri}}", "{{name}}", argsBuf) + if err != nil { + return nil, result.Error() + } + return Deserialize{{#toUpper}}{{name}}{{/toUpper}}Result(result.unwrap()), nil } {{^last}} @@ -25,12 +25,12 @@ func {{#toUpper}}{{type}}{{/toUpper}}{{#toUpper}}{{name}}{{/toUpper}}(args *Args {{#isInterface}} {{#methods}} func {{#toUpper}}{{type}}{{/toUpper}}{{#toUpper}}{{name}}{{/toUpper}}(uri string, args *Args{{#toUpper}}{{name}}{{/toUpper}}) ({{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}, error) { - argsBuf := Serialize{{#toUpper}}{{name}}{{/toUpper}}Args(args) - data, err := polywrap.WrapSubinvokeImplementation("{{uri}}", uri, "{{name}}", argsBuf) - if err != nil { - return nil, err - } - return Deserialize{{#toUpper}}{{name}}{{/toUpper}}Result(data), nil + argsBuf := Serialize{{#toUpper}}{{name}}{{/toUpper}}Args(args) + data, err := polywrap.WrapSubinvokeImplementation("{{uri}}", uri, "{{name}}", argsBuf) + if err != nil { + return nil, err + } + return Deserialize{{#toUpper}}{{name}}{{/toUpper}}Result(data), nil } {{^last}} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/object-type/Object%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/object-type/Object%type%-go.mustache index ec612efbee..7f50e2c6a6 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/object-type/Object%type%-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/object-type/Object%type%-go.mustache @@ -1,16 +1,13 @@ package {{#toSnakeCase}}{{namespace}}{{/toSnakeCase}} -import ( - "github.com/consideritdone/polywrap-go/polywrap/msgpack" - "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" - "github.com/consideritdone/polywrap-go/polywrap/msgpack/container" - "github.com/valyala/fastjson" -) +{{#makeImports}}{{#properties}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/properties}}{{/makeImports}} type {{#toUpper}}{{type}}{{/toUpper}} struct { - {{#properties}} - {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} - {{/properties}} +{{#stuctProps}} +{{#properties}} +{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} +{{/properties}} +{{/stuctProps}} } func {{#toUpper}}{{type}}{{/toUpper}}ToBuffer(value *{{#toUpper}}{{type}}{{/toUpper}}) []byte { @@ -28,4 +25,3 @@ func {{#toUpper}}{{type}}{{/toUpper}}Write(writer msgpack.Write, value *{{#toUpp func {{#toUpper}}{{type}}{{/toUpper}}Read(reader msgpack.Read) *{{#toUpper}}{{type}}{{/toUpper}} { return read{{#toUpper}}{{type}}{{/toUpper}}(reader) } - diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/object-type/Object%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/object-type/Object%type%Serialization-go.mustache index c8a2d79e65..3274d8b9c4 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/object-type/Object%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/object-type/Object%type%Serialization-go.mustache @@ -1,11 +1,6 @@ package {{#toSnakeCase}}{{namespace}}{{/toSnakeCase}} -import ( - "github.com/consideritdone/polywrap-go/polywrap/msgpack" - "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" - "github.com/consideritdone/polywrap-go/polywrap/msgpack/container" - "github.com/valyala/fastjson" -) +{{#makeImports}}{{#properties}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/properties}}{{/makeImports}} func serialize{{#toUpper}}{{type}}{{/toUpper}}(value *{{#toUpper}}{{type}}{{/toUpper}}) []byte { ctx := msgpack.NewContext("Serializing (encoding) env-type: {{#toUpper}}{{type}}{{/toUpper}}") @@ -16,30 +11,30 @@ func serialize{{#toUpper}}{{type}}{{/toUpper}}(value *{{#toUpper}}{{type}}{{/toU func write{{#toUpper}}{{type}}{{/toUpper}}(writer msgpack.Write, value *{{#toUpper}}{{type}}{{/toUpper}}) { writer.WriteMapLength({{properties.length}}) - {{#properties}} - writer.Context().Push("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") - writer.WriteString("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}") - {{#scalar}} - {{> serialize_scalar}} - {{/scalar}} - {{#array}} - {{#startIter}}{{/startIter}} - {{> serialize_array}} - {{#stopIter}}{{/stopIter}} - {{/array}} - {{#map}} - {{#startIter}}{{/startIter}} - {{> serialize_map}} - {{#stopIter}}{{/stopIter}} - {{/map}} - {{#object}} - {{> serialize_object}} - {{/object}} - {{#enum}} - {{> serialize_enum}} - {{/enum}} - writer.Context().Pop() - {{/properties}} + {{#properties}} + writer.Context().Push("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") + writer.WriteString("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}") + {{#scalar}} + {{> serialize_scalar}} + {{/scalar}} + {{#array}} + {{#startIter}}{{/startIter}} + {{> serialize_array}} + {{#stopIter}}{{/stopIter}} + {{/array}} + {{#map}} + {{#startIter}}{{/startIter}} + {{> serialize_map}} + {{#stopIter}}{{/stopIter}} + {{/map}} + {{#object}} + {{> serialize_object}} + {{/object}} + {{#enum}} + {{> serialize_enum}} + {{/enum}} + writer.Context().Pop() + {{/properties}} } func deserialize{{#toUpper}}{{type}}{{/toUpper}}(data []byte) *{{#toUpper}}{{type}}{{/toUpper}} { @@ -49,61 +44,65 @@ func deserialize{{#toUpper}}{{type}}{{/toUpper}}(data []byte) *{{#toUpper}}{{typ } func read{{#toUpper}}{{type}}{{/toUpper}}(reader msgpack.Read) *{{#toUpper}}{{type}}{{/toUpper}} { - var ( - {{#properties}} - _{{name}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} - {{#required}} - _{{name}}Set bool - {{/required}} - {{/properties}} - ) + var ( + {{#stuctProps}} + {{#properties}} + _{{name}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} + {{#required}} + _{{name}}Set bool + {{/required}} + {{/properties}} + {{/stuctProps}} + ) for i := int32(reader.ReadMapLength()); i > 0; i-- { field := reader.ReadString() - reader.Context().Push(field, "unknown", "searching for property type"); + reader.Context().Push(field, "unknown", "searching for property type") switch field { - {{#properties}} - case "{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}": - reader.Context().Push(field, "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "type found, reading property") - {{#scalar}} - {{> deserialize_scalar}} - {{/scalar}} - {{#enum}} - {{> deserialize_enum}} - {{/enum}} - {{#array}} - {{#startIter}}{{/startIter}} - {{> deserialize_array}} - {{#stopIter}}{{/stopIter}} - {{/array}} - {{#map}} - {{#startIter}}{{/startIter}} - {{> deserialize_map}} - {{#stopIter}}{{/stopIter}} - {{/map}} - {{#object}} - {{> deserialize_object}} - {{/object}} - {{#required}} - _{{name}}Set = true; - {{/required}} - reader.Context().Pop() - {{/properties}} + {{#properties}} + case "{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}": + reader.Context().Push(field, "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "type found, reading property") + {{#scalar}} + {{> deserialize_scalar}} + {{/scalar}} + {{#enum}} + {{> deserialize_enum}} + {{/enum}} + {{#array}} + {{#startIter}}{{/startIter}} + {{> deserialize_array}} + {{#stopIter}}{{/stopIter}} + {{/array}} + {{#map}} + {{#startIter}}{{/startIter}} + {{> deserialize_map}} + {{#stopIter}}{{/stopIter}} + {{/map}} + {{#object}} + {{> deserialize_object}} + {{/object}} + {{#required}} + _{{name}}Set = true + {{/required}} + reader.Context().Pop() + {{/properties}} } - reader.Context().Pop() + reader.Context().Pop() } - {{#properties}} - {{#required}} - if (!_{{name}}Set) { - panic(reader.Context().PrintWithContext("Missing required property: '{{name}}: {{type}}'")) - } - {{/required}} - {{/properties}} + {{#properties}} + {{#required}} + if !_{{name}}Set { + panic(reader.Context().PrintWithContext("Missing required property: '{{name}}: {{type}}'")) + } + {{/required}} + {{/properties}} - return &{{#toUpper}}{{type}}{{/toUpper}}{ - {{#properties}} - {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}: _{{name}}, - {{/properties}} - } -} \ No newline at end of file + return &{{#toUpper}}{{type}}{{/toUpper}}{ + {{#stuctProps}} + {{#properties}} + {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}: _{{name}}, + {{/properties}} + {{/stuctProps}} + } +} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/interface-type/%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/interface-type/%type%-go.mustache index 46cc9be8e0..861f5555e7 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/interface-type/%type%-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/interface-type/%type%-go.mustache @@ -12,8 +12,8 @@ import "github.com/consideritdone/polywrap-go/polywrap" {{#getImplementations}} {{#enabled}} func {{#toUpper}}{{namespace}}{{/toUpper}}Implementations() []string { - return polywrap.WrapGetImplementations("{{uri}}") + return polywrap.WrapGetImplementations("{{uri}}") } {{/enabled}} {{/getImplementations}} -{{/capabilities}} \ No newline at end of file +{{/capabilities}} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/main-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/main-go.mustache index 5907c2160f..c4f9dfc4e8 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/main-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/main-go.mustache @@ -1,21 +1,23 @@ package main import ( - "github.com/consideritdone/polywrap-go/examples/demo1/wrap/module" - "github.com/consideritdone/polywrap-go/polywrap" + "github.com/consideritdone/polywrap-go/examples/demo1/wrap/module" + "github.com/consideritdone/polywrap-go/polywrap" ) //export _wrap_invoke func _wrap_invoke(methodSize, argsSize, envSize uint32) bool { - args := polywrap.WrapInvokeArgs(methodSize, argsSize) - - {{#moduleType}} - {{#methods}} - {{^first}}else {{/first}}if args.method == "{{name}}" { - return polywrap.WrapInvoke(args, envSize, module.{{#toUpper}}{{name}}{{/toUpper}}Wrapped) - } {{/methods}}{{/moduleType}}else { - return polywrap.WrapInvoke(args, envSize, nil) - } + args := polywrap.WrapInvokeArgs(methodSize, argsSize) + switch args.method { + {{#moduleType}} + {{#methods}} + case "{{name}}": + return polywrap.WrapInvoke(args, envSize, module.{{#toUpper}}{{name}}{{/toUpper}}Wrapped) + {{/methods}} + {{/moduleType}} + default: + return polywrap.WrapInvoke(args, envSize, nil) + } } func main() { diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/module-type/%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/module-type/%type%Serialization-go.mustache index 9dff688252..292aa1978d 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/module-type/%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/module-type/%type%Serialization-go.mustache @@ -1,115 +1,118 @@ package types -import ( - "github.com/consideritdone/polywrap-go/polywrap/msgpack" - "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" - "github.com/consideritdone/polywrap-go/polywrap/msgpack/container" - "github.com/valyala/fastjson" -) +{{#makeImports}}{{#arguments}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/arguments}}{{/makeImports}} {{#methods}} type Args{{#toUpper}}{{name}}{{/toUpper}} struct { - {{#arguments}} - {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} - {{/arguments}} +{{#stuctProps}} +{{#arguments}} +{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} +{{/arguments}} +{{/stuctProps}} } func Deserialize{{#toUpper}}{{name}}{{/toUpper}}Args(argsBuf []byte) *Args{{#toUpper}}{{name}}{{/toUpper}} { - ctx := msgpack.NewContext("Deserializing module-type: {{#toUpper}}{{name}}{{/toUpper}}") + ctx := msgpack.NewContext("Deserializing module-type: {{#toUpper}}{{name}}{{/toUpper}}") {{#arguments.length}} - reader := msgpack.NewReadDecoder(ctx, argsBuf) + reader := msgpack.NewReadDecoder(ctx, argsBuf) - var ( - {{#arguments}} - _{{name}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} - {{#required}} - _{{name}}Set bool - {{/required}} - {{/arguments}} - ) + var ( + {{#stuctProps}} + {{#arguments}} + _{{name}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} + {{#required}} + _{{name}}Set bool + {{/required}} + {{/arguments}} + {{/stuctProps}} + ) - for i := int32(reader.ReadMapLength()); i > 0; i-- { - field := reader.ReadString() - reader.Context().Push(field, "unknown", "searching for property type"); - reader.Context().Pop() - switch field { - {{#arguments}} - case "{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}": - reader.Context().Push(field, "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "type found, reading property") - {{#scalar}} - {{> deserialize_scalar}} - {{/scalar}} - {{#enum}} - {{> deserialize_enum}} - {{/enum}} - {{#array}} - {{#startIter}}{{/startIter}} - {{> deserialize_array}} - {{#stopIter}}{{/stopIter}} - {{/array}} - {{#map}} - {{#startIter}}{{/startIter}} - {{> deserialize_map}} - {{#stopIter}}{{/stopIter}} - {{/map}} - {{#object}} - {{> deserialize_object}} - {{/object}} - {{#required}} - _{{name}}Set = true; - {{/required}} - reader.Context().Pop() - {{/arguments}} - } - } + for i := int32(reader.ReadMapLength()); i > 0; i-- { + field := reader.ReadString() + reader.Context().Push(field, "unknown", "searching for property type") + reader.Context().Pop() + switch field { + {{#arguments}} + case "{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}": + reader.Context().Push(field, "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "type found, reading property") + {{#scalar}} + {{> deserialize_scalar}} + {{/scalar}} + {{#enum}} + {{> deserialize_enum}} + {{/enum}} + {{#array}} + {{#startIter}}{{/startIter}} + {{> deserialize_array}} + {{#stopIter}}{{/stopIter}} + {{/array}} + {{#map}} + {{#startIter}}{{/startIter}} + {{> deserialize_map}} + {{#stopIter}}{{/stopIter}} + {{/map}} + {{#object}} + {{> deserialize_object}} + {{/object}} + {{#required}} + _{{name}}Set = true + {{/required}} + reader.Context().Pop() + {{/arguments}} + } + } - {{#arguments}} - {{#required}} - if (!_{{name}}Set) { - panic(reader.Context().PrintWithContext("Missing required property: '{{name}}: {{type}}'")) - } - {{/required}} - {{/arguments}} - {{/arguments.length}} + {{#arguments}} + {{#required}} + if !_{{name}}Set { + panic(reader.Context().PrintWithContext("Missing required property: '{{name}}: {{type}}'")) + } + {{/required}} + {{/arguments}} + {{/arguments.length}} - return &Args{{#toUpper}}{{name}}{{/toUpper}}{ - {{#arguments}} - {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}: _{{name}}, - {{/arguments}} - } + return &Args{{#toUpper}}{{name}}{{/toUpper}}{ + {{#stuctProps}} + {{#arguments}} + {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}: _{{name}}, + {{/arguments}} + {{/stuctProps}} + } } func Serialize{{#toUpper}}{{name}}{{/toUpper}}Result(value {{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}) []byte { - ctx := msgpack.NewContext("Serializing module-type: {{#toUpper}}{{name}}{{/toUpper}}") - encoder := msgpack.NewWriteEncoder(ctx) - Write{{#toUpper}}{{name}}{{/toUpper}}Result(encoder, value); - return encoder.Buffer() + ctx := msgpack.NewContext("Serializing module-type: {{#toUpper}}{{name}}{{/toUpper}}") + encoder := msgpack.NewWriteEncoder(ctx) + Write{{#toUpper}}{{name}}{{/toUpper}}Result(encoder, value); + return encoder.Buffer() } func Write{{#toUpper}}{{name}}{{/toUpper}}Result(writer msgpack.Write, value {{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}) { - {{#return}} - writer.Context().Push("{{name}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property"); - {{#scalar}} - {{> value_serialize_scalar}} - {{/scalar}} - {{#array}} - {{#startIter}}{{/startIter}} - {{> value_serialize_array}} - {{#stopIter}}{{/stopIter}} - {{/array}} - {{#map}} - {{#startIter}}{{/startIter}} - {{> value_serialize_map}} - {{#stopIter}}{{/stopIter}} - {{/map}} - {{#object}} - {{> value_serialize_object}} - {{/object}} - {{#enum}} - {{> value_serialize_enum}} - {{/enum}} - writer.Context().Pop() - {{/return}} + {{#return}} + writer.Context().Push("{{name}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") + {{#scalar}} + {{> value_serialize_scalar}} + {{/scalar}} + {{#array}} + {{#startIter}}{{/startIter}} + {{> value_serialize_array}} + {{#stopIter}}{{/stopIter}} + {{/array}} + {{#map}} + {{#startIter}}{{/startIter}} + {{> value_serialize_map}} + {{#stopIter}}{{/stopIter}} + {{/map}} + {{#object}} + {{> value_serialize_object}} + {{/object}} + {{#enum}} + {{> value_serialize_enum}} + {{/enum}} + writer.Context().Pop() + {{/return}} } +{{^last}} -{{/methods}} +{{/last}} +{{/methods}} \ No newline at end of file diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/module-type/%type%Wrapped-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/module-type/%type%Wrapped-go.mustache index 5e24b3b48a..3941f19b41 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/module-type/%type%Wrapped-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/module-type/%type%Wrapped-go.mustache @@ -2,34 +2,32 @@ package types {{#methods.length}} import ( - "github.com/consideritdone/polywrap-go/polywrap" - "some/library/to/methods" + "github.com/consideritdone/polywrap-go/polywrap" + "some/library/to/methods" ) {{/methods.length}} {{#methods}} func {{#toUpper}}{{name}}{{/toUpper}}Wrapped(argsBuf []byte, envSize uint32) []byte { - var env *Env - {{#env}} - {{#required}} - if (envSize == 0) { - panic("Environment is not set, and it is required by method 'objectMethod'") - } - {{/required}} - if (envSize > 0) { - envBuf := polywrap.WrapLoadEnv(envSize); - env = EnvFromBuffer(envBuf); - } - {{/env}} + var env *Env + {{#env}} + {{#required}} + if envSize == 0 { + panic("Environment is not set, and it is required by method 'objectMethod'") + } + {{/required}} + if envSize > 0 { + envBuf := polywrap.WrapLoadEnv(envSize) + env = EnvFromBuffer(envBuf) + } + {{/env}} - {{#arguments.length}} - args: = Deserialize{{#toUpper}}{{name}}{{/toUpper}}Args(argsBuf) - {{/arguments.length}} + {{#arguments.length}} + args := Deserialize{{#toUpper}}{{name}}{{/toUpper}}Args(argsBuf) + {{/arguments.length}} - result := methods.{{#toUpper}}{{name}}{{/toUpper}}({{#arguments.length}}args{{/arguments.length}}{{^arguments.length}}nil{{/arguments.length}}{{#env}}, env{{/env}}) - return Serialize{{#toUpper}}{{name}}{{/toUpper}}Result(result); + result := methods.{{#toUpper}}{{name}}{{/toUpper}}({{#arguments.length}}args{{/arguments.length}}{{^arguments.length}}nil{{/arguments.length}}{{#env}}, env{{/env}}) + return Serialize{{#toUpper}}{{name}}{{/toUpper}}Result(result) } -{{^last}} -{{/last}} {{/methods}} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/Object%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/Object%type%-go.mustache index 08d588529e..b17610926a 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/Object%type%-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/Object%type%-go.mustache @@ -1,16 +1,13 @@ package types -import ( - "github.com/consideritdone/polywrap-go/polywrap/msgpack" - "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" - "github.com/consideritdone/polywrap-go/polywrap/msgpack/container" - "github.com/valyala/fastjson" -) +{{#makeImports}}{{#properties}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/properties}}{{/makeImports}} type {{#toUpper}}{{type}}{{/toUpper}} struct { - {{#properties}} - {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} - {{/properties}} +{{#stuctProps}} +{{#properties}} +{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} +{{/properties}} +{{/stuctProps}} } func {{#toUpper}}{{type}}{{/toUpper}}ToBuffer(value *{{#toUpper}}{{type}}{{/toUpper}}) []byte { @@ -28,4 +25,3 @@ func {{#toUpper}}{{type}}{{/toUpper}}Write(writer msgpack.Write, value *{{#toUpp func {{#toUpper}}{{type}}{{/toUpper}}Read(reader msgpack.Read) *{{#toUpper}}{{type}}{{/toUpper}} { return read{{#toUpper}}{{type}}{{/toUpper}}(reader) } - diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/Object%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/Object%type%Serialization-go.mustache index 38c9f04e63..93bec1a7d4 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/Object%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/Object%type%Serialization-go.mustache @@ -1,11 +1,6 @@ package types -import ( - "github.com/consideritdone/polywrap-go/polywrap/msgpack" - "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" - "github.com/consideritdone/polywrap-go/polywrap/msgpack/container" - "github.com/valyala/fastjson" -) +{{#makeImports}}{{#properties}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/properties}}{{/makeImports}} func serialize{{#toUpper}}{{type}}{{/toUpper}}(value *{{#toUpper}}{{type}}{{/toUpper}}) []byte { ctx := msgpack.NewContext("Serializing (encoding) env-type: {{#toUpper}}{{type}}{{/toUpper}}") @@ -16,30 +11,30 @@ func serialize{{#toUpper}}{{type}}{{/toUpper}}(value *{{#toUpper}}{{type}}{{/toU func write{{#toUpper}}{{type}}{{/toUpper}}(writer msgpack.Write, value *{{#toUpper}}{{type}}{{/toUpper}}) { writer.WriteMapLength({{properties.length}}) - {{#properties}} - writer.Context().Push("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") - writer.WriteString("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}") - {{#scalar}} - {{> serialize_scalar}} - {{/scalar}} - {{#array}} - {{#startIter}}{{/startIter}} - {{> serialize_array}} - {{#stopIter}}{{/stopIter}} - {{/array}} - {{#map}} - {{#startIter}}{{/startIter}} - {{> serialize_map}} - {{#stopIter}}{{/stopIter}} - {{/map}} - {{#object}} - {{> serialize_object}} - {{/object}} - {{#enum}} - {{> serialize_enum}} - {{/enum}} - writer.Context().Pop() - {{/properties}} + {{#properties}} + writer.Context().Push("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") + writer.WriteString("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}") + {{#scalar}} + {{> serialize_scalar}} + {{/scalar}} + {{#array}} + {{#startIter}}{{/startIter}} + {{> serialize_array}} + {{#stopIter}}{{/stopIter}} + {{/array}} + {{#map}} + {{#startIter}}{{/startIter}} + {{> serialize_map}} + {{#stopIter}}{{/stopIter}} + {{/map}} + {{#object}} + {{> serialize_object}} + {{/object}} + {{#enum}} + {{> serialize_enum}} + {{/enum}} + writer.Context().Pop() + {{/properties}} } func deserialize{{#toUpper}}{{type}}{{/toUpper}}(data []byte) *{{#toUpper}}{{type}}{{/toUpper}} { @@ -49,61 +44,64 @@ func deserialize{{#toUpper}}{{type}}{{/toUpper}}(data []byte) *{{#toUpper}}{{typ } func read{{#toUpper}}{{type}}{{/toUpper}}(reader msgpack.Read) *{{#toUpper}}{{type}}{{/toUpper}} { - var ( - {{#properties}} - _{{name}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} - {{#required}} - _{{name}}Set bool - {{/required}} - {{/properties}} - ) + var ( + {{#stuctProps}} + {{#properties}} + _{{name}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} + {{#required}} + _{{name}}Set bool + {{/required}} + {{/properties}} + {{/stuctProps}} + ) for i := int32(reader.ReadMapLength()); i > 0; i-- { field := reader.ReadString() - reader.Context().Push(field, "unknown", "searching for property type"); + reader.Context().Push(field, "unknown", "searching for property type") switch field { - {{#properties}} - case "{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}": - reader.Context().Push(field, "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "type found, reading property") - {{#scalar}} - {{> deserialize_scalar}} - {{/scalar}} - {{#enum}} - {{> deserialize_enum}} - {{/enum}} - {{#array}} - {{#startIter}}{{/startIter}} - {{> deserialize_array}} - {{#stopIter}}{{/stopIter}} - {{/array}} - {{#map}} - {{#startIter}}{{/startIter}} - {{> deserialize_map}} - {{#stopIter}}{{/stopIter}} - {{/map}} - {{#object}} - {{> deserialize_object}} - {{/object}} - {{#required}} - _{{name}}Set = true; - {{/required}} - reader.Context().Pop() - {{/properties}} + {{#properties}} + case "{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}": + reader.Context().Push(field, "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "type found, reading property") + {{#scalar}} + {{> deserialize_scalar}} + {{/scalar}} + {{#enum}} + {{> deserialize_enum}} + {{/enum}} + {{#array}} + {{#startIter}}{{/startIter}} + {{> deserialize_array}} + {{#stopIter}}{{/stopIter}} + {{/array}} + {{#map}} + {{#startIter}}{{/startIter}} + {{> deserialize_map}} + {{#stopIter}}{{/stopIter}} + {{/map}} + {{#object}} + {{> deserialize_object}} + {{/object}} + {{#required}} + _{{name}}Set = true + {{/required}} + reader.Context().Pop() + {{/properties}} } - reader.Context().Pop() + reader.Context().Pop() } - {{#properties}} - {{#required}} - if (!_{{name}}Set) { - panic(reader.Context().PrintWithContext("Missing required property: '{{name}}: {{type}}'")) - } - {{/required}} - {{/properties}} - - return &{{#toUpper}}{{type}}{{/toUpper}}{ - {{#properties}} - {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}: _{{name}}, - {{/properties}} - } -} \ No newline at end of file + {{#properties}} + {{#required}} + if !_{{name}}Set { + panic(reader.Context().PrintWithContext("Missing required property: '{{name}}: {{type}}'")) + } + {{/required}} + {{/properties}} + return &{{#toUpper}}{{type}}{{/toUpper}}{ + {{#stuctProps}} + {{#properties}} + {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}: _{{name}}, + {{/properties}} + {{/stuctProps}} + } +} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_array.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_array.mustache index 2a807ea5b0..cc83c569de 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_array.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_array.mustache @@ -1,23 +1,23 @@ if value.{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}{{#lastFullIter}}i{{/lastFullIter}} == nil { - writer.WriteNil() + writer.WriteNil() } else if len(value.{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}{{#lastFullIter}}i{{/lastFullIter}}) == 0 { - writer.WriteNil() + writer.WriteNil() } else { - for {{#nextIter}}i{{/nextIter}} := range value.{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}{{#prevFullIter}}i{{/prevFullIter}} { - {{#scalar}} - {{> serialize_scalar}} - {{/scalar}} - {{#enum}} - {{> serialize_enum}} - {{/enum}} - {{#array}} - {{> serialize_array}} - {{/array}} - {{#map}} - {{> serialize_map_value}} - {{/map}} - {{#object}} - {{> serialize_object}} - {{/object}} - } + for {{#nextIter}}i{{/nextIter}} := range value.{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}{{#prevFullIter}}i{{/prevFullIter}} { + {{#scalar}} + {{> serialize_scalar}} + {{/scalar}} + {{#enum}} + {{> serialize_enum}} + {{/enum}} + {{#array}} + {{> serialize_array}} + {{/array}} + {{#map}} + {{> serialize_map_value}} + {{/map}} + {{#object}} + {{> serialize_object}} + {{/object}} + } } diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_enum.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_enum.mustache index 3a5f83b057..cf2d5be270 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_enum.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_enum.mustache @@ -1,13 +1,13 @@ { - v := value.{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}{{#lastFullIter}}i{{/lastFullIter}} - {{#required}} - writer.WriteI32(int32(v)); - {{/required}} - {{^required}} - if v == nil { - writer.WriteNil() - } else { - writer.WriteI32(int32(*v)); - } - {{/required}} + v := value.{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}{{#lastFullIter}}i{{/lastFullIter}} + {{#required}} + writer.WriteI32(int32(v)) + {{/required}} + {{^required}} + if v == nil { + writer.WriteNil() + } else { + writer.WriteI32(int32(*v)) + } + {{/required}} } diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_map.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_map.mustache index ea96d27d16..3191f3ad83 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_map.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_map.mustache @@ -1,24 +1,24 @@ if value.{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} == nil { - writer.WriteNil() + writer.WriteNil() } else if len(value.{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}) == 0 { - writer.WriteNil() + writer.WriteNil() } else { - for {{#nextIter}}i{{/nextIter}} := range value.{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}{{#getPrevIter}}i{{/getPrevIter}} { - writer.Write{{#key}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/key}}({{#currIter}}i{{/currIter}}) - {{#scalar}} - {{> serialize_scalar}} - {{/scalar}} - {{#enum}} - {{> serialize_enum}} - {{/enum}} - {{#array}} - {{> serialize_array}} - {{/array}} - {{#map}} - {{> serialize_map}} - {{/map}} - {{#object}} - {{> serialize_object}} - {{/object}} - } + for {{#nextIter}}i{{/nextIter}} := range value.{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}{{#getPrevIter}}i{{/getPrevIter}} { + writer.Write{{#key}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/key}}({{#currIter}}i{{/currIter}}) + {{#scalar}} + {{> serialize_scalar}} + {{/scalar}} + {{#enum}} + {{> serialize_enum}} + {{/enum}} + {{#array}} + {{> serialize_array}} + {{/array}} + {{#map}} + {{> serialize_map}} + {{/map}} + {{#object}} + {{> serialize_object}} + {{/object}} + } } diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_object.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_object.mustache index 95139e29c6..62c6d07eeb 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_object.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_object.mustache @@ -1,10 +1,9 @@ - { - v := value.{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}{{#lastFullIter}}i{{/lastFullIter}} - {{#required}} - {{#toUpper}}{{type}}{{/toUpper}}Write(writer, &v) - {{/required}} - {{^required}} - {{#toUpper}}{{type}}{{/toUpper}}Write(writer, v) - {{/required}} + v := value.{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}{{#lastFullIter}}i{{/lastFullIter}} + {{#required}} + {{#toUpper}}{{type}}{{/toUpper}}Write(writer, &v) + {{/required}} + {{^required}} + {{#toUpper}}{{type}}{{/toUpper}}Write(writer, v) + {{/required}} } diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_scalar.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_scalar.mustache index 256dd0ec43..322a1867ce 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_scalar.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_scalar.mustache @@ -1,13 +1,13 @@ { - v := value.{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}{{#lastFullIter}}i{{/lastFullIter}} - {{#required}} - writer.Write{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(v) - {{/required}} - {{^required}} - if v == nil { - writer.WriteNil() - } else { - {{#writePointer}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}} - v{{/writePointer}} - } - {{/required}} + v := value.{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}{{#lastFullIter}}i{{/lastFullIter}} + {{#required}} + writer.Write{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(v) + {{/required}} + {{^required}} + if v == nil { + writer.WriteNil() + } else { + {{#writePointer}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}} - v{{/writePointer}} + } + {{/required}} } diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_array.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_array.mustache index 8a852d06e1..808965046e 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_array.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_array.mustache @@ -1,23 +1,23 @@ if reader.IsNil() { - value{{#lastFullIter}}i{{/lastFullIter}} = nil + value{{#lastFullIter}}i{{/lastFullIter}} = nil } else { - {{#nextIter}}ln{{/nextIter}} := reader.ReadArrayLength() - value{{#prevFullIter}}i{{/prevFullIter}} = make({{#toWasm}}{{toGraphQLType}}{{/toWasm}}, {{#currIter}}ln{{/currIter}}) - for {{#currIter}}i{{/currIter}} := uint32(0); {{#currIter}}i{{/currIter}} < {{#currIter}}ln{{/currIter}}; {{#currIter}}i{{/currIter}}++ { - {{#scalar}} - {{> deserialize_scalar}} - {{/scalar}} - {{#enum}} - {{> deserialize_enum}} - {{/enum}} - {{#array}} - {{> deserialize_array}} - {{/array}} - {{#map}} - {{> deserialize_map}} - {{/map}} - {{#object}} - {{> deserialize_object}} - {{/object}} - } + {{#nextIter}}ln{{/nextIter}} := reader.ReadArrayLength() + value{{#prevFullIter}}i{{/prevFullIter}} = make({{#toWasm}}{{toGraphQLType}}{{/toWasm}}, {{#currIter}}ln{{/currIter}}) + for {{#currIter}}i{{/currIter}} := uint32(0); {{#currIter}}i{{/currIter}} < {{#currIter}}ln{{/currIter}}; {{#currIter}}i{{/currIter}}++ { + {{#scalar}} + {{> deserialize_scalar}} + {{/scalar}} + {{#enum}} + {{> deserialize_enum}} + {{/enum}} + {{#array}} + {{> deserialize_array}} + {{/array}} + {{#map}} + {{> deserialize_map}} + {{/map}} + {{#object}} + {{> deserialize_object}} + {{/object}} + } } diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_enum.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_enum.mustache index 72dcb0b7ed..b498c3d4f5 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_enum.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_enum.mustache @@ -4,8 +4,8 @@ Sanitize{{#toUpper}}{{type}}{{/toUpper}}Value(int32(_{{name}}{{#lastFullIter}}i{ {{/required}} {{^required}} if !reader.IsNil() { - v := {{#toUpper}}{{type}}{{/toUpper}}(reader.ReadI32()) - Sanitize{{#toUpper}}{{type}}{{/toUpper}}Value(int32(v)) - value{{#lastFullIter}}i{{/lastFullIter}} = &v + v := {{#toUpper}}{{type}}{{/toUpper}}(reader.ReadI32()) + Sanitize{{#toUpper}}{{type}}{{/toUpper}}Value(int32(v)) + value{{#lastFullIter}}i{{/lastFullIter}} = &v } {{/required}} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_map.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_map.mustache index 5861374a16..c0eeaa66d6 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_map.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_map.mustache @@ -1,24 +1,24 @@ if reader.IsNil() { - value{{#lastFullIter}}i{{/lastFullIter}} = nil + value{{#lastFullIter}}i{{/lastFullIter}} = nil } else { - {{#nextIter}}ln{{/nextIter}} := reader.ReadMapLength() - value{{#prevFullIter}}i{{/prevFullIter}} = make({{#toWasm}}{{toGraphQLType}}{{/toWasm}}) - for {{#currIter}}j{{/currIter}} := uint32(0); {{#currIter}}j{{/currIter}} < {{#currIter}}ln{{/currIter}}; {{#currIter}}j{{/currIter}}++ { - {{#currIter}}i{{/currIter}} := reader.Read{{#key}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/key}}() - {{#scalar}} - {{> deserialize_scalar}} - {{/scalar}} - {{#enum}} - {{> deserialize_enum}} - {{/enum}} - {{#array}} - {{> deserialize_array}} - {{/array}} - {{#map}} - {{> deserialize_map}} - {{/map}} - {{#object}} - {{> deserialize_object}} - {{/object}} - } + {{#nextIter}}ln{{/nextIter}} := reader.ReadMapLength() + value{{#prevFullIter}}i{{/prevFullIter}} = make({{#toWasm}}{{toGraphQLType}}{{/toWasm}}) + for {{#currIter}}j{{/currIter}} := uint32(0); {{#currIter}}j{{/currIter}} < {{#currIter}}ln{{/currIter}}; {{#currIter}}j{{/currIter}}++ { + {{#currIter}}i{{/currIter}} := reader.Read{{#key}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/key}}() + {{#scalar}} + {{> deserialize_scalar}} + {{/scalar}} + {{#enum}} + {{> deserialize_enum}} + {{/enum}} + {{#array}} + {{> deserialize_array}} + {{/array}} + {{#map}} + {{> deserialize_map}} + {{/map}} + {{#object}} + {{> deserialize_object}} + {{/object}} + } } diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_object.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_object.mustache index 645435c97c..2a7c26cd0c 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_object.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_object.mustache @@ -1,8 +1,8 @@ if v := {{#toUpper}}{{type}}{{/toUpper}}Read(reader); v != nil { - {{#required}} - value{{#lastFullIter}}i{{/lastFullIter}} = *v - {{/required}} - {{^required}} - value{{#lastFullIter}}i{{/lastFullIter}} = v - {{/required}} + {{#required}} + value{{#lastFullIter}}i{{/lastFullIter}} = *v + {{/required}} + {{^required}} + value{{#lastFullIter}}i{{/lastFullIter}} = v + {{/required}} } diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_scalar.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_scalar.mustache index c917632081..09966bd026 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_scalar.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_scalar.mustache @@ -3,7 +3,7 @@ value{{#lastFullIter}}i{{/lastFullIter}} = reader.Read{{#toMsgPack}}{{toGraphQLT {{/required}} {{^required}} if !reader.IsNil() { - v := reader.Read{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(); - value{{#lastFullIter}}i{{/lastFullIter}} = {{#readPointer}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}} - v{{/readPointer}} + v := reader.Read{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}() + value{{#lastFullIter}}i{{/lastFullIter}} = {{#readPointer}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}} - v{{/readPointer}} } {{/required}} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_array.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_array.mustache index 9c759d825b..8dd12bb4f4 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_array.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_array.mustache @@ -1,23 +1,23 @@ if value{{#lastFullIter}}i{{/lastFullIter}} == nil { - writer.WriteNil() + writer.WriteNil() } else if len(value{{#lastFullIter}}i{{/lastFullIter}}) == 0 { - writer.WriteNil() + writer.WriteNil() } else { - for {{#nextIter}}i{{/nextIter}} := range value{{#prevFullIter}}i{{/prevFullIter}} { - {{#scalar}} - {{> value_serialize_scalar}} - {{/scalar}} - {{#enum}} - {{> value_serialize_enum}} - {{/enum}} - {{#array}} - {{> value_serialize_array}} - {{/array}} - {{#map}} - {{> value_serialize_map}} - {{/map}} - {{#object}} - {{> value_serialize_object}} - {{/object}} - } + for {{#nextIter}}i{{/nextIter}} := range value{{#prevFullIter}}i{{/prevFullIter}} { + {{#scalar}} + {{> value_serialize_scalar}} + {{/scalar}} + {{#enum}} + {{> value_serialize_enum}} + {{/enum}} + {{#array}} + {{> value_serialize_array}} + {{/array}} + {{#map}} + {{> value_serialize_map}} + {{/map}} + {{#object}} + {{> value_serialize_object}} + {{/object}} + } } diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_enum.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_enum.mustache index c6567e8c24..590702b638 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_enum.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_enum.mustache @@ -1,13 +1,13 @@ { - v := value{{#lastFullIter}}i{{/lastFullIter}} - {{#required}} - writer.WriteI32(int32(v)); - {{/required}} - {{^required}} - if v == nil { - writer.WriteNil() - } else { - writer.WriteI32(int32(*v)); - } - {{/required}} + v := value{{#lastFullIter}}i{{/lastFullIter}} + {{#required}} + writer.WriteI32(int32(v)) + {{/required}} + {{^required}} + if v == nil { + writer.WriteNil() + } else { + writer.WriteI32(int32(*v)) + } + {{/required}} } diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_map.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_map.mustache index d60bb55b17..41b00f5949 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_map.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_map.mustache @@ -1,24 +1,24 @@ if value == nil { - writer.WriteNil() + writer.WriteNil() } else if len(value) == 0 { - writer.WriteNil() + writer.WriteNil() } else { - for {{#nextIter}}i{{/nextIter}} := range value{{#getPrevIter}}i{{/getPrevIter}} { - writer.Write{{#key}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/key}}({{#currIter}}i{{/currIter}}) - {{#scalar}} - {{> value_serialize_scalar}} - {{/scalar}} - {{#enum}} - {{> value_serialize_enum}} - {{/enum}} - {{#array}} - {{> value_serialize_array}} - {{/array}} - {{#map}} - {{> value_serialize_map}} - {{/map}} - {{#object}} - {{> value_serialize_object}} - {{/object}} - } + for {{#nextIter}}i{{/nextIter}} := range value{{#getPrevIter}}i{{/getPrevIter}} { + writer.Write{{#key}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/key}}({{#currIter}}i{{/currIter}}) + {{#scalar}} + {{> value_serialize_scalar}} + {{/scalar}} + {{#enum}} + {{> value_serialize_enum}} + {{/enum}} + {{#array}} + {{> value_serialize_array}} + {{/array}} + {{#map}} + {{> value_serialize_map}} + {{/map}} + {{#object}} + {{> value_serialize_object}} + {{/object}} + } } diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_object.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_object.mustache index aa5894e0ba..3b6ae4d7c6 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_object.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_object.mustache @@ -1,9 +1,9 @@ { - v := value{{#lastFullIter}}i{{/lastFullIter}} - {{#required}} - {{#toUpper}}{{type}}{{/toUpper}}Write(writer, &v) - {{/required}} - {{^required}} - {{#toUpper}}{{type}}{{/toUpper}}Write(writer, v) - {{/required}} + v := value{{#lastFullIter}}i{{/lastFullIter}} + {{#required}} + {{#toUpper}}{{type}}{{/toUpper}}Write(writer, &v) + {{/required}} + {{^required}} + {{#toUpper}}{{type}}{{/toUpper}}Write(writer, v) + {{/required}} } diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_scalar.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_scalar.mustache index 6aa89267b1..440c44f87c 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_scalar.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_scalar.mustache @@ -1,13 +1,13 @@ { - v := value{{#lastFullIter}}i{{/lastFullIter}} - {{#required}} - writer.Write{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(v) - {{/required}} - {{^required}} - if v == nil { - writer.WriteNil() - } else { - {{#writePointer}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}} - v{{/writePointer}} - } - {{/required}} + v := value{{#lastFullIter}}i{{/lastFullIter}} + {{#required}} + writer.Write{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(v) + {{/required}} + {{^required}} + if v == nil { + writer.WriteNil() + } else { + {{#writePointer}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}} - v{{/writePointer}} + } + {{/required}} } diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/enum_test_import__enum.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/enum_test_import__enum.go new file mode 100644 index 0000000000..e70a6de407 --- /dev/null +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/enum_test_import__enum.go @@ -0,0 +1,38 @@ +package test_import + +type TestImport_Enum int32 + +const ( + TestImport_EnumSTRING = iota + TestImport_EnumBYTES = iota + testImport_EnumMax = iota +) + +func SanitizeTestImport_EnumValue(value int32) { + if !(value >= 0 && value < int32(testImport_EnumMax)) { + panic("Invalid value for enum 'TestImport_Enum'") + } +} + +func GetTestImport_EnumValue(key string) TestImport_Enum { + switch key { + case "STRING": + return TestImport_EnumSTRING + case "BYTES": + return TestImport_EnumBYTES + default: + panic("Invalid key for enum 'TestImport_Enum'") + } +} + +func GetTestImport_EnumKey(value TestImport_Enum) string { + SanitizeTestImport_EnumValue(int32(value)) + switch value { + case TestImport_EnumSTRING: + return "STRING" + case TestImport_EnumBYTES: + return "BYTES" + default: + panic("Invalid value for enum 'TestImport_Enum'") + } +} diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env.go new file mode 100644 index 0000000000..a82fa76d57 --- /dev/null +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env.go @@ -0,0 +1,25 @@ +package test_import + +import ( + "github.com/consideritdone/polywrap-go/polywrap/msgpack" +) + +type TestImport_Env struct { + EnviroProp string +} + +func TestImport_EnvToBuffer(value *TestImport_Env) []byte { + return serializeTestImport_Env(value) +} + +func TestImport_EnvFromBuffer(data []byte) *TestImport_Env { + return deserializeTestImport_Env(data) +} + +func TestImport_EnvWrite(writer msgpack.Write, value *TestImport_Env) { + writeTestImport_Env(writer, value) +} + +func TestImport_EnvRead(reader msgpack.Read) *TestImport_Env { + return readTestImport_Env(reader) +} diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env_serialization.go new file mode 100644 index 0000000000..f0bca14901 --- /dev/null +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env_serialization.go @@ -0,0 +1,57 @@ +package test_import + +import ( + "github.com/consideritdone/polywrap-go/polywrap/msgpack" +) + +func serializeTestImport_Env(value *TestImport_Env) []byte { + ctx := msgpack.NewContext("Serializing (encoding) env-type: TestImport_Env") + encoder := msgpack.NewWriteEncoder(ctx) + writeTestImport_Env(encoder, value) + return encoder.Buffer() +} + +func writeTestImport_Env(writer msgpack.Write, value *TestImport_Env) { + writer.WriteMapLength(1) + writer.Context().Push("EnviroProp", "string", "writing property") + writer.WriteString("EnviroProp") + { + v := value.EnviroProp + writer.WriteString(v) + } + writer.Context().Pop() +} + +func deserializeTestImport_Env(data []byte) *TestImport_Env { + ctx := msgpack.NewContext("Deserializing (decoding) env-type: TestImport_Env") + reader := msgpack.NewReadDecoder(ctx, data) + return readTestImport_Env(reader) +} + +func readTestImport_Env(reader msgpack.Read) *TestImport_Env { + var ( + _enviroProp string + _enviroPropSet bool + ) + + for i := int32(reader.ReadMapLength()); i > 0; i-- { + field := reader.ReadString() + reader.Context().Push(field, "unknown", "searching for property type") + switch field { + case "EnviroProp": + reader.Context().Push(field, "string", "type found, reading property") + _enviroProp = reader.ReadString() + _enviroPropSet = true + reader.Context().Pop() + } + reader.Context().Pop() + } + + if !_enviroPropSet { + panic(reader.Context().PrintWithContext("Missing required property: 'enviroProp: String'")) + } + + return &TestImport_Env{ + EnviroProp: _enviroProp, + } +} diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object.go new file mode 100644 index 0000000000..8e38e568f2 --- /dev/null +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object.go @@ -0,0 +1,25 @@ +package test_import + +import ( + "github.com/consideritdone/polywrap-go/polywrap/msgpack" +) + +type TestImport_AnotherObject struct { + Prop string +} + +func TestImport_AnotherObjectToBuffer(value *TestImport_AnotherObject) []byte { + return serializeTestImport_AnotherObject(value) +} + +func TestImport_AnotherObjectFromBuffer(data []byte) *TestImport_AnotherObject { + return deserializeTestImport_AnotherObject(data) +} + +func TestImport_AnotherObjectWrite(writer msgpack.Write, value *TestImport_AnotherObject) { + writeTestImport_AnotherObject(writer, value) +} + +func TestImport_AnotherObjectRead(reader msgpack.Read) *TestImport_AnotherObject { + return readTestImport_AnotherObject(reader) +} diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object_serialization.go new file mode 100644 index 0000000000..8fd5893842 --- /dev/null +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object_serialization.go @@ -0,0 +1,57 @@ +package test_import + +import ( + "github.com/consideritdone/polywrap-go/polywrap/msgpack" +) + +func serializeTestImport_AnotherObject(value *TestImport_AnotherObject) []byte { + ctx := msgpack.NewContext("Serializing (encoding) env-type: TestImport_AnotherObject") + encoder := msgpack.NewWriteEncoder(ctx) + writeTestImport_AnotherObject(encoder, value) + return encoder.Buffer() +} + +func writeTestImport_AnotherObject(writer msgpack.Write, value *TestImport_AnotherObject) { + writer.WriteMapLength(1) + writer.Context().Push("Prop", "string", "writing property") + writer.WriteString("Prop") + { + v := value.Prop + writer.WriteString(v) + } + writer.Context().Pop() +} + +func deserializeTestImport_AnotherObject(data []byte) *TestImport_AnotherObject { + ctx := msgpack.NewContext("Deserializing (decoding) env-type: TestImport_AnotherObject") + reader := msgpack.NewReadDecoder(ctx, data) + return readTestImport_AnotherObject(reader) +} + +func readTestImport_AnotherObject(reader msgpack.Read) *TestImport_AnotherObject { + var ( + _prop string + _propSet bool + ) + + for i := int32(reader.ReadMapLength()); i > 0; i-- { + field := reader.ReadString() + reader.Context().Push(field, "unknown", "searching for property type") + switch field { + case "Prop": + reader.Context().Push(field, "string", "type found, reading property") + _prop = reader.ReadString() + _propSet = true + reader.Context().Pop() + } + reader.Context().Pop() + } + + if !_propSet { + panic(reader.Context().PrintWithContext("Missing required property: 'prop: String'")) + } + + return &TestImport_AnotherObject{ + Prop: _prop, + } +} diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object.go new file mode 100644 index 0000000000..6b60414f31 --- /dev/null +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object.go @@ -0,0 +1,32 @@ +package test_import + +import ( + "github.com/consideritdone/polywrap-go/polywrap/msgpack" +) + +type TestImport_Object struct { + Object TestImport_AnotherObject + OptObject *TestImport_AnotherObject + ObjectArray []TestImport_AnotherObject + OptObjectArray []*TestImport_AnotherObject + En TestImport_Enum + OptEnum *TestImport_Enum + EnumArray []TestImport_Enum + OptEnumArray []*TestImport_Enum +} + +func TestImport_ObjectToBuffer(value *TestImport_Object) []byte { + return serializeTestImport_Object(value) +} + +func TestImport_ObjectFromBuffer(data []byte) *TestImport_Object { + return deserializeTestImport_Object(data) +} + +func TestImport_ObjectWrite(writer msgpack.Write, value *TestImport_Object) { + writeTestImport_Object(writer, value) +} + +func TestImport_ObjectRead(reader msgpack.Read) *TestImport_Object { + return readTestImport_Object(reader) +} diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object_serialization.go new file mode 100644 index 0000000000..e9e87399a2 --- /dev/null +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object_serialization.go @@ -0,0 +1,253 @@ +package test_import + +import ( + "github.com/consideritdone/polywrap-go/polywrap/msgpack" +) + +func serializeTestImport_Object(value *TestImport_Object) []byte { + ctx := msgpack.NewContext("Serializing (encoding) env-type: TestImport_Object") + encoder := msgpack.NewWriteEncoder(ctx) + writeTestImport_Object(encoder, value) + return encoder.Buffer() +} + +func writeTestImport_Object(writer msgpack.Write, value *TestImport_Object) { + writer.WriteMapLength(8) + writer.Context().Push("Object", "TestImport_AnotherObject", "writing property") + writer.WriteString("Object") + { + v := value.Object + TestImport_AnotherObjectWrite(writer, &v) + } + writer.Context().Pop() + writer.Context().Push("OptObject", "*TestImport_AnotherObject", "writing property") + writer.WriteString("OptObject") + { + v := value.OptObject + TestImport_AnotherObjectWrite(writer, v) + } + writer.Context().Pop() + writer.Context().Push("ObjectArray", "[]TestImport_AnotherObject", "writing property") + writer.WriteString("ObjectArray") + if value.ObjectArray == nil { + writer.WriteNil() + } else if len(value.ObjectArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.ObjectArray { + { + v := value.ObjectArray[i0] + TestImport_AnotherObjectWrite(writer, &v) + } + } + } + writer.Context().Pop() + writer.Context().Push("OptObjectArray", "[]*TestImport_AnotherObject", "writing property") + writer.WriteString("OptObjectArray") + if value.OptObjectArray == nil { + writer.WriteNil() + } else if len(value.OptObjectArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.OptObjectArray { + { + v := value.OptObjectArray[i0] + TestImport_AnotherObjectWrite(writer, v) + } + } + } + writer.Context().Pop() + writer.Context().Push("En", "TestImport_Enum", "writing property") + writer.WriteString("En") + { + v := value.En + writer.WriteI32(int32(v)) + } + writer.Context().Pop() + writer.Context().Push("OptEnum", "*TestImport_Enum", "writing property") + writer.WriteString("OptEnum") + { + v := value.OptEnum + if v == nil { + writer.WriteNil() + } else { + writer.WriteI32(int32(*v)) + } + } + writer.Context().Pop() + writer.Context().Push("EnumArray", "[]TestImport_Enum", "writing property") + writer.WriteString("EnumArray") + if value.EnumArray == nil { + writer.WriteNil() + } else if len(value.EnumArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.EnumArray { + { + v := value.EnumArray[i0] + writer.WriteI32(int32(v)) + } + } + } + writer.Context().Pop() + writer.Context().Push("OptEnumArray", "[]*TestImport_Enum", "writing property") + writer.WriteString("OptEnumArray") + if value.OptEnumArray == nil { + writer.WriteNil() + } else if len(value.OptEnumArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.OptEnumArray { + { + v := value.OptEnumArray[i0] + if v == nil { + writer.WriteNil() + } else { + writer.WriteI32(int32(*v)) + } + } + } + } + writer.Context().Pop() +} + +func deserializeTestImport_Object(data []byte) *TestImport_Object { + ctx := msgpack.NewContext("Deserializing (decoding) env-type: TestImport_Object") + reader := msgpack.NewReadDecoder(ctx, data) + return readTestImport_Object(reader) +} + +func readTestImport_Object(reader msgpack.Read) *TestImport_Object { + var ( + _object TestImport_AnotherObject + _objectSet bool + _optObject *TestImport_AnotherObject + _objectArray []TestImport_AnotherObject + _objectArraySet bool + _optObjectArray []*TestImport_AnotherObject + _en TestImport_Enum + _enSet bool + _optEnum *TestImport_Enum + _enumArray []TestImport_Enum + _enumArraySet bool + _optEnumArray []*TestImport_Enum + ) + + for i := int32(reader.ReadMapLength()); i > 0; i-- { + field := reader.ReadString() + reader.Context().Push(field, "unknown", "searching for property type") + switch field { + case "Object": + reader.Context().Push(field, "TestImport_AnotherObject", "type found, reading property") + if v := TestImport_AnotherObjectRead(reader); v != nil { + _object = *v + } + _objectSet = true + reader.Context().Pop() + case "OptObject": + reader.Context().Push(field, "*TestImport_AnotherObject", "type found, reading property") + if v := TestImport_AnotherObjectRead(reader); v != nil { + _optObject = v + } + reader.Context().Pop() + case "ObjectArray": + reader.Context().Push(field, "[]TestImport_AnotherObject", "type found, reading property") + if reader.IsNil() { + _objectArray = nil + } else { + ln0 := reader.ReadArrayLength() + _objectArray = make([]TestImport_AnotherObject, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + if v := TestImport_AnotherObjectRead(reader); v != nil { + _objectArray[i0] = *v + } + } + } + _objectArraySet = true + reader.Context().Pop() + case "OptObjectArray": + reader.Context().Push(field, "[]*TestImport_AnotherObject", "type found, reading property") + if reader.IsNil() { + _optObjectArray = nil + } else { + ln0 := reader.ReadArrayLength() + _optObjectArray = make([]*TestImport_AnotherObject, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + if v := TestImport_AnotherObjectRead(reader); v != nil { + _optObjectArray[i0] = v + } + } + } + reader.Context().Pop() + case "En": + reader.Context().Push(field, "TestImport_Enum", "type found, reading property") + _en = TestImport_Enum(reader.ReadI32()) + SanitizeTestImport_EnumValue(int32(_en)) + _enSet = true + reader.Context().Pop() + case "OptEnum": + reader.Context().Push(field, "*TestImport_Enum", "type found, reading property") + if !reader.IsNil() { + v := TestImport_Enum(reader.ReadI32()) + SanitizeTestImport_EnumValue(int32(v)) + _optEnum = &v + } + reader.Context().Pop() + case "EnumArray": + reader.Context().Push(field, "[]TestImport_Enum", "type found, reading property") + if reader.IsNil() { + _enumArray = nil + } else { + ln0 := reader.ReadArrayLength() + _enumArray = make([]TestImport_Enum, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + _enumArray[i0] = TestImport_Enum(reader.ReadI32()) + SanitizeTestImport_EnumValue(int32(_enumArray[i0])) + } + } + _enumArraySet = true + reader.Context().Pop() + case "OptEnumArray": + reader.Context().Push(field, "[]*TestImport_Enum", "type found, reading property") + if reader.IsNil() { + _optEnumArray = nil + } else { + ln0 := reader.ReadArrayLength() + _optEnumArray = make([]*TestImport_Enum, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + if !reader.IsNil() { + v := TestImport_Enum(reader.ReadI32()) + SanitizeTestImport_EnumValue(int32(v)) + _optEnumArray[i0] = &v + } + } + } + reader.Context().Pop() + } + reader.Context().Pop() + } + + if !_objectSet { + panic(reader.Context().PrintWithContext("Missing required property: 'object: TestImport_AnotherObject'")) + } + if !_objectArraySet { + panic(reader.Context().PrintWithContext("Missing required property: 'objectArray: [TestImport_AnotherObject]'")) + } + if !_enSet { + panic(reader.Context().PrintWithContext("Missing required property: 'en: TestImport_Enum'")) + } + if !_enumArraySet { + panic(reader.Context().PrintWithContext("Missing required property: 'enumArray: [TestImport_Enum]'")) + } + + return &TestImport_Object{ + Object: _object, + OptObject: _optObject, + ObjectArray: _objectArray, + OptObjectArray: _optObjectArray, + En: _en, + OptEnum: _optEnum, + EnumArray: _enumArray, + OptEnumArray: _optEnumArray, + } +} diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_serialization.go new file mode 100644 index 0000000000..3189323eff --- /dev/null +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_serialization.go @@ -0,0 +1,245 @@ +package test_import + +import ( + "github.com/consideritdone/polywrap-go/polywrap/msgpack" +) + +type ArgsImportedMethod struct { + Str string + OptStr *string + U uint32 + OptU *uint32 + UArrayArray [][]*uint32 + Object TestImport_Object + OptObject *TestImport_Object + ObjectArray []TestImport_Object + OptObjectArray []*TestImport_Object + En TestImport_Enum + OptEnum *TestImport_Enum + EnumArray []TestImport_Enum + OptEnumArray []*TestImport_Enum +} + +func SerializeImportedMethodArgs(value *ArgsImportedMethod) []byte { + ctx := msgpack.NewContext("Serializing module-type: ImportedMethod") + encoder := msgpack.NewWriteEncoder(ctx) + WriteImportedMethodArgs(encoder, value) + return encoder.Buffer() +} + +func WriteImportedMethodArgs(writer msgpack.Write, value *ArgsImportedMethod) { + writer.WriteMapLength(13) + writer.Context().Push("str", "string", "writing property") + writer.WriteString("str") + { + v := value.Str + writer.WriteString(v) + } + writer.Context().Pop() + writer.Context().Push("optStr", "*string", "writing property") + writer.WriteString("optStr") + { + v := value.OptStr + if v == nil { + writer.WriteNil() + } else { + writer.WriteString(*v) + } + } + writer.Context().Pop() + writer.Context().Push("u", "uint32", "writing property") + writer.WriteString("u") + { + v := value.U + writer.WriteU32(v) + } + writer.Context().Pop() + writer.Context().Push("optU", "*uint32", "writing property") + writer.WriteString("optU") + { + v := value.OptU + if v == nil { + writer.WriteNil() + } else { + writer.WriteU32(*v) + } + } + writer.Context().Pop() + writer.Context().Push("uArrayArray", "[][]*uint32", "writing property") + writer.WriteString("uArrayArray") + if value.UArrayArray == nil { + writer.WriteNil() + } else if len(value.UArrayArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.UArrayArray { + if value.UArrayArray[i0] == nil { + writer.WriteNil() + } else if len(value.UArrayArray[i0]) == 0 { + writer.WriteNil() + } else { + for i1 := range value.UArrayArray[i0] { + { + v := value.UArrayArray[i0][i1] + if v == nil { + writer.WriteNil() + } else { + writer.WriteU32(*v) + } + } + } + } + } + } + writer.Context().Pop() + writer.Context().Push("object", "TestImport_Object", "writing property") + writer.WriteString("object") + { + v := value.Object + TestImport_ObjectWrite(writer, &v) + } + writer.Context().Pop() + writer.Context().Push("optObject", "*TestImport_Object", "writing property") + writer.WriteString("optObject") + { + v := value.OptObject + TestImport_ObjectWrite(writer, v) + } + writer.Context().Pop() + writer.Context().Push("objectArray", "[]TestImport_Object", "writing property") + writer.WriteString("objectArray") + if value.ObjectArray == nil { + writer.WriteNil() + } else if len(value.ObjectArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.ObjectArray { + { + v := value.ObjectArray[i0] + TestImport_ObjectWrite(writer, &v) + } + } + } + writer.Context().Pop() + writer.Context().Push("optObjectArray", "[]*TestImport_Object", "writing property") + writer.WriteString("optObjectArray") + if value.OptObjectArray == nil { + writer.WriteNil() + } else if len(value.OptObjectArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.OptObjectArray { + { + v := value.OptObjectArray[i0] + TestImport_ObjectWrite(writer, v) + } + } + } + writer.Context().Pop() + writer.Context().Push("en", "TestImport_Enum", "writing property") + writer.WriteString("en") + { + v := value.En + writer.WriteI32(int32(v)) + } + writer.Context().Pop() + writer.Context().Push("optEnum", "*TestImport_Enum", "writing property") + writer.WriteString("optEnum") + { + v := value.OptEnum + if v == nil { + writer.WriteNil() + } else { + writer.WriteI32(int32(*v)) + } + } + writer.Context().Pop() + writer.Context().Push("enumArray", "[]TestImport_Enum", "writing property") + writer.WriteString("enumArray") + if value.EnumArray == nil { + writer.WriteNil() + } else if len(value.EnumArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.EnumArray { + { + v := value.EnumArray[i0] + writer.WriteI32(int32(v)) + } + } + } + writer.Context().Pop() + writer.Context().Push("optEnumArray", "[]*TestImport_Enum", "writing property") + writer.WriteString("optEnumArray") + if value.OptEnumArray == nil { + writer.WriteNil() + } else if len(value.OptEnumArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.OptEnumArray { + { + v := value.OptEnumArray[i0] + if v == nil { + writer.WriteNil() + } else { + writer.WriteI32(int32(*v)) + } + } + } + } + writer.Context().Pop() +} + +func DeserializeImportedMethodResult(argsBuf []byte) *TestImport_Object { + ctx := msgpack.NewContext("Deserializing module-type: ImportedMethod") + reader := msgpack.NewReadDecoder(ctx, argsBuf) + + reader.Context().Push("importedMethod", "*TestImport_Object", "reading function output") + var value *TestImport_Object + if v := TestImport_ObjectRead(reader); v != nil { + value = v + } + reader.Context().Pop() + return value +} + +type ArgsAnotherMethod struct { + Arg []string +} + +func SerializeAnotherMethodArgs(value *ArgsAnotherMethod) []byte { + ctx := msgpack.NewContext("Serializing module-type: AnotherMethod") + encoder := msgpack.NewWriteEncoder(ctx) + WriteAnotherMethodArgs(encoder, value) + return encoder.Buffer() +} + +func WriteAnotherMethodArgs(writer msgpack.Write, value *ArgsAnotherMethod) { + writer.WriteMapLength(1) + writer.Context().Push("arg", "[]string", "writing property") + writer.WriteString("arg") + if value.Arg == nil { + writer.WriteNil() + } else if len(value.Arg) == 0 { + writer.WriteNil() + } else { + for i0 := range value.Arg { + { + v := value.Arg[i0] + writer.WriteString(v) + } + } + } + writer.Context().Pop() +} + +func DeserializeAnotherMethodResult(argsBuf []byte) int32 { + ctx := msgpack.NewContext("Deserializing module-type: AnotherMethod") + reader := msgpack.NewReadDecoder(ctx, argsBuf) + + reader.Context().Push("anotherMethod", "int32", "reading function output") + var value int32 + value = reader.ReadI32() + reader.Context().Pop() + return value +} diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_wrapped.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_wrapped.go new file mode 100644 index 0000000000..9b45b19f55 --- /dev/null +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_wrapped.go @@ -0,0 +1,24 @@ +package test_import + +import ( + "github.com/consideritdone/polywrap-go/polywrap" + "some/library/to/methods" +) + +func MethodImportedMethod(uri string, args *ArgsImportedMethod) (*TestImport_Object, error) { + argsBuf := SerializeImportedMethodArgs(args) + data, err := polywrap.WrapSubinvokeImplementation("testimport.uri.eth", uri, "importedMethod", argsBuf) + if err != nil { + return nil, err + } + return DeserializeImportedMethodResult(data), nil +} + +func MethodAnotherMethod(uri string, args *ArgsAnotherMethod) (int32, error) { + argsBuf := SerializeAnotherMethodArgs(args) + data, err := polywrap.WrapSubinvokeImplementation("testimport.uri.eth", uri, "anotherMethod", argsBuf) + if err != nil { + return nil, err + } + return DeserializeAnotherMethodResult(data), nil +} diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/interfaces/test_import.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/interfaces/test_import.go new file mode 100644 index 0000000000..c82ec76871 --- /dev/null +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/interfaces/test_import.go @@ -0,0 +1,7 @@ +package interfaces + +import "github.com/consideritdone/polywrap-go/polywrap" + +func TestImportImplementations() []string { + return polywrap.WrapGetImplementations("testimport.uri.eth") +} diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go index fa5dc8d666..5c9d9a022a 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go @@ -7,15 +7,15 @@ import ( //export _wrap_invoke func _wrap_invoke(methodSize, argsSize, envSize uint32) bool { - args := polywrap.WrapInvokeArgs(methodSize, argsSize) - - if args.Method == "moduleMethod" { + args := polywrap.WrapInvokeArgs(methodSize, argsSize) + switch args.method { + case "moduleMethod": return polywrap.WrapInvoke(args, envSize, module.ModuleMethodWrapped) - } else if args.Method == "objectMethod" { - return polywrap.WrapInvoke(args, envSize, module.ObjectMethodWrapped) - } else if args.Method == "optionalEnvMethod" { - return polywrap.WrapInvoke(args, envSize, module.OptionalEnvMethodWrapped) - } else { + case "objectMethod": + return polywrap.WrapInvoke(args, envSize, module.ObjectMethodWrapped) + case "optionalEnvMethod": + return polywrap.WrapInvoke(args, envSize, module.OptionalEnvMethodWrapped) + default: return polywrap.WrapInvoke(args, envSize, nil) } } diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/custom_type_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/custom_type_serialization.go deleted file mode 100644 index d986dab75f..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/custom_type_serialization.go +++ /dev/null @@ -1,1218 +0,0 @@ -package types - -import ( - "github.com/consideritdone/polywrap-go/polywrap/msgpack" - "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" - "github.com/valyala/fastjson" -) - -func serializeCustomType(value *CustomType) []byte { - ctx := msgpack.NewContext("Serializing (encoding) env-type: CustomType") - encoder := msgpack.NewWriteEncoder(ctx) - writeCustomType(encoder, value) - return encoder.Buffer() -} - -func writeCustomType(writer msgpack.Write, value *CustomType) { - writer.WriteMapLength(41) - writer.Context().Push("Str", "string", "writing property") - writer.WriteString("Str") - { - v := value.Str - writer.WriteString(v) - } - writer.Context().Pop() - writer.Context().Push("OptStr", "*string", "writing property") - writer.WriteString("OptStr") - { - v := value.OptStr - if v == nil { - writer.WriteNil() - } else { - writer.WriteString(*v) - } - } - writer.Context().Pop() - writer.Context().Push("U", "uint32", "writing property") - writer.WriteString("U") - { - v := value.U - writer.WriteU32(v) - } - writer.Context().Pop() - writer.Context().Push("OptU", "*uint32", "writing property") - writer.WriteString("OptU") - { - v := value.OptU - if v == nil { - writer.WriteNil() - } else { - writer.WriteU32(*v) - } - } - writer.Context().Pop() - writer.Context().Push("M_u8", "uint8", "writing property") - writer.WriteString("M_u8") - { - v := value.M_u8 - writer.WriteU8(v) - } - writer.Context().Pop() - writer.Context().Push("M_u16", "uint16", "writing property") - writer.WriteString("M_u16") - { - v := value.M_u16 - writer.WriteU16(v) - } - writer.Context().Pop() - writer.Context().Push("M_u32", "uint32", "writing property") - writer.WriteString("M_u32") - { - v := value.M_u32 - writer.WriteU32(v) - } - writer.Context().Pop() - writer.Context().Push("I", "int32", "writing property") - writer.WriteString("I") - { - v := value.I - writer.WriteI32(v) - } - writer.Context().Pop() - writer.Context().Push("M_i8", "int8", "writing property") - writer.WriteString("M_i8") - { - v := value.M_i8 - writer.WriteI8(v) - } - writer.Context().Pop() - writer.Context().Push("M_i16", "int16", "writing property") - writer.WriteString("M_i16") - { - v := value.M_i16 - writer.WriteI16(v) - } - writer.Context().Pop() - writer.Context().Push("M_i32", "int32", "writing property") - writer.WriteString("M_i32") - { - v := value.M_i32 - writer.WriteI32(v) - } - writer.Context().Pop() - writer.Context().Push("Bigint", "*big.Int", "writing property") - writer.WriteString("Bigint") - { - v := value.Bigint - writer.WriteBigInt(v) - } - writer.Context().Pop() - writer.Context().Push("OptBigint", "*big.Int", "writing property") - writer.WriteString("OptBigint") - { - v := value.OptBigint - if v == nil { - writer.WriteNil() - } else { - writer.WriteBigInt(v) - } - } - writer.Context().Pop() - writer.Context().Push("Bignumber", "*big.Int", "writing property") - writer.WriteString("Bignumber") - { - v := value.Bignumber - writer.WriteBigInt(v) - } - writer.Context().Pop() - writer.Context().Push("OptBignumber", "*big.Int", "writing property") - writer.WriteString("OptBignumber") - { - v := value.OptBignumber - if v == nil { - writer.WriteNil() - } else { - writer.WriteBigInt(v) - } - } - writer.Context().Pop() - writer.Context().Push("Json", "*fastjson.Value", "writing property") - writer.WriteString("Json") - { - v := value.Json - writer.WriteJson(v) - } - writer.Context().Pop() - writer.Context().Push("OptJson", "*fastjson.Value", "writing property") - writer.WriteString("OptJson") - { - v := value.OptJson - if v == nil { - writer.WriteNil() - } else { - writer.WriteJson(v) - } - } - writer.Context().Pop() - writer.Context().Push("Bytes", "[]byte", "writing property") - writer.WriteString("Bytes") - { - v := value.Bytes - writer.WriteBytes(v) - } - writer.Context().Pop() - writer.Context().Push("OptBytes", "[]byte", "writing property") - writer.WriteString("OptBytes") - { - v := value.OptBytes - if v == nil { - writer.WriteNil() - } else { - writer.WriteBytes(v) - } - } - writer.Context().Pop() - writer.Context().Push("M_boolean", "bool", "writing property") - writer.WriteString("M_boolean") - { - v := value.M_boolean - writer.WriteBool(v) - } - writer.Context().Pop() - writer.Context().Push("OptBoolean", "*bool", "writing property") - writer.WriteString("OptBoolean") - { - v := value.OptBoolean - if v == nil { - writer.WriteNil() - } else { - writer.WriteBool(*v) - } - } - writer.Context().Pop() - writer.Context().Push("UArray", "[]uint32", "writing property") - writer.WriteString("UArray") - if value.UArray == nil { - writer.WriteNil() - } else if len(value.UArray) == 0 { - writer.WriteNil() - } else { - for i0 := range value.UArray { - { - v := value.UArray[i0] - writer.WriteU32(v) - } - } - } - writer.Context().Pop() - writer.Context().Push("UOptArray", "[]uint32", "writing property") - writer.WriteString("UOptArray") - if value.UOptArray == nil { - writer.WriteNil() - } else if len(value.UOptArray) == 0 { - writer.WriteNil() - } else { - for i0 := range value.UOptArray { - { - v := value.UOptArray[i0] - writer.WriteU32(v) - } - } - } - writer.Context().Pop() - writer.Context().Push("OptUOptArray", "[]*uint32", "writing property") - writer.WriteString("OptUOptArray") - if value.OptUOptArray == nil { - writer.WriteNil() - } else if len(value.OptUOptArray) == 0 { - writer.WriteNil() - } else { - for i0 := range value.OptUOptArray { - { - v := value.OptUOptArray[i0] - if v == nil { - writer.WriteNil() - } else { - writer.WriteU32(*v) - } - } - } - } - writer.Context().Pop() - writer.Context().Push("OptStrOptArray", "[]*string", "writing property") - writer.WriteString("OptStrOptArray") - if value.OptStrOptArray == nil { - writer.WriteNil() - } else if len(value.OptStrOptArray) == 0 { - writer.WriteNil() - } else { - for i0 := range value.OptStrOptArray { - { - v := value.OptStrOptArray[i0] - if v == nil { - writer.WriteNil() - } else { - writer.WriteString(*v) - } - } - } - } - writer.Context().Pop() - writer.Context().Push("UArrayArray", "[][]uint32", "writing property") - writer.WriteString("UArrayArray") - if value.UArrayArray == nil { - writer.WriteNil() - } else if len(value.UArrayArray) == 0 { - writer.WriteNil() - } else { - for i0 := range value.UArrayArray { - if value.UArrayArray[i0] == nil { - writer.WriteNil() - } else if len(value.UArrayArray[i0]) == 0 { - writer.WriteNil() - } else { - for i1 := range value.UArrayArray[i0] { - { - v := value.UArrayArray[i0][i1] - writer.WriteU32(v) - } - } - } - } - } - writer.Context().Pop() - writer.Context().Push("UOptArrayOptArray", "[][]*uint32", "writing property") - writer.WriteString("UOptArrayOptArray") - if value.UOptArrayOptArray == nil { - writer.WriteNil() - } else if len(value.UOptArrayOptArray) == 0 { - writer.WriteNil() - } else { - for i0 := range value.UOptArrayOptArray { - if value.UOptArrayOptArray[i0] == nil { - writer.WriteNil() - } else if len(value.UOptArrayOptArray[i0]) == 0 { - writer.WriteNil() - } else { - for i1 := range value.UOptArrayOptArray[i0] { - { - v := value.UOptArrayOptArray[i0][i1] - if v == nil { - writer.WriteNil() - } else { - writer.WriteU32(*v) - } - } - } - } - } - } - writer.Context().Pop() - writer.Context().Push("UArrayOptArrayArray", "[][][]uint32", "writing property") - writer.WriteString("UArrayOptArrayArray") - if value.UArrayOptArrayArray == nil { - writer.WriteNil() - } else if len(value.UArrayOptArrayArray) == 0 { - writer.WriteNil() - } else { - for i0 := range value.UArrayOptArrayArray { - if value.UArrayOptArrayArray[i0] == nil { - writer.WriteNil() - } else if len(value.UArrayOptArrayArray[i0]) == 0 { - writer.WriteNil() - } else { - for i1 := range value.UArrayOptArrayArray[i0] { - if value.UArrayOptArrayArray[i0][i1] == nil { - writer.WriteNil() - } else if len(value.UArrayOptArrayArray[i0][i1]) == 0 { - writer.WriteNil() - } else { - for i2 := range value.UArrayOptArrayArray[i0][i1] { - { - v := value.UArrayOptArrayArray[i0][i1][i2] - writer.WriteU32(v) - } - } - } - } - } - } - } - writer.Context().Pop() - writer.Context().Push("CrazyArray", "[][][][]uint32", "writing property") - writer.WriteString("CrazyArray") - if value.CrazyArray == nil { - writer.WriteNil() - } else if len(value.CrazyArray) == 0 { - writer.WriteNil() - } else { - for i0 := range value.CrazyArray { - if value.CrazyArray[i0] == nil { - writer.WriteNil() - } else if len(value.CrazyArray[i0]) == 0 { - writer.WriteNil() - } else { - for i1 := range value.CrazyArray[i0] { - if value.CrazyArray[i0][i1] == nil { - writer.WriteNil() - } else if len(value.CrazyArray[i0][i1]) == 0 { - writer.WriteNil() - } else { - for i2 := range value.CrazyArray[i0][i1] { - if value.CrazyArray[i0][i1][i2] == nil { - writer.WriteNil() - } else if len(value.CrazyArray[i0][i1][i2]) == 0 { - writer.WriteNil() - } else { - for i3 := range value.CrazyArray[i0][i1][i2] { - { - v := value.CrazyArray[i0][i1][i2][i3] - writer.WriteU32(v) - } - } - } - } - } - } - } - } - } - writer.Context().Pop() - writer.Context().Push("Object", "AnotherType", "writing property") - writer.WriteString("Object") - - { - v := value.Object - AnotherTypeWrite(writer, &v) - } - writer.Context().Pop() - writer.Context().Push("OptObject", "*AnotherType", "writing property") - writer.WriteString("OptObject") - - { - v := value.OptObject - AnotherTypeWrite(writer, v) - } - writer.Context().Pop() - writer.Context().Push("ObjectArray", "[]AnotherType", "writing property") - writer.WriteString("ObjectArray") - if value.ObjectArray == nil { - writer.WriteNil() - } else if len(value.ObjectArray) == 0 { - writer.WriteNil() - } else { - for i0 := range value.ObjectArray { - - { - v := value.ObjectArray[i0] - AnotherTypeWrite(writer, &v) - } - } - } - writer.Context().Pop() - writer.Context().Push("OptObjectArray", "[]*AnotherType", "writing property") - writer.WriteString("OptObjectArray") - if value.OptObjectArray == nil { - writer.WriteNil() - } else if len(value.OptObjectArray) == 0 { - writer.WriteNil() - } else { - for i0 := range value.OptObjectArray { - - { - v := value.OptObjectArray[i0] - AnotherTypeWrite(writer, v) - } - } - } - writer.Context().Pop() - writer.Context().Push("En", "CustomEnum", "writing property") - writer.WriteString("En") - { - v := value.En - writer.WriteI32(int32(v)); - } - writer.Context().Pop() - writer.Context().Push("OptEnum", "*CustomEnum", "writing property") - writer.WriteString("OptEnum") - { - v := value.OptEnum - if v == nil { - writer.WriteNil() - } else { - writer.WriteI32(int32(*v)); - } - } - writer.Context().Pop() - writer.Context().Push("EnumArray", "[]CustomEnum", "writing property") - writer.WriteString("EnumArray") - if value.EnumArray == nil { - writer.WriteNil() - } else if len(value.EnumArray) == 0 { - writer.WriteNil() - } else { - for i0 := range value.EnumArray { - { - v := value.EnumArray[i0] - writer.WriteI32(int32(v)); - } - } - } - writer.Context().Pop() - writer.Context().Push("OptEnumArray", "[]*CustomEnum", "writing property") - writer.WriteString("OptEnumArray") - if value.OptEnumArray == nil { - writer.WriteNil() - } else if len(value.OptEnumArray) == 0 { - writer.WriteNil() - } else { - for i0 := range value.OptEnumArray { - { - v := value.OptEnumArray[i0] - if v == nil { - writer.WriteNil() - } else { - writer.WriteI32(int32(*v)); - } - } - } - } - writer.Context().Pop() - writer.Context().Push("Map", "map[string]int32", "writing property") - writer.WriteString("Map") - if value.Map == nil { - writer.WriteNil() - } else if len(value.Map) == 0 { - writer.WriteNil() - } else { - for i0 := range value.Map { - writer.WriteString(i0) - { - v := value.Map[i0] - writer.WriteI32(v) - } - } - } - writer.Context().Pop() - writer.Context().Push("MapOfArr", "map[string][]int32", "writing property") - writer.WriteString("MapOfArr") - if value.MapOfArr == nil { - writer.WriteNil() - } else if len(value.MapOfArr) == 0 { - writer.WriteNil() - } else { - for i0 := range value.MapOfArr { - writer.WriteString(i0) - if value.MapOfArr[i0] == nil { - writer.WriteNil() - } else if len(value.MapOfArr[i0]) == 0 { - writer.WriteNil() - } else { - for i1 := range value.MapOfArr[i0] { - { - v := value.MapOfArr[i0][i1] - writer.WriteI32(v) - } - } - } - } - } - writer.Context().Pop() - writer.Context().Push("MapOfObj", "map[string]AnotherType", "writing property") - writer.WriteString("MapOfObj") - if value.MapOfObj == nil { - writer.WriteNil() - } else if len(value.MapOfObj) == 0 { - writer.WriteNil() - } else { - for i0 := range value.MapOfObj { - writer.WriteString(i0) - - { - v := value.MapOfObj[i0] - AnotherTypeWrite(writer, &v) - } - } - } - writer.Context().Pop() - writer.Context().Push("MapOfArrOfObj", "map[string][]AnotherType", "writing property") - writer.WriteString("MapOfArrOfObj") - if value.MapOfArrOfObj == nil { - writer.WriteNil() - } else if len(value.MapOfArrOfObj) == 0 { - writer.WriteNil() - } else { - for i0 := range value.MapOfArrOfObj { - writer.WriteString(i0) - if value.MapOfArrOfObj[i0] == nil { - writer.WriteNil() - } else if len(value.MapOfArrOfObj[i0]) == 0 { - writer.WriteNil() - } else { - for i1 := range value.MapOfArrOfObj[i0] { - - { - v := value.MapOfArrOfObj[i0][i1] - AnotherTypeWrite(writer, &v) - } - } - } - } - } - writer.Context().Pop() -} - -func deserializeCustomType(data []byte) *CustomType { - ctx := msgpack.NewContext("Deserializing (decoding) env-type: CustomType") - reader := msgpack.NewReadDecoder(ctx, data) - return readCustomType(reader) -} - -func readCustomType(reader msgpack.Read) *CustomType { - var ( - _str string - _strSet bool - _optStr *string - _u uint32 - _uSet bool - _optU *uint32 - _u8 uint8 - _u8Set bool - _u16 uint16 - _u16Set bool - _u32 uint32 - _u32Set bool - _i int32 - _iSet bool - _i8 int8 - _i8Set bool - _i16 int16 - _i16Set bool - _i32 int32 - _i32Set bool - _bigint *big.Int - _bigintSet bool - _optBigint *big.Int - _bignumber *big.Int - _bignumberSet bool - _optBignumber *big.Int - _json *fastjson.Value - _jsonSet bool - _optJson *fastjson.Value - _bytes []byte - _bytesSet bool - _optBytes []byte - _boolean bool - _booleanSet bool - _optBoolean *bool - _uArray []uint32 - _uArraySet bool - _uOptArray []uint32 - _optUOptArray []*uint32 - _optStrOptArray []*string - _uArrayArray [][]uint32 - _uArrayArraySet bool - _uOptArrayOptArray [][]*uint32 - _uOptArrayOptArraySet bool - _uArrayOptArrayArray [][][]uint32 - _uArrayOptArrayArraySet bool - _crazyArray [][][][]uint32 - _object AnotherType - _objectSet bool - _optObject *AnotherType - _objectArray []AnotherType - _objectArraySet bool - _optObjectArray []*AnotherType - _en CustomEnum - _enSet bool - _optEnum *CustomEnum - _enumArray []CustomEnum - _enumArraySet bool - _optEnumArray []*CustomEnum - _map map[string]int32 - _mapSet bool - _mapOfArr map[string][]int32 - _mapOfArrSet bool - _mapOfObj map[string]AnotherType - _mapOfObjSet bool - _mapOfArrOfObj map[string][]AnotherType - _mapOfArrOfObjSet bool - ) - - for i := int32(reader.ReadMapLength()); i > 0; i-- { - field := reader.ReadString() - reader.Context().Push(field, "unknown", "searching for property type"); - switch field { - case "Str": - reader.Context().Push(field, "string", "type found, reading property") - _str = reader.ReadString() - _strSet = true; - reader.Context().Pop() - case "OptStr": - reader.Context().Push(field, "*string", "type found, reading property") - if !reader.IsNil() { - v := reader.ReadString(); - _optStr = &v - } - reader.Context().Pop() - case "U": - reader.Context().Push(field, "uint32", "type found, reading property") - _u = reader.ReadU32() - _uSet = true; - reader.Context().Pop() - case "OptU": - reader.Context().Push(field, "*uint32", "type found, reading property") - if !reader.IsNil() { - v := reader.ReadU32(); - _optU = &v - } - reader.Context().Pop() - case "M_u8": - reader.Context().Push(field, "uint8", "type found, reading property") - _u8 = reader.ReadU8() - _u8Set = true; - reader.Context().Pop() - case "M_u16": - reader.Context().Push(field, "uint16", "type found, reading property") - _u16 = reader.ReadU16() - _u16Set = true; - reader.Context().Pop() - case "M_u32": - reader.Context().Push(field, "uint32", "type found, reading property") - _u32 = reader.ReadU32() - _u32Set = true; - reader.Context().Pop() - case "I": - reader.Context().Push(field, "int32", "type found, reading property") - _i = reader.ReadI32() - _iSet = true; - reader.Context().Pop() - case "M_i8": - reader.Context().Push(field, "int8", "type found, reading property") - _i8 = reader.ReadI8() - _i8Set = true; - reader.Context().Pop() - case "M_i16": - reader.Context().Push(field, "int16", "type found, reading property") - _i16 = reader.ReadI16() - _i16Set = true; - reader.Context().Pop() - case "M_i32": - reader.Context().Push(field, "int32", "type found, reading property") - _i32 = reader.ReadI32() - _i32Set = true; - reader.Context().Pop() - case "Bigint": - reader.Context().Push(field, "*big.Int", "type found, reading property") - _bigint = reader.ReadBigInt() - _bigintSet = true; - reader.Context().Pop() - case "OptBigint": - reader.Context().Push(field, "*big.Int", "type found, reading property") - if !reader.IsNil() { - v := reader.ReadBigInt(); - _optBigint = v - } - reader.Context().Pop() - case "Bignumber": - reader.Context().Push(field, "*big.Int", "type found, reading property") - _bignumber = reader.ReadBigInt() - _bignumberSet = true; - reader.Context().Pop() - case "OptBignumber": - reader.Context().Push(field, "*big.Int", "type found, reading property") - if !reader.IsNil() { - v := reader.ReadBigInt(); - _optBignumber = v - } - reader.Context().Pop() - case "Json": - reader.Context().Push(field, "*fastjson.Value", "type found, reading property") - _json = reader.ReadJson() - _jsonSet = true; - reader.Context().Pop() - case "OptJson": - reader.Context().Push(field, "*fastjson.Value", "type found, reading property") - if !reader.IsNil() { - v := reader.ReadJson(); - _optJson = v - } - reader.Context().Pop() - case "Bytes": - reader.Context().Push(field, "[]byte", "type found, reading property") - _bytes = reader.ReadBytes() - _bytesSet = true; - reader.Context().Pop() - case "OptBytes": - reader.Context().Push(field, "[]byte", "type found, reading property") - if !reader.IsNil() { - v := reader.ReadBytes(); - _optBytes = v - } - reader.Context().Pop() - case "M_boolean": - reader.Context().Push(field, "bool", "type found, reading property") - _boolean = reader.ReadBool() - _booleanSet = true; - reader.Context().Pop() - case "OptBoolean": - reader.Context().Push(field, "*bool", "type found, reading property") - if !reader.IsNil() { - v := reader.ReadBool(); - _optBoolean = &v - } - reader.Context().Pop() - case "UArray": - reader.Context().Push(field, "[]uint32", "type found, reading property") - if reader.IsNil() { - _uArray = nil - } else { - ln0 := reader.ReadArrayLength() - _uArray = make([]uint32, ln0) - for i0 := uint32(0); i0 < ln0; i0++ { - _uArray[i0] = reader.ReadU32() - } - } - _uArraySet = true; - reader.Context().Pop() - case "UOptArray": - reader.Context().Push(field, "[]uint32", "type found, reading property") - if reader.IsNil() { - _uOptArray = nil - } else { - ln0 := reader.ReadArrayLength() - _uOptArray = make([]uint32, ln0) - for i0 := uint32(0); i0 < ln0; i0++ { - _uOptArray[i0] = reader.ReadU32() - } - } - reader.Context().Pop() - case "OptUOptArray": - reader.Context().Push(field, "[]*uint32", "type found, reading property") - if reader.IsNil() { - _optUOptArray = nil - } else { - ln0 := reader.ReadArrayLength() - _optUOptArray = make([]*uint32, ln0) - for i0 := uint32(0); i0 < ln0; i0++ { - if !reader.IsNil() { - v := reader.ReadU32(); - _optUOptArray[i0] = &v - } - } - } - reader.Context().Pop() - case "OptStrOptArray": - reader.Context().Push(field, "[]*string", "type found, reading property") - if reader.IsNil() { - _optStrOptArray = nil - } else { - ln0 := reader.ReadArrayLength() - _optStrOptArray = make([]*string, ln0) - for i0 := uint32(0); i0 < ln0; i0++ { - if !reader.IsNil() { - v := reader.ReadString(); - _optStrOptArray[i0] = &v - } - } - } - reader.Context().Pop() - case "UArrayArray": - reader.Context().Push(field, "[][]uint32", "type found, reading property") - if reader.IsNil() { - _uArrayArray = nil - } else { - ln0 := reader.ReadArrayLength() - _uArrayArray = make([][]uint32, ln0) - for i0 := uint32(0); i0 < ln0; i0++ { - if reader.IsNil() { - _uArrayArray[i0] = nil - } else { - ln1 := reader.ReadArrayLength() - _uArrayArray[i0] = make([]uint32, ln1) - for i1 := uint32(0); i1 < ln1; i1++ { - _uArrayArray[i0][i1] = reader.ReadU32() - } - } - } - } - _uArrayArraySet = true; - reader.Context().Pop() - case "UOptArrayOptArray": - reader.Context().Push(field, "[][]*uint32", "type found, reading property") - if reader.IsNil() { - _uOptArrayOptArray = nil - } else { - ln0 := reader.ReadArrayLength() - _uOptArrayOptArray = make([][]*uint32, ln0) - for i0 := uint32(0); i0 < ln0; i0++ { - if reader.IsNil() { - _uOptArrayOptArray[i0] = nil - } else { - ln1 := reader.ReadArrayLength() - _uOptArrayOptArray[i0] = make([]*uint32, ln1) - for i1 := uint32(0); i1 < ln1; i1++ { - if !reader.IsNil() { - v := reader.ReadU32(); - _uOptArrayOptArray[i0][i1] = &v - } - } - } - } - } - _uOptArrayOptArraySet = true; - reader.Context().Pop() - case "UArrayOptArrayArray": - reader.Context().Push(field, "[][][]uint32", "type found, reading property") - if reader.IsNil() { - _uArrayOptArrayArray = nil - } else { - ln0 := reader.ReadArrayLength() - _uArrayOptArrayArray = make([][][]uint32, ln0) - for i0 := uint32(0); i0 < ln0; i0++ { - if reader.IsNil() { - _uArrayOptArrayArray[i0] = nil - } else { - ln1 := reader.ReadArrayLength() - _uArrayOptArrayArray[i0] = make([][]uint32, ln1) - for i1 := uint32(0); i1 < ln1; i1++ { - if reader.IsNil() { - _uArrayOptArrayArray[i0][i1] = nil - } else { - ln2 := reader.ReadArrayLength() - _uArrayOptArrayArray[i0][i1] = make([]uint32, ln2) - for i2 := uint32(0); i2 < ln2; i2++ { - _uArrayOptArrayArray[i0][i1][i2] = reader.ReadU32() - } - } - } - } - } - } - _uArrayOptArrayArraySet = true; - reader.Context().Pop() - case "CrazyArray": - reader.Context().Push(field, "[][][][]uint32", "type found, reading property") - if reader.IsNil() { - _crazyArray = nil - } else { - ln0 := reader.ReadArrayLength() - _crazyArray = make([][][][]uint32, ln0) - for i0 := uint32(0); i0 < ln0; i0++ { - if reader.IsNil() { - _crazyArray[i0] = nil - } else { - ln1 := reader.ReadArrayLength() - _crazyArray[i0] = make([][][]uint32, ln1) - for i1 := uint32(0); i1 < ln1; i1++ { - if reader.IsNil() { - _crazyArray[i0][i1] = nil - } else { - ln2 := reader.ReadArrayLength() - _crazyArray[i0][i1] = make([][]uint32, ln2) - for i2 := uint32(0); i2 < ln2; i2++ { - if reader.IsNil() { - _crazyArray[i0][i1][i2] = nil - } else { - ln3 := reader.ReadArrayLength() - _crazyArray[i0][i1][i2] = make([]uint32, ln3) - for i3 := uint32(0); i3 < ln3; i3++ { - _crazyArray[i0][i1][i2][i3] = reader.ReadU32() - } - } - } - } - } - } - } - } - reader.Context().Pop() - case "Object": - reader.Context().Push(field, "AnotherType", "type found, reading property") - if v := AnotherTypeRead(reader); v != nil { - _object = *v - } - _objectSet = true; - reader.Context().Pop() - case "OptObject": - reader.Context().Push(field, "*AnotherType", "type found, reading property") - if v := AnotherTypeRead(reader); v != nil { - _optObject = v - } - reader.Context().Pop() - case "ObjectArray": - reader.Context().Push(field, "[]AnotherType", "type found, reading property") - if reader.IsNil() { - _objectArray = nil - } else { - ln0 := reader.ReadArrayLength() - _objectArray = make([]AnotherType, ln0) - for i0 := uint32(0); i0 < ln0; i0++ { - if v := AnotherTypeRead(reader); v != nil { - _objectArray[i0] = *v - } - } - } - _objectArraySet = true; - reader.Context().Pop() - case "OptObjectArray": - reader.Context().Push(field, "[]*AnotherType", "type found, reading property") - if reader.IsNil() { - _optObjectArray = nil - } else { - ln0 := reader.ReadArrayLength() - _optObjectArray = make([]*AnotherType, ln0) - for i0 := uint32(0); i0 < ln0; i0++ { - if v := AnotherTypeRead(reader); v != nil { - _optObjectArray[i0] = v - } - } - } - reader.Context().Pop() - case "En": - reader.Context().Push(field, "CustomEnum", "type found, reading property") - _en = CustomEnum(reader.ReadI32()) - SanitizeCustomEnumValue(int32(_en)) - _enSet = true; - reader.Context().Pop() - case "OptEnum": - reader.Context().Push(field, "*CustomEnum", "type found, reading property") - if !reader.IsNil() { - v := CustomEnum(reader.ReadI32()) - SanitizeCustomEnumValue(int32(v)) - _optEnum = &v - } - reader.Context().Pop() - case "EnumArray": - reader.Context().Push(field, "[]CustomEnum", "type found, reading property") - if reader.IsNil() { - _enumArray = nil - } else { - ln0 := reader.ReadArrayLength() - _enumArray = make([]CustomEnum, ln0) - for i0 := uint32(0); i0 < ln0; i0++ { - _enumArray[i0] = CustomEnum(reader.ReadI32()) - SanitizeCustomEnumValue(int32(_enumArray[i0])) - } - } - _enumArraySet = true; - reader.Context().Pop() - case "OptEnumArray": - reader.Context().Push(field, "[]*CustomEnum", "type found, reading property") - if reader.IsNil() { - _optEnumArray = nil - } else { - ln0 := reader.ReadArrayLength() - _optEnumArray = make([]*CustomEnum, ln0) - for i0 := uint32(0); i0 < ln0; i0++ { - if !reader.IsNil() { - v := CustomEnum(reader.ReadI32()) - SanitizeCustomEnumValue(int32(v)) - _optEnumArray[i0] = &v - } - } - } - reader.Context().Pop() - case "Map": - reader.Context().Push(field, "map[string]int32", "type found, reading property") - if reader.IsNil() { - _map = nil - } else { - ln0 := reader.ReadMapLength() - _map = make(map[string]int32) - for j0 := uint32(0); j0 < ln0; j0++ { - i0 := reader.ReadString() - _map[i0] = reader.ReadI32() - } - } - _mapSet = true; - reader.Context().Pop() - case "MapOfArr": - reader.Context().Push(field, "map[string][]int32", "type found, reading property") - if reader.IsNil() { - _mapOfArr = nil - } else { - ln0 := reader.ReadMapLength() - _mapOfArr = make(map[string][]int32) - for j0 := uint32(0); j0 < ln0; j0++ { - i0 := reader.ReadString() - if reader.IsNil() { - _mapOfArr[i0] = nil - } else { - ln1 := reader.ReadArrayLength() - _mapOfArr[i0] = make([]int32, ln1) - for i1 := uint32(0); i1 < ln1; i1++ { - _mapOfArr[i0][i1] = reader.ReadI32() - } - } - } - } - _mapOfArrSet = true; - reader.Context().Pop() - case "MapOfObj": - reader.Context().Push(field, "map[string]AnotherType", "type found, reading property") - if reader.IsNil() { - _mapOfObj = nil - } else { - ln0 := reader.ReadMapLength() - _mapOfObj = make(map[string]AnotherType) - for j0 := uint32(0); j0 < ln0; j0++ { - i0 := reader.ReadString() - if v := AnotherTypeRead(reader); v != nil { - _mapOfObj[i0] = *v - } - } - } - _mapOfObjSet = true; - reader.Context().Pop() - case "MapOfArrOfObj": - reader.Context().Push(field, "map[string][]AnotherType", "type found, reading property") - if reader.IsNil() { - _mapOfArrOfObj = nil - } else { - ln0 := reader.ReadMapLength() - _mapOfArrOfObj = make(map[string][]AnotherType) - for j0 := uint32(0); j0 < ln0; j0++ { - i0 := reader.ReadString() - if reader.IsNil() { - _mapOfArrOfObj[i0] = nil - } else { - ln1 := reader.ReadArrayLength() - _mapOfArrOfObj[i0] = make([]AnotherType, ln1) - for i1 := uint32(0); i1 < ln1; i1++ { - if v := AnotherTypeRead(reader); v != nil { - _mapOfArrOfObj[i0][i1] = *v - } - } - } - } - } - _mapOfArrOfObjSet = true; - reader.Context().Pop() - } - reader.Context().Pop() - } - - if (!_strSet) { - panic(reader.Context().PrintWithContext("Missing required property: 'str: String'")) - } - if (!_uSet) { - panic(reader.Context().PrintWithContext("Missing required property: 'u: UInt'")) - } - if (!_u8Set) { - panic(reader.Context().PrintWithContext("Missing required property: 'u8: UInt8'")) - } - if (!_u16Set) { - panic(reader.Context().PrintWithContext("Missing required property: 'u16: UInt16'")) - } - if (!_u32Set) { - panic(reader.Context().PrintWithContext("Missing required property: 'u32: UInt32'")) - } - if (!_iSet) { - panic(reader.Context().PrintWithContext("Missing required property: 'i: Int'")) - } - if (!_i8Set) { - panic(reader.Context().PrintWithContext("Missing required property: 'i8: Int8'")) - } - if (!_i16Set) { - panic(reader.Context().PrintWithContext("Missing required property: 'i16: Int16'")) - } - if (!_i32Set) { - panic(reader.Context().PrintWithContext("Missing required property: 'i32: Int32'")) - } - if (!_bigintSet) { - panic(reader.Context().PrintWithContext("Missing required property: 'bigint: BigInt'")) - } - if (!_bignumberSet) { - panic(reader.Context().PrintWithContext("Missing required property: 'bignumber: BigNumber'")) - } - if (!_jsonSet) { - panic(reader.Context().PrintWithContext("Missing required property: 'json: JSON'")) - } - if (!_bytesSet) { - panic(reader.Context().PrintWithContext("Missing required property: 'bytes: Bytes'")) - } - if (!_booleanSet) { - panic(reader.Context().PrintWithContext("Missing required property: 'boolean: Boolean'")) - } - if (!_uArraySet) { - panic(reader.Context().PrintWithContext("Missing required property: 'uArray: [UInt]'")) - } - if (!_uArrayArraySet) { - panic(reader.Context().PrintWithContext("Missing required property: 'uArrayArray: [[UInt]]'")) - } - if (!_uOptArrayOptArraySet) { - panic(reader.Context().PrintWithContext("Missing required property: 'uOptArrayOptArray: [[UInt32]]'")) - } - if (!_uArrayOptArrayArraySet) { - panic(reader.Context().PrintWithContext("Missing required property: 'uArrayOptArrayArray: [[[UInt32]]]'")) - } - if (!_objectSet) { - panic(reader.Context().PrintWithContext("Missing required property: 'object: AnotherType'")) - } - if (!_objectArraySet) { - panic(reader.Context().PrintWithContext("Missing required property: 'objectArray: [AnotherType]'")) - } - if (!_enSet) { - panic(reader.Context().PrintWithContext("Missing required property: 'en: CustomEnum'")) - } - if (!_enumArraySet) { - panic(reader.Context().PrintWithContext("Missing required property: 'enumArray: [CustomEnum]'")) - } - if (!_mapSet) { - panic(reader.Context().PrintWithContext("Missing required property: 'map: Map'")) - } - if (!_mapOfArrSet) { - panic(reader.Context().PrintWithContext("Missing required property: 'mapOfArr: Map'")) - } - if (!_mapOfObjSet) { - panic(reader.Context().PrintWithContext("Missing required property: 'mapOfObj: Map'")) - } - if (!_mapOfArrOfObjSet) { - panic(reader.Context().PrintWithContext("Missing required property: 'mapOfArrOfObj: Map'")) - } - - return &CustomType{ - Str: _str, - OptStr: _optStr, - U: _u, - OptU: _optU, - M_u8: _u8, - M_u16: _u16, - M_u32: _u32, - I: _i, - M_i8: _i8, - M_i16: _i16, - M_i32: _i32, - Bigint: _bigint, - OptBigint: _optBigint, - Bignumber: _bignumber, - OptBignumber: _optBignumber, - Json: _json, - OptJson: _optJson, - Bytes: _bytes, - OptBytes: _optBytes, - M_boolean: _boolean, - OptBoolean: _optBoolean, - UArray: _uArray, - UOptArray: _uOptArray, - OptUOptArray: _optUOptArray, - OptStrOptArray: _optStrOptArray, - UArrayArray: _uArrayArray, - UOptArrayOptArray: _uOptArrayOptArray, - UArrayOptArrayArray: _uArrayOptArrayArray, - CrazyArray: _crazyArray, - Object: _object, - OptObject: _optObject, - ObjectArray: _objectArray, - OptObjectArray: _optObjectArray, - En: _en, - OptEnum: _optEnum, - EnumArray: _enumArray, - OptEnumArray: _optEnumArray, - Map: _map, - MapOfArr: _mapOfArr, - MapOfObj: _mapOfObj, - MapOfArrOfObj: _mapOfArrOfObj, - } -} \ No newline at end of file diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/custom_enum.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/enum_custom_enum.go similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-go/types/custom_enum.go rename to packages/test-cases/cases/bind/sanity/output/wasm-go/types/enum_custom_enum.go diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_serialization.go new file mode 100644 index 0000000000..8bbc6a75a0 --- /dev/null +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_serialization.go @@ -0,0 +1,436 @@ +package types + +import ( + "github.com/consideritdone/polywrap-go/polywrap/msgpack" +) + +type ArgsModuleMethod struct { + Str string + OptStr *string + En CustomEnum + OptEnum *CustomEnum + EnumArray []CustomEnum + OptEnumArray []*CustomEnum + Map map[string]int32 + MapOfArr map[string][]int32 + MapOfObj map[string]AnotherType + MapOfArrOfObj map[string][]AnotherType +} + +func DeserializeModuleMethodArgs(argsBuf []byte) *ArgsModuleMethod { + ctx := msgpack.NewContext("Deserializing module-type: ModuleMethod") + reader := msgpack.NewReadDecoder(ctx, argsBuf) + + var ( + _str string + _strSet bool + _optStr *string + _en CustomEnum + _enSet bool + _optEnum *CustomEnum + _enumArray []CustomEnum + _enumArraySet bool + _optEnumArray []*CustomEnum + _map map[string]int32 + _mapSet bool + _mapOfArr map[string][]int32 + _mapOfArrSet bool + _mapOfObj map[string]AnotherType + _mapOfObjSet bool + _mapOfArrOfObj map[string][]AnotherType + _mapOfArrOfObjSet bool + ) + + for i := int32(reader.ReadMapLength()); i > 0; i-- { + field := reader.ReadString() + reader.Context().Push(field, "unknown", "searching for property type") + reader.Context().Pop() + switch field { + case "Str": + reader.Context().Push(field, "string", "type found, reading property") + _str = reader.ReadString() + _strSet = true + reader.Context().Pop() + case "OptStr": + reader.Context().Push(field, "*string", "type found, reading property") + if !reader.IsNil() { + v := reader.ReadString() + _optStr = &v + } + reader.Context().Pop() + case "En": + reader.Context().Push(field, "CustomEnum", "type found, reading property") + _en = CustomEnum(reader.ReadI32()) + SanitizeCustomEnumValue(int32(_en)) + _enSet = true + reader.Context().Pop() + case "OptEnum": + reader.Context().Push(field, "*CustomEnum", "type found, reading property") + if !reader.IsNil() { + v := CustomEnum(reader.ReadI32()) + SanitizeCustomEnumValue(int32(v)) + _optEnum = &v + } + reader.Context().Pop() + case "EnumArray": + reader.Context().Push(field, "[]CustomEnum", "type found, reading property") + if reader.IsNil() { + _enumArray = nil + } else { + ln0 := reader.ReadArrayLength() + _enumArray = make([]CustomEnum, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + _enumArray[i0] = CustomEnum(reader.ReadI32()) + SanitizeCustomEnumValue(int32(_enumArray[i0])) + } + } + _enumArraySet = true + reader.Context().Pop() + case "OptEnumArray": + reader.Context().Push(field, "[]*CustomEnum", "type found, reading property") + if reader.IsNil() { + _optEnumArray = nil + } else { + ln0 := reader.ReadArrayLength() + _optEnumArray = make([]*CustomEnum, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + if !reader.IsNil() { + v := CustomEnum(reader.ReadI32()) + SanitizeCustomEnumValue(int32(v)) + _optEnumArray[i0] = &v + } + } + } + reader.Context().Pop() + case "Map": + reader.Context().Push(field, "map[string]int32", "type found, reading property") + if reader.IsNil() { + _map = nil + } else { + ln0 := reader.ReadMapLength() + _map = make(map[string]int32) + for j0 := uint32(0); j0 < ln0; j0++ { + i0 := reader.ReadString() + _map[i0] = reader.ReadI32() + } + } + _mapSet = true + reader.Context().Pop() + case "MapOfArr": + reader.Context().Push(field, "map[string][]int32", "type found, reading property") + if reader.IsNil() { + _mapOfArr = nil + } else { + ln0 := reader.ReadMapLength() + _mapOfArr = make(map[string][]int32) + for j0 := uint32(0); j0 < ln0; j0++ { + i0 := reader.ReadString() + if reader.IsNil() { + _mapOfArr[i0] = nil + } else { + ln1 := reader.ReadArrayLength() + _mapOfArr[i0] = make([]int32, ln1) + for i1 := uint32(0); i1 < ln1; i1++ { + _mapOfArr[i0][i1] = reader.ReadI32() + } + } + } + } + _mapOfArrSet = true + reader.Context().Pop() + case "MapOfObj": + reader.Context().Push(field, "map[string]AnotherType", "type found, reading property") + if reader.IsNil() { + _mapOfObj = nil + } else { + ln0 := reader.ReadMapLength() + _mapOfObj = make(map[string]AnotherType) + for j0 := uint32(0); j0 < ln0; j0++ { + i0 := reader.ReadString() + if v := AnotherTypeRead(reader); v != nil { + _mapOfObj[i0] = *v + } + } + } + _mapOfObjSet = true + reader.Context().Pop() + case "MapOfArrOfObj": + reader.Context().Push(field, "map[string][]AnotherType", "type found, reading property") + if reader.IsNil() { + _mapOfArrOfObj = nil + } else { + ln0 := reader.ReadMapLength() + _mapOfArrOfObj = make(map[string][]AnotherType) + for j0 := uint32(0); j0 < ln0; j0++ { + i0 := reader.ReadString() + if reader.IsNil() { + _mapOfArrOfObj[i0] = nil + } else { + ln1 := reader.ReadArrayLength() + _mapOfArrOfObj[i0] = make([]AnotherType, ln1) + for i1 := uint32(0); i1 < ln1; i1++ { + if v := AnotherTypeRead(reader); v != nil { + _mapOfArrOfObj[i0][i1] = *v + } + } + } + } + } + _mapOfArrOfObjSet = true + reader.Context().Pop() + } + } + + if !_strSet { + panic(reader.Context().PrintWithContext("Missing required property: 'str: String'")) + } + if !_enSet { + panic(reader.Context().PrintWithContext("Missing required property: 'en: CustomEnum'")) + } + if !_enumArraySet { + panic(reader.Context().PrintWithContext("Missing required property: 'enumArray: [CustomEnum]'")) + } + if !_mapSet { + panic(reader.Context().PrintWithContext("Missing required property: 'map: Map'")) + } + if !_mapOfArrSet { + panic(reader.Context().PrintWithContext("Missing required property: 'mapOfArr: Map'")) + } + if !_mapOfObjSet { + panic(reader.Context().PrintWithContext("Missing required property: 'mapOfObj: Map'")) + } + if !_mapOfArrOfObjSet { + panic(reader.Context().PrintWithContext("Missing required property: 'mapOfArrOfObj: Map'")) + } + + return &ArgsModuleMethod{ + Str: _str, + OptStr: _optStr, + En: _en, + OptEnum: _optEnum, + EnumArray: _enumArray, + OptEnumArray: _optEnumArray, + Map: _map, + MapOfArr: _mapOfArr, + MapOfObj: _mapOfObj, + MapOfArrOfObj: _mapOfArrOfObj, + } +} + +func SerializeModuleMethodResult(value int32) []byte { + ctx := msgpack.NewContext("Serializing module-type: ModuleMethod") + encoder := msgpack.NewWriteEncoder(ctx) + WriteModuleMethodResult(encoder, value); + return encoder.Buffer() +} + +func WriteModuleMethodResult(writer msgpack.Write, value int32) { + writer.Context().Push("moduleMethod", "int32", "writing property") + { + v := value + writer.WriteI32(v) + } + writer.Context().Pop() +} + +type ArgsObjectMethod struct { + Object AnotherType + OptObject *AnotherType + ObjectArray []AnotherType + OptObjectArray []*AnotherType +} + +func DeserializeObjectMethodArgs(argsBuf []byte) *ArgsObjectMethod { + ctx := msgpack.NewContext("Deserializing module-type: ObjectMethod") + reader := msgpack.NewReadDecoder(ctx, argsBuf) + + var ( + _object AnotherType + _objectSet bool + _optObject *AnotherType + _objectArray []AnotherType + _objectArraySet bool + _optObjectArray []*AnotherType + ) + + for i := int32(reader.ReadMapLength()); i > 0; i-- { + field := reader.ReadString() + reader.Context().Push(field, "unknown", "searching for property type") + reader.Context().Pop() + switch field { + case "Object": + reader.Context().Push(field, "AnotherType", "type found, reading property") + if v := AnotherTypeRead(reader); v != nil { + _object = *v + } + _objectSet = true + reader.Context().Pop() + case "OptObject": + reader.Context().Push(field, "*AnotherType", "type found, reading property") + if v := AnotherTypeRead(reader); v != nil { + _optObject = v + } + reader.Context().Pop() + case "ObjectArray": + reader.Context().Push(field, "[]AnotherType", "type found, reading property") + if reader.IsNil() { + _objectArray = nil + } else { + ln0 := reader.ReadArrayLength() + _objectArray = make([]AnotherType, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + if v := AnotherTypeRead(reader); v != nil { + _objectArray[i0] = *v + } + } + } + _objectArraySet = true + reader.Context().Pop() + case "OptObjectArray": + reader.Context().Push(field, "[]*AnotherType", "type found, reading property") + if reader.IsNil() { + _optObjectArray = nil + } else { + ln0 := reader.ReadArrayLength() + _optObjectArray = make([]*AnotherType, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + if v := AnotherTypeRead(reader); v != nil { + _optObjectArray[i0] = v + } + } + } + reader.Context().Pop() + } + } + + if !_objectSet { + panic(reader.Context().PrintWithContext("Missing required property: 'object: AnotherType'")) + } + if !_objectArraySet { + panic(reader.Context().PrintWithContext("Missing required property: 'objectArray: [AnotherType]'")) + } + + return &ArgsObjectMethod{ + Object: _object, + OptObject: _optObject, + ObjectArray: _objectArray, + OptObjectArray: _optObjectArray, + } +} + +func SerializeObjectMethodResult(value *AnotherType) []byte { + ctx := msgpack.NewContext("Serializing module-type: ObjectMethod") + encoder := msgpack.NewWriteEncoder(ctx) + WriteObjectMethodResult(encoder, value); + return encoder.Buffer() +} + +func WriteObjectMethodResult(writer msgpack.Write, value *AnotherType) { + writer.Context().Push("objectMethod", "*AnotherType", "writing property") + { + v := value + AnotherTypeWrite(writer, v) + } + writer.Context().Pop() +} + +type ArgsOptionalEnvMethod struct { + Object AnotherType + OptObject *AnotherType + ObjectArray []AnotherType + OptObjectArray []*AnotherType +} + +func DeserializeOptionalEnvMethodArgs(argsBuf []byte) *ArgsOptionalEnvMethod { + ctx := msgpack.NewContext("Deserializing module-type: OptionalEnvMethod") + reader := msgpack.NewReadDecoder(ctx, argsBuf) + + var ( + _object AnotherType + _objectSet bool + _optObject *AnotherType + _objectArray []AnotherType + _objectArraySet bool + _optObjectArray []*AnotherType + ) + + for i := int32(reader.ReadMapLength()); i > 0; i-- { + field := reader.ReadString() + reader.Context().Push(field, "unknown", "searching for property type") + reader.Context().Pop() + switch field { + case "Object": + reader.Context().Push(field, "AnotherType", "type found, reading property") + if v := AnotherTypeRead(reader); v != nil { + _object = *v + } + _objectSet = true + reader.Context().Pop() + case "OptObject": + reader.Context().Push(field, "*AnotherType", "type found, reading property") + if v := AnotherTypeRead(reader); v != nil { + _optObject = v + } + reader.Context().Pop() + case "ObjectArray": + reader.Context().Push(field, "[]AnotherType", "type found, reading property") + if reader.IsNil() { + _objectArray = nil + } else { + ln0 := reader.ReadArrayLength() + _objectArray = make([]AnotherType, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + if v := AnotherTypeRead(reader); v != nil { + _objectArray[i0] = *v + } + } + } + _objectArraySet = true + reader.Context().Pop() + case "OptObjectArray": + reader.Context().Push(field, "[]*AnotherType", "type found, reading property") + if reader.IsNil() { + _optObjectArray = nil + } else { + ln0 := reader.ReadArrayLength() + _optObjectArray = make([]*AnotherType, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + if v := AnotherTypeRead(reader); v != nil { + _optObjectArray[i0] = v + } + } + } + reader.Context().Pop() + } + } + + if !_objectSet { + panic(reader.Context().PrintWithContext("Missing required property: 'object: AnotherType'")) + } + if !_objectArraySet { + panic(reader.Context().PrintWithContext("Missing required property: 'objectArray: [AnotherType]'")) + } + + return &ArgsOptionalEnvMethod{ + Object: _object, + OptObject: _optObject, + ObjectArray: _objectArray, + OptObjectArray: _optObjectArray, + } +} + +func SerializeOptionalEnvMethodResult(value *AnotherType) []byte { + ctx := msgpack.NewContext("Serializing module-type: OptionalEnvMethod") + encoder := msgpack.NewWriteEncoder(ctx) + WriteOptionalEnvMethodResult(encoder, value); + return encoder.Buffer() +} + +func WriteOptionalEnvMethodResult(writer msgpack.Write, value *AnotherType) { + writer.Context().Push("optionalEnvMethod", "*AnotherType", "writing property") + { + v := value + AnotherTypeWrite(writer, v) + } + writer.Context().Pop() +} diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_wrapped.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_wrapped.go new file mode 100644 index 0000000000..8b77f7a4a8 --- /dev/null +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_wrapped.go @@ -0,0 +1,45 @@ +package types + +import ( + "github.com/consideritdone/polywrap-go/polywrap" + "some/library/to/methods" +) + +func ModuleMethodWrapped(argsBuf []byte, envSize uint32) []byte { + var env *Env + + args := DeserializeModuleMethodArgs(argsBuf) + + result := methods.ModuleMethod(args) + return SerializeModuleMethodResult(result) +} + +func ObjectMethodWrapped(argsBuf []byte, envSize uint32) []byte { + var env *Env + if envSize == 0 { + panic("Environment is not set, and it is required by method 'objectMethod'") + } + if envSize > 0 { + envBuf := polywrap.WrapLoadEnv(envSize) + env = EnvFromBuffer(envBuf) + } + + args := DeserializeObjectMethodArgs(argsBuf) + + result := methods.ObjectMethod(args, env) + return SerializeObjectMethodResult(result) +} + +func OptionalEnvMethodWrapped(argsBuf []byte, envSize uint32) []byte { + var env *Env + if envSize > 0 { + envBuf := polywrap.WrapLoadEnv(envSize) + env = EnvFromBuffer(envBuf) + } + + args := DeserializeOptionalEnvMethodArgs(argsBuf) + + result := methods.OptionalEnvMethod(args, env) + return SerializeOptionalEnvMethodResult(result) +} + diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/another_type.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_another_type.go similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-go/types/another_type.go rename to packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_another_type.go diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/another_type_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_another_type_serialization.go similarity index 99% rename from packages/test-cases/cases/bind/sanity/output/wasm-go/types/another_type_serialization.go rename to packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_another_type_serialization.go index 682e6bde21..3bb5d8f434 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/another_type_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_another_type_serialization.go @@ -26,7 +26,6 @@ func writeAnotherType(writer msgpack.Write, value *AnotherType) { writer.Context().Pop() writer.Context().Push("Circular", "*CustomType", "writing property") writer.WriteString("Circular") - { v := value.Circular CustomTypeWrite(writer, v) diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/custom_type.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type.go similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-go/types/custom_type.go rename to packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type.go diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go new file mode 100644 index 0000000000..74d75efa54 --- /dev/null +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go @@ -0,0 +1,1211 @@ +package types + +import ( + "github.com/consideritdone/polywrap-go/polywrap/msgpack" + "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" + "github.com/valyala/fastjson" +) + +func serializeCustomType(value *CustomType) []byte { + ctx := msgpack.NewContext("Serializing (encoding) env-type: CustomType") + encoder := msgpack.NewWriteEncoder(ctx) + writeCustomType(encoder, value) + return encoder.Buffer() +} + +func writeCustomType(writer msgpack.Write, value *CustomType) { + writer.WriteMapLength(41) + writer.Context().Push("Str", "string", "writing property") + writer.WriteString("Str") + { + v := value.Str + writer.WriteString(v) + } + writer.Context().Pop() + writer.Context().Push("OptStr", "*string", "writing property") + writer.WriteString("OptStr") + { + v := value.OptStr + if v == nil { + writer.WriteNil() + } else { + writer.WriteString(*v) + } + } + writer.Context().Pop() + writer.Context().Push("U", "uint32", "writing property") + writer.WriteString("U") + { + v := value.U + writer.WriteU32(v) + } + writer.Context().Pop() + writer.Context().Push("OptU", "*uint32", "writing property") + writer.WriteString("OptU") + { + v := value.OptU + if v == nil { + writer.WriteNil() + } else { + writer.WriteU32(*v) + } + } + writer.Context().Pop() + writer.Context().Push("M_u8", "uint8", "writing property") + writer.WriteString("M_u8") + { + v := value.M_u8 + writer.WriteU8(v) + } + writer.Context().Pop() + writer.Context().Push("M_u16", "uint16", "writing property") + writer.WriteString("M_u16") + { + v := value.M_u16 + writer.WriteU16(v) + } + writer.Context().Pop() + writer.Context().Push("M_u32", "uint32", "writing property") + writer.WriteString("M_u32") + { + v := value.M_u32 + writer.WriteU32(v) + } + writer.Context().Pop() + writer.Context().Push("I", "int32", "writing property") + writer.WriteString("I") + { + v := value.I + writer.WriteI32(v) + } + writer.Context().Pop() + writer.Context().Push("M_i8", "int8", "writing property") + writer.WriteString("M_i8") + { + v := value.M_i8 + writer.WriteI8(v) + } + writer.Context().Pop() + writer.Context().Push("M_i16", "int16", "writing property") + writer.WriteString("M_i16") + { + v := value.M_i16 + writer.WriteI16(v) + } + writer.Context().Pop() + writer.Context().Push("M_i32", "int32", "writing property") + writer.WriteString("M_i32") + { + v := value.M_i32 + writer.WriteI32(v) + } + writer.Context().Pop() + writer.Context().Push("Bigint", "*big.Int", "writing property") + writer.WriteString("Bigint") + { + v := value.Bigint + writer.WriteBigInt(v) + } + writer.Context().Pop() + writer.Context().Push("OptBigint", "*big.Int", "writing property") + writer.WriteString("OptBigint") + { + v := value.OptBigint + if v == nil { + writer.WriteNil() + } else { + writer.WriteBigInt(v) + } + } + writer.Context().Pop() + writer.Context().Push("Bignumber", "*big.Int", "writing property") + writer.WriteString("Bignumber") + { + v := value.Bignumber + writer.WriteBigInt(v) + } + writer.Context().Pop() + writer.Context().Push("OptBignumber", "*big.Int", "writing property") + writer.WriteString("OptBignumber") + { + v := value.OptBignumber + if v == nil { + writer.WriteNil() + } else { + writer.WriteBigInt(v) + } + } + writer.Context().Pop() + writer.Context().Push("Json", "*fastjson.Value", "writing property") + writer.WriteString("Json") + { + v := value.Json + writer.WriteJson(v) + } + writer.Context().Pop() + writer.Context().Push("OptJson", "*fastjson.Value", "writing property") + writer.WriteString("OptJson") + { + v := value.OptJson + if v == nil { + writer.WriteNil() + } else { + writer.WriteJson(v) + } + } + writer.Context().Pop() + writer.Context().Push("Bytes", "[]byte", "writing property") + writer.WriteString("Bytes") + { + v := value.Bytes + writer.WriteBytes(v) + } + writer.Context().Pop() + writer.Context().Push("OptBytes", "[]byte", "writing property") + writer.WriteString("OptBytes") + { + v := value.OptBytes + if v == nil { + writer.WriteNil() + } else { + writer.WriteBytes(v) + } + } + writer.Context().Pop() + writer.Context().Push("M_boolean", "bool", "writing property") + writer.WriteString("M_boolean") + { + v := value.M_boolean + writer.WriteBool(v) + } + writer.Context().Pop() + writer.Context().Push("OptBoolean", "*bool", "writing property") + writer.WriteString("OptBoolean") + { + v := value.OptBoolean + if v == nil { + writer.WriteNil() + } else { + writer.WriteBool(*v) + } + } + writer.Context().Pop() + writer.Context().Push("UArray", "[]uint32", "writing property") + writer.WriteString("UArray") + if value.UArray == nil { + writer.WriteNil() + } else if len(value.UArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.UArray { + { + v := value.UArray[i0] + writer.WriteU32(v) + } + } + } + writer.Context().Pop() + writer.Context().Push("UOptArray", "[]uint32", "writing property") + writer.WriteString("UOptArray") + if value.UOptArray == nil { + writer.WriteNil() + } else if len(value.UOptArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.UOptArray { + { + v := value.UOptArray[i0] + writer.WriteU32(v) + } + } + } + writer.Context().Pop() + writer.Context().Push("OptUOptArray", "[]*uint32", "writing property") + writer.WriteString("OptUOptArray") + if value.OptUOptArray == nil { + writer.WriteNil() + } else if len(value.OptUOptArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.OptUOptArray { + { + v := value.OptUOptArray[i0] + if v == nil { + writer.WriteNil() + } else { + writer.WriteU32(*v) + } + } + } + } + writer.Context().Pop() + writer.Context().Push("OptStrOptArray", "[]*string", "writing property") + writer.WriteString("OptStrOptArray") + if value.OptStrOptArray == nil { + writer.WriteNil() + } else if len(value.OptStrOptArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.OptStrOptArray { + { + v := value.OptStrOptArray[i0] + if v == nil { + writer.WriteNil() + } else { + writer.WriteString(*v) + } + } + } + } + writer.Context().Pop() + writer.Context().Push("UArrayArray", "[][]uint32", "writing property") + writer.WriteString("UArrayArray") + if value.UArrayArray == nil { + writer.WriteNil() + } else if len(value.UArrayArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.UArrayArray { + if value.UArrayArray[i0] == nil { + writer.WriteNil() + } else if len(value.UArrayArray[i0]) == 0 { + writer.WriteNil() + } else { + for i1 := range value.UArrayArray[i0] { + { + v := value.UArrayArray[i0][i1] + writer.WriteU32(v) + } + } + } + } + } + writer.Context().Pop() + writer.Context().Push("UOptArrayOptArray", "[][]*uint32", "writing property") + writer.WriteString("UOptArrayOptArray") + if value.UOptArrayOptArray == nil { + writer.WriteNil() + } else if len(value.UOptArrayOptArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.UOptArrayOptArray { + if value.UOptArrayOptArray[i0] == nil { + writer.WriteNil() + } else if len(value.UOptArrayOptArray[i0]) == 0 { + writer.WriteNil() + } else { + for i1 := range value.UOptArrayOptArray[i0] { + { + v := value.UOptArrayOptArray[i0][i1] + if v == nil { + writer.WriteNil() + } else { + writer.WriteU32(*v) + } + } + } + } + } + } + writer.Context().Pop() + writer.Context().Push("UArrayOptArrayArray", "[][][]uint32", "writing property") + writer.WriteString("UArrayOptArrayArray") + if value.UArrayOptArrayArray == nil { + writer.WriteNil() + } else if len(value.UArrayOptArrayArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.UArrayOptArrayArray { + if value.UArrayOptArrayArray[i0] == nil { + writer.WriteNil() + } else if len(value.UArrayOptArrayArray[i0]) == 0 { + writer.WriteNil() + } else { + for i1 := range value.UArrayOptArrayArray[i0] { + if value.UArrayOptArrayArray[i0][i1] == nil { + writer.WriteNil() + } else if len(value.UArrayOptArrayArray[i0][i1]) == 0 { + writer.WriteNil() + } else { + for i2 := range value.UArrayOptArrayArray[i0][i1] { + { + v := value.UArrayOptArrayArray[i0][i1][i2] + writer.WriteU32(v) + } + } + } + } + } + } + } + writer.Context().Pop() + writer.Context().Push("CrazyArray", "[][][][]uint32", "writing property") + writer.WriteString("CrazyArray") + if value.CrazyArray == nil { + writer.WriteNil() + } else if len(value.CrazyArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.CrazyArray { + if value.CrazyArray[i0] == nil { + writer.WriteNil() + } else if len(value.CrazyArray[i0]) == 0 { + writer.WriteNil() + } else { + for i1 := range value.CrazyArray[i0] { + if value.CrazyArray[i0][i1] == nil { + writer.WriteNil() + } else if len(value.CrazyArray[i0][i1]) == 0 { + writer.WriteNil() + } else { + for i2 := range value.CrazyArray[i0][i1] { + if value.CrazyArray[i0][i1][i2] == nil { + writer.WriteNil() + } else if len(value.CrazyArray[i0][i1][i2]) == 0 { + writer.WriteNil() + } else { + for i3 := range value.CrazyArray[i0][i1][i2] { + { + v := value.CrazyArray[i0][i1][i2][i3] + writer.WriteU32(v) + } + } + } + } + } + } + } + } + } + writer.Context().Pop() + writer.Context().Push("Object", "AnotherType", "writing property") + writer.WriteString("Object") + { + v := value.Object + AnotherTypeWrite(writer, &v) + } + writer.Context().Pop() + writer.Context().Push("OptObject", "*AnotherType", "writing property") + writer.WriteString("OptObject") + { + v := value.OptObject + AnotherTypeWrite(writer, v) + } + writer.Context().Pop() + writer.Context().Push("ObjectArray", "[]AnotherType", "writing property") + writer.WriteString("ObjectArray") + if value.ObjectArray == nil { + writer.WriteNil() + } else if len(value.ObjectArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.ObjectArray { + { + v := value.ObjectArray[i0] + AnotherTypeWrite(writer, &v) + } + } + } + writer.Context().Pop() + writer.Context().Push("OptObjectArray", "[]*AnotherType", "writing property") + writer.WriteString("OptObjectArray") + if value.OptObjectArray == nil { + writer.WriteNil() + } else if len(value.OptObjectArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.OptObjectArray { + { + v := value.OptObjectArray[i0] + AnotherTypeWrite(writer, v) + } + } + } + writer.Context().Pop() + writer.Context().Push("En", "CustomEnum", "writing property") + writer.WriteString("En") + { + v := value.En + writer.WriteI32(int32(v)) + } + writer.Context().Pop() + writer.Context().Push("OptEnum", "*CustomEnum", "writing property") + writer.WriteString("OptEnum") + { + v := value.OptEnum + if v == nil { + writer.WriteNil() + } else { + writer.WriteI32(int32(*v)) + } + } + writer.Context().Pop() + writer.Context().Push("EnumArray", "[]CustomEnum", "writing property") + writer.WriteString("EnumArray") + if value.EnumArray == nil { + writer.WriteNil() + } else if len(value.EnumArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.EnumArray { + { + v := value.EnumArray[i0] + writer.WriteI32(int32(v)) + } + } + } + writer.Context().Pop() + writer.Context().Push("OptEnumArray", "[]*CustomEnum", "writing property") + writer.WriteString("OptEnumArray") + if value.OptEnumArray == nil { + writer.WriteNil() + } else if len(value.OptEnumArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.OptEnumArray { + { + v := value.OptEnumArray[i0] + if v == nil { + writer.WriteNil() + } else { + writer.WriteI32(int32(*v)) + } + } + } + } + writer.Context().Pop() + writer.Context().Push("Map", "map[string]int32", "writing property") + writer.WriteString("Map") + if value.Map == nil { + writer.WriteNil() + } else if len(value.Map) == 0 { + writer.WriteNil() + } else { + for i0 := range value.Map { + writer.WriteString(i0) + { + v := value.Map[i0] + writer.WriteI32(v) + } + } + } + writer.Context().Pop() + writer.Context().Push("MapOfArr", "map[string][]int32", "writing property") + writer.WriteString("MapOfArr") + if value.MapOfArr == nil { + writer.WriteNil() + } else if len(value.MapOfArr) == 0 { + writer.WriteNil() + } else { + for i0 := range value.MapOfArr { + writer.WriteString(i0) + if value.MapOfArr[i0] == nil { + writer.WriteNil() + } else if len(value.MapOfArr[i0]) == 0 { + writer.WriteNil() + } else { + for i1 := range value.MapOfArr[i0] { + { + v := value.MapOfArr[i0][i1] + writer.WriteI32(v) + } + } + } + } + } + writer.Context().Pop() + writer.Context().Push("MapOfObj", "map[string]AnotherType", "writing property") + writer.WriteString("MapOfObj") + if value.MapOfObj == nil { + writer.WriteNil() + } else if len(value.MapOfObj) == 0 { + writer.WriteNil() + } else { + for i0 := range value.MapOfObj { + writer.WriteString(i0) + { + v := value.MapOfObj[i0] + AnotherTypeWrite(writer, &v) + } + } + } + writer.Context().Pop() + writer.Context().Push("MapOfArrOfObj", "map[string][]AnotherType", "writing property") + writer.WriteString("MapOfArrOfObj") + if value.MapOfArrOfObj == nil { + writer.WriteNil() + } else if len(value.MapOfArrOfObj) == 0 { + writer.WriteNil() + } else { + for i0 := range value.MapOfArrOfObj { + writer.WriteString(i0) + if value.MapOfArrOfObj[i0] == nil { + writer.WriteNil() + } else if len(value.MapOfArrOfObj[i0]) == 0 { + writer.WriteNil() + } else { + for i1 := range value.MapOfArrOfObj[i0] { + { + v := value.MapOfArrOfObj[i0][i1] + AnotherTypeWrite(writer, &v) + } + } + } + } + } + writer.Context().Pop() +} + +func deserializeCustomType(data []byte) *CustomType { + ctx := msgpack.NewContext("Deserializing (decoding) env-type: CustomType") + reader := msgpack.NewReadDecoder(ctx, data) + return readCustomType(reader) +} + +func readCustomType(reader msgpack.Read) *CustomType { + var ( + _str string + _strSet bool + _optStr *string + _u uint32 + _uSet bool + _optU *uint32 + _u8 uint8 + _u8Set bool + _u16 uint16 + _u16Set bool + _u32 uint32 + _u32Set bool + _i int32 + _iSet bool + _i8 int8 + _i8Set bool + _i16 int16 + _i16Set bool + _i32 int32 + _i32Set bool + _bigint *big.Int + _bigintSet bool + _optBigint *big.Int + _bignumber *big.Int + _bignumberSet bool + _optBignumber *big.Int + _json *fastjson.Value + _jsonSet bool + _optJson *fastjson.Value + _bytes []byte + _bytesSet bool + _optBytes []byte + _boolean bool + _booleanSet bool + _optBoolean *bool + _uArray []uint32 + _uArraySet bool + _uOptArray []uint32 + _optUOptArray []*uint32 + _optStrOptArray []*string + _uArrayArray [][]uint32 + _uArrayArraySet bool + _uOptArrayOptArray [][]*uint32 + _uOptArrayOptArraySet bool + _uArrayOptArrayArray [][][]uint32 + _uArrayOptArrayArraySet bool + _crazyArray [][][][]uint32 + _object AnotherType + _objectSet bool + _optObject *AnotherType + _objectArray []AnotherType + _objectArraySet bool + _optObjectArray []*AnotherType + _en CustomEnum + _enSet bool + _optEnum *CustomEnum + _enumArray []CustomEnum + _enumArraySet bool + _optEnumArray []*CustomEnum + _map map[string]int32 + _mapSet bool + _mapOfArr map[string][]int32 + _mapOfArrSet bool + _mapOfObj map[string]AnotherType + _mapOfObjSet bool + _mapOfArrOfObj map[string][]AnotherType + _mapOfArrOfObjSet bool + ) + + for i := int32(reader.ReadMapLength()); i > 0; i-- { + field := reader.ReadString() + reader.Context().Push(field, "unknown", "searching for property type") + switch field { + case "Str": + reader.Context().Push(field, "string", "type found, reading property") + _str = reader.ReadString() + _strSet = true + reader.Context().Pop() + case "OptStr": + reader.Context().Push(field, "*string", "type found, reading property") + if !reader.IsNil() { + v := reader.ReadString() + _optStr = &v + } + reader.Context().Pop() + case "U": + reader.Context().Push(field, "uint32", "type found, reading property") + _u = reader.ReadU32() + _uSet = true + reader.Context().Pop() + case "OptU": + reader.Context().Push(field, "*uint32", "type found, reading property") + if !reader.IsNil() { + v := reader.ReadU32() + _optU = &v + } + reader.Context().Pop() + case "M_u8": + reader.Context().Push(field, "uint8", "type found, reading property") + _u8 = reader.ReadU8() + _u8Set = true + reader.Context().Pop() + case "M_u16": + reader.Context().Push(field, "uint16", "type found, reading property") + _u16 = reader.ReadU16() + _u16Set = true + reader.Context().Pop() + case "M_u32": + reader.Context().Push(field, "uint32", "type found, reading property") + _u32 = reader.ReadU32() + _u32Set = true + reader.Context().Pop() + case "I": + reader.Context().Push(field, "int32", "type found, reading property") + _i = reader.ReadI32() + _iSet = true + reader.Context().Pop() + case "M_i8": + reader.Context().Push(field, "int8", "type found, reading property") + _i8 = reader.ReadI8() + _i8Set = true + reader.Context().Pop() + case "M_i16": + reader.Context().Push(field, "int16", "type found, reading property") + _i16 = reader.ReadI16() + _i16Set = true + reader.Context().Pop() + case "M_i32": + reader.Context().Push(field, "int32", "type found, reading property") + _i32 = reader.ReadI32() + _i32Set = true + reader.Context().Pop() + case "Bigint": + reader.Context().Push(field, "*big.Int", "type found, reading property") + _bigint = reader.ReadBigInt() + _bigintSet = true + reader.Context().Pop() + case "OptBigint": + reader.Context().Push(field, "*big.Int", "type found, reading property") + if !reader.IsNil() { + v := reader.ReadBigInt() + _optBigint = v + } + reader.Context().Pop() + case "Bignumber": + reader.Context().Push(field, "*big.Int", "type found, reading property") + _bignumber = reader.ReadBigInt() + _bignumberSet = true + reader.Context().Pop() + case "OptBignumber": + reader.Context().Push(field, "*big.Int", "type found, reading property") + if !reader.IsNil() { + v := reader.ReadBigInt() + _optBignumber = v + } + reader.Context().Pop() + case "Json": + reader.Context().Push(field, "*fastjson.Value", "type found, reading property") + _json = reader.ReadJson() + _jsonSet = true + reader.Context().Pop() + case "OptJson": + reader.Context().Push(field, "*fastjson.Value", "type found, reading property") + if !reader.IsNil() { + v := reader.ReadJson() + _optJson = v + } + reader.Context().Pop() + case "Bytes": + reader.Context().Push(field, "[]byte", "type found, reading property") + _bytes = reader.ReadBytes() + _bytesSet = true + reader.Context().Pop() + case "OptBytes": + reader.Context().Push(field, "[]byte", "type found, reading property") + if !reader.IsNil() { + v := reader.ReadBytes() + _optBytes = v + } + reader.Context().Pop() + case "M_boolean": + reader.Context().Push(field, "bool", "type found, reading property") + _boolean = reader.ReadBool() + _booleanSet = true + reader.Context().Pop() + case "OptBoolean": + reader.Context().Push(field, "*bool", "type found, reading property") + if !reader.IsNil() { + v := reader.ReadBool() + _optBoolean = &v + } + reader.Context().Pop() + case "UArray": + reader.Context().Push(field, "[]uint32", "type found, reading property") + if reader.IsNil() { + _uArray = nil + } else { + ln0 := reader.ReadArrayLength() + _uArray = make([]uint32, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + _uArray[i0] = reader.ReadU32() + } + } + _uArraySet = true + reader.Context().Pop() + case "UOptArray": + reader.Context().Push(field, "[]uint32", "type found, reading property") + if reader.IsNil() { + _uOptArray = nil + } else { + ln0 := reader.ReadArrayLength() + _uOptArray = make([]uint32, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + _uOptArray[i0] = reader.ReadU32() + } + } + reader.Context().Pop() + case "OptUOptArray": + reader.Context().Push(field, "[]*uint32", "type found, reading property") + if reader.IsNil() { + _optUOptArray = nil + } else { + ln0 := reader.ReadArrayLength() + _optUOptArray = make([]*uint32, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + if !reader.IsNil() { + v := reader.ReadU32() + _optUOptArray[i0] = &v + } + } + } + reader.Context().Pop() + case "OptStrOptArray": + reader.Context().Push(field, "[]*string", "type found, reading property") + if reader.IsNil() { + _optStrOptArray = nil + } else { + ln0 := reader.ReadArrayLength() + _optStrOptArray = make([]*string, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + if !reader.IsNil() { + v := reader.ReadString() + _optStrOptArray[i0] = &v + } + } + } + reader.Context().Pop() + case "UArrayArray": + reader.Context().Push(field, "[][]uint32", "type found, reading property") + if reader.IsNil() { + _uArrayArray = nil + } else { + ln0 := reader.ReadArrayLength() + _uArrayArray = make([][]uint32, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + if reader.IsNil() { + _uArrayArray[i0] = nil + } else { + ln1 := reader.ReadArrayLength() + _uArrayArray[i0] = make([]uint32, ln1) + for i1 := uint32(0); i1 < ln1; i1++ { + _uArrayArray[i0][i1] = reader.ReadU32() + } + } + } + } + _uArrayArraySet = true + reader.Context().Pop() + case "UOptArrayOptArray": + reader.Context().Push(field, "[][]*uint32", "type found, reading property") + if reader.IsNil() { + _uOptArrayOptArray = nil + } else { + ln0 := reader.ReadArrayLength() + _uOptArrayOptArray = make([][]*uint32, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + if reader.IsNil() { + _uOptArrayOptArray[i0] = nil + } else { + ln1 := reader.ReadArrayLength() + _uOptArrayOptArray[i0] = make([]*uint32, ln1) + for i1 := uint32(0); i1 < ln1; i1++ { + if !reader.IsNil() { + v := reader.ReadU32() + _uOptArrayOptArray[i0][i1] = &v + } + } + } + } + } + _uOptArrayOptArraySet = true + reader.Context().Pop() + case "UArrayOptArrayArray": + reader.Context().Push(field, "[][][]uint32", "type found, reading property") + if reader.IsNil() { + _uArrayOptArrayArray = nil + } else { + ln0 := reader.ReadArrayLength() + _uArrayOptArrayArray = make([][][]uint32, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + if reader.IsNil() { + _uArrayOptArrayArray[i0] = nil + } else { + ln1 := reader.ReadArrayLength() + _uArrayOptArrayArray[i0] = make([][]uint32, ln1) + for i1 := uint32(0); i1 < ln1; i1++ { + if reader.IsNil() { + _uArrayOptArrayArray[i0][i1] = nil + } else { + ln2 := reader.ReadArrayLength() + _uArrayOptArrayArray[i0][i1] = make([]uint32, ln2) + for i2 := uint32(0); i2 < ln2; i2++ { + _uArrayOptArrayArray[i0][i1][i2] = reader.ReadU32() + } + } + } + } + } + } + _uArrayOptArrayArraySet = true + reader.Context().Pop() + case "CrazyArray": + reader.Context().Push(field, "[][][][]uint32", "type found, reading property") + if reader.IsNil() { + _crazyArray = nil + } else { + ln0 := reader.ReadArrayLength() + _crazyArray = make([][][][]uint32, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + if reader.IsNil() { + _crazyArray[i0] = nil + } else { + ln1 := reader.ReadArrayLength() + _crazyArray[i0] = make([][][]uint32, ln1) + for i1 := uint32(0); i1 < ln1; i1++ { + if reader.IsNil() { + _crazyArray[i0][i1] = nil + } else { + ln2 := reader.ReadArrayLength() + _crazyArray[i0][i1] = make([][]uint32, ln2) + for i2 := uint32(0); i2 < ln2; i2++ { + if reader.IsNil() { + _crazyArray[i0][i1][i2] = nil + } else { + ln3 := reader.ReadArrayLength() + _crazyArray[i0][i1][i2] = make([]uint32, ln3) + for i3 := uint32(0); i3 < ln3; i3++ { + _crazyArray[i0][i1][i2][i3] = reader.ReadU32() + } + } + } + } + } + } + } + } + reader.Context().Pop() + case "Object": + reader.Context().Push(field, "AnotherType", "type found, reading property") + if v := AnotherTypeRead(reader); v != nil { + _object = *v + } + _objectSet = true + reader.Context().Pop() + case "OptObject": + reader.Context().Push(field, "*AnotherType", "type found, reading property") + if v := AnotherTypeRead(reader); v != nil { + _optObject = v + } + reader.Context().Pop() + case "ObjectArray": + reader.Context().Push(field, "[]AnotherType", "type found, reading property") + if reader.IsNil() { + _objectArray = nil + } else { + ln0 := reader.ReadArrayLength() + _objectArray = make([]AnotherType, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + if v := AnotherTypeRead(reader); v != nil { + _objectArray[i0] = *v + } + } + } + _objectArraySet = true + reader.Context().Pop() + case "OptObjectArray": + reader.Context().Push(field, "[]*AnotherType", "type found, reading property") + if reader.IsNil() { + _optObjectArray = nil + } else { + ln0 := reader.ReadArrayLength() + _optObjectArray = make([]*AnotherType, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + if v := AnotherTypeRead(reader); v != nil { + _optObjectArray[i0] = v + } + } + } + reader.Context().Pop() + case "En": + reader.Context().Push(field, "CustomEnum", "type found, reading property") + _en = CustomEnum(reader.ReadI32()) + SanitizeCustomEnumValue(int32(_en)) + _enSet = true + reader.Context().Pop() + case "OptEnum": + reader.Context().Push(field, "*CustomEnum", "type found, reading property") + if !reader.IsNil() { + v := CustomEnum(reader.ReadI32()) + SanitizeCustomEnumValue(int32(v)) + _optEnum = &v + } + reader.Context().Pop() + case "EnumArray": + reader.Context().Push(field, "[]CustomEnum", "type found, reading property") + if reader.IsNil() { + _enumArray = nil + } else { + ln0 := reader.ReadArrayLength() + _enumArray = make([]CustomEnum, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + _enumArray[i0] = CustomEnum(reader.ReadI32()) + SanitizeCustomEnumValue(int32(_enumArray[i0])) + } + } + _enumArraySet = true + reader.Context().Pop() + case "OptEnumArray": + reader.Context().Push(field, "[]*CustomEnum", "type found, reading property") + if reader.IsNil() { + _optEnumArray = nil + } else { + ln0 := reader.ReadArrayLength() + _optEnumArray = make([]*CustomEnum, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + if !reader.IsNil() { + v := CustomEnum(reader.ReadI32()) + SanitizeCustomEnumValue(int32(v)) + _optEnumArray[i0] = &v + } + } + } + reader.Context().Pop() + case "Map": + reader.Context().Push(field, "map[string]int32", "type found, reading property") + if reader.IsNil() { + _map = nil + } else { + ln0 := reader.ReadMapLength() + _map = make(map[string]int32) + for j0 := uint32(0); j0 < ln0; j0++ { + i0 := reader.ReadString() + _map[i0] = reader.ReadI32() + } + } + _mapSet = true + reader.Context().Pop() + case "MapOfArr": + reader.Context().Push(field, "map[string][]int32", "type found, reading property") + if reader.IsNil() { + _mapOfArr = nil + } else { + ln0 := reader.ReadMapLength() + _mapOfArr = make(map[string][]int32) + for j0 := uint32(0); j0 < ln0; j0++ { + i0 := reader.ReadString() + if reader.IsNil() { + _mapOfArr[i0] = nil + } else { + ln1 := reader.ReadArrayLength() + _mapOfArr[i0] = make([]int32, ln1) + for i1 := uint32(0); i1 < ln1; i1++ { + _mapOfArr[i0][i1] = reader.ReadI32() + } + } + } + } + _mapOfArrSet = true + reader.Context().Pop() + case "MapOfObj": + reader.Context().Push(field, "map[string]AnotherType", "type found, reading property") + if reader.IsNil() { + _mapOfObj = nil + } else { + ln0 := reader.ReadMapLength() + _mapOfObj = make(map[string]AnotherType) + for j0 := uint32(0); j0 < ln0; j0++ { + i0 := reader.ReadString() + if v := AnotherTypeRead(reader); v != nil { + _mapOfObj[i0] = *v + } + } + } + _mapOfObjSet = true + reader.Context().Pop() + case "MapOfArrOfObj": + reader.Context().Push(field, "map[string][]AnotherType", "type found, reading property") + if reader.IsNil() { + _mapOfArrOfObj = nil + } else { + ln0 := reader.ReadMapLength() + _mapOfArrOfObj = make(map[string][]AnotherType) + for j0 := uint32(0); j0 < ln0; j0++ { + i0 := reader.ReadString() + if reader.IsNil() { + _mapOfArrOfObj[i0] = nil + } else { + ln1 := reader.ReadArrayLength() + _mapOfArrOfObj[i0] = make([]AnotherType, ln1) + for i1 := uint32(0); i1 < ln1; i1++ { + if v := AnotherTypeRead(reader); v != nil { + _mapOfArrOfObj[i0][i1] = *v + } + } + } + } + } + _mapOfArrOfObjSet = true + reader.Context().Pop() + } + reader.Context().Pop() + } + + if !_strSet { + panic(reader.Context().PrintWithContext("Missing required property: 'str: String'")) + } + if !_uSet { + panic(reader.Context().PrintWithContext("Missing required property: 'u: UInt'")) + } + if !_u8Set { + panic(reader.Context().PrintWithContext("Missing required property: 'u8: UInt8'")) + } + if !_u16Set { + panic(reader.Context().PrintWithContext("Missing required property: 'u16: UInt16'")) + } + if !_u32Set { + panic(reader.Context().PrintWithContext("Missing required property: 'u32: UInt32'")) + } + if !_iSet { + panic(reader.Context().PrintWithContext("Missing required property: 'i: Int'")) + } + if !_i8Set { + panic(reader.Context().PrintWithContext("Missing required property: 'i8: Int8'")) + } + if !_i16Set { + panic(reader.Context().PrintWithContext("Missing required property: 'i16: Int16'")) + } + if !_i32Set { + panic(reader.Context().PrintWithContext("Missing required property: 'i32: Int32'")) + } + if !_bigintSet { + panic(reader.Context().PrintWithContext("Missing required property: 'bigint: BigInt'")) + } + if !_bignumberSet { + panic(reader.Context().PrintWithContext("Missing required property: 'bignumber: BigNumber'")) + } + if !_jsonSet { + panic(reader.Context().PrintWithContext("Missing required property: 'json: JSON'")) + } + if !_bytesSet { + panic(reader.Context().PrintWithContext("Missing required property: 'bytes: Bytes'")) + } + if !_booleanSet { + panic(reader.Context().PrintWithContext("Missing required property: 'boolean: Boolean'")) + } + if !_uArraySet { + panic(reader.Context().PrintWithContext("Missing required property: 'uArray: [UInt]'")) + } + if !_uArrayArraySet { + panic(reader.Context().PrintWithContext("Missing required property: 'uArrayArray: [[UInt]]'")) + } + if !_uOptArrayOptArraySet { + panic(reader.Context().PrintWithContext("Missing required property: 'uOptArrayOptArray: [[UInt32]]'")) + } + if !_uArrayOptArrayArraySet { + panic(reader.Context().PrintWithContext("Missing required property: 'uArrayOptArrayArray: [[[UInt32]]]'")) + } + if !_objectSet { + panic(reader.Context().PrintWithContext("Missing required property: 'object: AnotherType'")) + } + if !_objectArraySet { + panic(reader.Context().PrintWithContext("Missing required property: 'objectArray: [AnotherType]'")) + } + if !_enSet { + panic(reader.Context().PrintWithContext("Missing required property: 'en: CustomEnum'")) + } + if !_enumArraySet { + panic(reader.Context().PrintWithContext("Missing required property: 'enumArray: [CustomEnum]'")) + } + if !_mapSet { + panic(reader.Context().PrintWithContext("Missing required property: 'map: Map'")) + } + if !_mapOfArrSet { + panic(reader.Context().PrintWithContext("Missing required property: 'mapOfArr: Map'")) + } + if !_mapOfObjSet { + panic(reader.Context().PrintWithContext("Missing required property: 'mapOfObj: Map'")) + } + if !_mapOfArrOfObjSet { + panic(reader.Context().PrintWithContext("Missing required property: 'mapOfArrOfObj: Map'")) + } + return &CustomType{ + Str: _str, + OptStr: _optStr, + U: _u, + OptU: _optU, + M_u8: _u8, + M_u16: _u16, + M_u32: _u32, + I: _i, + M_i8: _i8, + M_i16: _i16, + M_i32: _i32, + Bigint: _bigint, + OptBigint: _optBigint, + Bignumber: _bignumber, + OptBignumber: _optBignumber, + Json: _json, + OptJson: _optJson, + Bytes: _bytes, + OptBytes: _optBytes, + M_boolean: _boolean, + OptBoolean: _optBoolean, + UArray: _uArray, + UOptArray: _uOptArray, + OptUOptArray: _optUOptArray, + OptStrOptArray: _optStrOptArray, + UArrayArray: _uArrayArray, + UOptArrayOptArray: _uOptArrayOptArray, + UArrayOptArrayArray: _uArrayOptArrayArray, + CrazyArray: _crazyArray, + Object: _object, + OptObject: _optObject, + ObjectArray: _objectArray, + OptObjectArray: _optObjectArray, + En: _en, + OptEnum: _optEnum, + EnumArray: _enumArray, + OptEnumArray: _optEnumArray, + Map: _map, + MapOfArr: _mapOfArr, + MapOfObj: _mapOfObj, + MapOfArrOfObj: _mapOfArrOfObj, + } +} diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/env.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_env.go similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-go/types/env.go rename to packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_env.go diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/env_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_env_serialization.go similarity index 99% rename from packages/test-cases/cases/bind/sanity/output/wasm-go/types/env_serialization.go rename to packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_env_serialization.go index 5b7e8a9345..802539ef32 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/env_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_env_serialization.go @@ -106,7 +106,6 @@ func readEnv(reader msgpack.Read) *Env { if !_propSet { panic(reader.Context().PrintWithContext("Missing required property: 'prop: String'")) } - return &Env{ Prop: _prop, OptProp: _optProp, From bfafa77ad1204d7f889d2d7916bdafcbc12a4510 Mon Sep 17 00:00:00 2001 From: n0cte Date: Tue, 23 Aug 2022 00:42:36 +0300 Subject: [PATCH 07/65] fix property name for args --- .../bind/src/bindings/golang/wasm-go/templates/main-go.mustache | 2 +- packages/test-cases/cases/bind/sanity/output/wasm-go/main.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/main-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/main-go.mustache index c4f9dfc4e8..9e70cc5fbd 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/main-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/main-go.mustache @@ -8,7 +8,7 @@ import ( //export _wrap_invoke func _wrap_invoke(methodSize, argsSize, envSize uint32) bool { args := polywrap.WrapInvokeArgs(methodSize, argsSize) - switch args.method { + switch args.Method { {{#moduleType}} {{#methods}} case "{{name}}": diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go index 5c9d9a022a..23ef94b6fb 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go @@ -8,7 +8,7 @@ import ( //export _wrap_invoke func _wrap_invoke(methodSize, argsSize, envSize uint32) bool { args := polywrap.WrapInvokeArgs(methodSize, argsSize) - switch args.method { + switch args.Method { case "moduleMethod": return polywrap.WrapInvoke(args, envSize, module.ModuleMethodWrapped) case "objectMethod": From d31f21ecf310f619cac6d69028793a1ea947c1b4 Mon Sep 17 00:00:00 2001 From: n0cte Date: Tue, 23 Aug 2022 12:11:05 +0300 Subject: [PATCH 08/65] fix schema output structure --- .../bind/src/bindings/golang/wasm-go/index.ts | 40 +++++++++++++------ 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/index.ts b/packages/schema/bind/src/bindings/golang/wasm-go/index.ts index bd4823ffda..025f9ed4e5 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/index.ts +++ b/packages/schema/bind/src/bindings/golang/wasm-go/index.ts @@ -19,7 +19,7 @@ const templatePath = (subpath: string) => path.join(__dirname, "./templates", subpath); function camel2snake(str: string): string { - str = str.replace( /([A-Z])/g, "_$1"); + str = str.replace(/([A-Z])/g, "_$1"); str = str.startsWith("_") ? str.slice(1) : str; return str.toLowerCase(); } @@ -49,18 +49,6 @@ export const generateBinding: GenerateBindingFn = ( }); } - // if (abi.moduleType) { - // output.entries.push({ - // type: "Directory", - // name: "types", - // data: renderTemplates( - // templatePath("types"), - // abi.moduleType, - // subTemplates - // ), - // }); - // } - // Generate imported folder const importEntries: OutputEntry[] = []; @@ -173,10 +161,36 @@ export const generateBinding: GenerateBindingFn = ( // Generate root entry file output.entries.push(...renderTemplates(templatePath(""), abi, subTemplates)); + output.entries = mergePaths(output.entries); return result; }; +function mergePaths(array: OutputEntry[]): OutputEntry[] { + const tmp: { [key: string]: OutputEntry } = {}; + for (let i = 0; i < array.length; i++) { + switch (array[i].type) { + case "File": + tmp[array[i].name] = array[i] + break; + case "Directory": + if (!tmp[array[i].name]) { + tmp[array[i].name] = array[i] + } else { + (tmp[array[i].name].data as OutputEntry[]).push(...(array[i].data as OutputEntry[])) + } + break; + } + } + array = Object.values(tmp); + for (let i = 0; i < array.length; i++) { + if (array[i].type === "Directory") { + array[i].data = mergePaths(array[i].data as OutputEntry[]); + } + } + return array; +} + function applyTransforms(abi: Abi): Abi { const transforms = [ extendType(Functions), From 30f5a34d23ee3535e8162ade46d762444ffb4989 Mon Sep 17 00:00:00 2001 From: n0cte Date: Tue, 23 Aug 2022 15:18:10 +0300 Subject: [PATCH 09/65] fix code style --- .../src/bindings/golang/wasm-go/functions.ts | 186 +++++++++--------- .../bind/src/bindings/golang/wasm-go/index.ts | 14 +- packages/schema/bind/src/bindings/utils.ts | 5 +- packages/schema/bind/src/types.ts | 7 +- 4 files changed, 114 insertions(+), 98 deletions(-) diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/functions.ts b/packages/schema/bind/src/bindings/golang/wasm-go/functions.ts index 1265e1d045..d73d73fb4b 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/functions.ts +++ b/packages/schema/bind/src/bindings/golang/wasm-go/functions.ts @@ -1,4 +1,3 @@ -import { isBaseType } from "./baseTypes"; import { reservedWordsAS } from "./reservedWords"; import { MustacheFn } from "../../types"; @@ -7,30 +6,30 @@ let num = -1; export const startIter: MustacheFn = () => { return (): string => { num = -1; - return "" - } -} + return ""; + }; +}; export const stopIter: MustacheFn = () => { return (): string => { num = -1; - return "" - } -} + return ""; + }; +}; export const currIter: MustacheFn = () => { return (text: string, render: (template: string) => string): string => { const rendered: string = render(text); return `${rendered}${num}`; - } -} + }; +}; export const nextIter: MustacheFn = () => { return (text: string, render: (template: string) => string): string => { const rendered: string = render(text); return `${rendered}${++num}`; - } -} + }; +}; export const prevFullIter: MustacheFn = () => { return (text: string, render: (template: string) => string): string => { @@ -38,9 +37,12 @@ export const prevFullIter: MustacheFn = () => { if (rendered == "stop") { return ""; } - return Array(num).fill(0).map((_, i) => `[${rendered}${i}]`).join(""); - } -} + return Array(num) + .fill(0) + .map((_, i) => `[${rendered}${i}]`) + .join(""); + }; +}; export const lastFullIter: MustacheFn = () => { return (text: string, render: (template: string) => string): string => { @@ -48,90 +50,103 @@ export const lastFullIter: MustacheFn = () => { if (rendered == "stop") { return ""; } - return Array(num + 1).fill(0).map((_, i) => `[${rendered}${i}]`).join(""); - } -} + return Array(num + 1) + .fill(0) + .map((_, i) => `[${rendered}${i}]`) + .join(""); + }; +}; export const writePointer: MustacheFn = () => { return (text: string, render: (template: string) => string): string => { const [type, value] = render(text).split(" - "); let pointer = "*"; - if ({ - "BigInt": true, - "Json": true, - "Bytes": true, - }[type] ?? false) { - pointer = ""; + switch (type) { + case "BigInt": + case "Json": + case "Bytes": + pointer = ""; + break; } - return `writer.Write${type}(${pointer}${value})` - } -} + return `writer.Write${type}(${pointer}${value})`; + }; +}; export const readPointer: MustacheFn = () => { return (text: string, render: (template: string) => string): string => { const [type, value] = render(text).split(" - "); let pointer = "&"; - if ({ - "BigInt": true, - "Json": true, - "Bytes": true, - }[type] ?? false) { - pointer = ""; + switch (type) { + case "BigInt": + case "Json": + case "Bytes": + pointer = ""; + break; } - return `${pointer}${value}` - } -} + return `${pointer}${value}`; + }; +}; export const toSnakeCase: MustacheFn = () => { return (text: string, render: (template: string) => string): string => { text = render(text).replace(/([A-Z])/g, "_$1"); text = text.startsWith("_") ? text.slice(1) : text; return text.toLowerCase(); - } -} + }; +}; export const makeImports: MustacheFn = () => { return (text: string, render: (template: string) => string): string => { - const types = render(text).split(",") - const exist: {[key:string]: boolean} = {}; - for (const t of types){ + const types = render(text).split(","); + const exist: { [key: string]: boolean } = {}; + for (const t of types) { switch (t) { case "*big.Int": - exist["github.com/consideritdone/polywrap-go/polywrap/msgpack/big"] = true; - break + exist[ + "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" + ] = true; + break; case "*fastjson.Value": exist["github.com/valyala/fastjson"] = true; break; } } - let imports: Array = ["github.com/consideritdone/polywrap-go/polywrap/msgpack"]; + const imports: Array = [ + "github.com/consideritdone/polywrap-go/polywrap/msgpack", + ]; imports.push(...Object.keys(exist)); - const txt = imports.sort().map(imp => `\t"${imp}"`).join("\n"); - return `import (\n${txt}\n)` - } -} + const txt = imports + .sort() + .map((imp) => `\t"${imp}"`) + .join("\n"); + return `import (\n${txt}\n)`; + }; +}; export const stuctProps: MustacheFn = () => { return (text: string, render: (template: string) => string): string => { - let props: [string, string][] = render(text).split("\n") - .map(line => line.trimEnd()) - .filter(line => line !== "") - .map(line => line.split(" ") as [string, string]) + const props: [string, string][] = render(text) + .split("\n") + .map((line) => line.trimEnd()) + .filter((line) => line !== "") + .map((line) => line.split(" ") as [string, string]); let maxPropNameLn = 0; for (const [propName] of props) { if (propName.length > maxPropNameLn) { - maxPropNameLn = propName.length + maxPropNameLn = propName.length; } } for (let i = 0; i < props.length; i++) { if (props[i][0].length < maxPropNameLn) { - props[i][0] += Array(maxPropNameLn - props[i][0].length).fill(" ").join(""); + props[i][0] += Array(maxPropNameLn - props[i][0].length) + .fill(" ") + .join(""); } props[i][0] = "\t" + props[i][0]; } - return props.map(v => v.join(" ")).join("\n") + "\n"; - } -} + return props.map((v) => v.join(" ")).join("\n") + "\n"; + }; +}; export const handleKeywords: MustacheFn = () => { return (text: string, render: (template: string) => string): string => { @@ -146,50 +161,46 @@ export const handleKeywords: MustacheFn = () => { export const toMsgPack: MustacheFn = () => { return (value: string, render: (template: string) => string) => { let type = render(value); - let modifier = ""; if (type[type.length - 1] === "!") { type = type.substring(0, type.length - 1); - } else { - modifier = "Optional"; } - let t = type; if (type.startsWith("[")) { t = "Array"; } else if (type.startsWith("Map")) { t = "Map"; } else if (type.startsWith("Int8")) { - t = "I8" + t = "I8"; } else if (type.startsWith("Int16")) { - t = "I16" + t = "I16"; } else if (type.startsWith("Int32")) { - t = "I32" + t = "I32"; } else if (type.startsWith("Int64")) { - t = "I64" + t = "I64"; } else if (type.startsWith("Int")) { - t = "I32" + t = "I32"; } else if (type.startsWith("UInt8")) { - t = "U8" + t = "U8"; } else if (type.startsWith("UInt16")) { - t = "U16" + t = "U16"; } else if (type.startsWith("UInt32")) { - t = "U32" + t = "U32"; } else if (type.startsWith("UInt64")) { - t = "U64" + t = "U64"; } else if (type.startsWith("UInt")) { - t = "U32" + t = "U32"; } else if (type.startsWith("String")) { - t = "String" + t = "String"; } else if (type.startsWith("Boolean")) { - t = "Bool" + t = "Bool"; } else if (type.startsWith("Bytes")) { - t = "Bytes" + t = "Bytes"; } else if (type.startsWith("BigInt")) { - t = "BigInt" + t = "BigInt"; } else if (type.startsWith("BigNumber")) { - t = "BigInt" + t = "BigInt"; } else if (type.startsWith("JSON")) { - t = "Json" + t = "Json"; } return t; }; @@ -311,13 +322,14 @@ const toWasmMap = (type: string, optional: boolean): string => { return applyOptional(`map[${keyType}]${valType}`, optional, false); }; -const applyOptional = ( - type: string, - optional: boolean, - isEnum: boolean -): string => { - if (optional && !type.startsWith("*") && !type.startsWith("[]") && !type.startsWith("map")) { - return `*${type}` +const applyOptional = (type: string, optional: boolean, _: boolean): string => { + if ( + optional && + !type.startsWith("*") && + !type.startsWith("[]") && + !type.startsWith("map") + ) { + return `*${type}`; } else { return type; } @@ -329,14 +341,6 @@ function replaceAt(str: string, index: number, replacement: string): string { ); } -function insertAt(str: string, index: number, insert: string): string { - return str.substr(0, index) + insert + str.substr(index); -} - -function removeAt(str: string, index: number): string { - return str.substr(0, index) + str.substr(index + 1); -} - export const toLower: MustacheFn = () => { return (value: string, render: (template: string) => string) => { let type = render(value); diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/index.ts b/packages/schema/bind/src/bindings/golang/wasm-go/index.ts index 025f9ed4e5..edb7df1988 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/index.ts +++ b/packages/schema/bind/src/bindings/golang/wasm-go/index.ts @@ -155,7 +155,11 @@ export const generateBinding: GenerateBindingFn = ( output.entries.push({ type: "Directory", name: "types", - data: renderTemplates(templatePath("object-type"), abi.envType, subTemplates), + data: renderTemplates( + templatePath("object-type"), + abi.envType, + subTemplates + ), }); } @@ -171,13 +175,15 @@ function mergePaths(array: OutputEntry[]): OutputEntry[] { for (let i = 0; i < array.length; i++) { switch (array[i].type) { case "File": - tmp[array[i].name] = array[i] + tmp[array[i].name] = array[i]; break; case "Directory": if (!tmp[array[i].name]) { - tmp[array[i].name] = array[i] + tmp[array[i].name] = array[i]; } else { - (tmp[array[i].name].data as OutputEntry[]).push(...(array[i].data as OutputEntry[])) + (tmp[array[i].name].data as OutputEntry[]).push( + ...(array[i].data as OutputEntry[]) + ); } break; } diff --git a/packages/schema/bind/src/bindings/utils.ts b/packages/schema/bind/src/bindings/utils.ts index 07e0d96949..6b91c0b3de 100644 --- a/packages/schema/bind/src/bindings/utils.ts +++ b/packages/schema/bind/src/bindings/utils.ts @@ -9,8 +9,9 @@ function transformName(str: string, view: unknown): string { return str; } const def = view as GenericDefinition; - str = str.replace("%type%", def.type) - .replace( /([A-Z])/g, "_$1") + str = str + .replace("%type%", def.type) + .replace(/([A-Z])/g, "_$1") .toLowerCase(); return str.startsWith("_") ? str.slice(1) : str; } diff --git a/packages/schema/bind/src/types.ts b/packages/schema/bind/src/types.ts index dca0689457..c7c5b8504a 100644 --- a/packages/schema/bind/src/types.ts +++ b/packages/schema/bind/src/types.ts @@ -1,7 +1,12 @@ import { OutputDirectory } from "@polywrap/os-js"; import { WrapAbi } from "@polywrap/schema-parse"; -export type BindLanguage = "wasm-as" | "wasm-rs" | "wasm-go" | "plugin-ts" | "app-ts"; +export type BindLanguage = + | "wasm-as" + | "wasm-rs" + | "wasm-go" + | "plugin-ts" + | "app-ts"; export interface BindOutput { output: OutputDirectory; From 99a31ac992da8329d32a390571ef06d227b5a650 Mon Sep 17 00:00:00 2001 From: ramil Date: Tue, 23 Aug 2022 15:43:02 +0300 Subject: [PATCH 10/65] don't filter for wasm-go codegen --- packages/schema/bind/src/__tests__/index.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/schema/bind/src/__tests__/index.ts b/packages/schema/bind/src/__tests__/index.ts index efe0d6ff43..1fd3557924 100644 --- a/packages/schema/bind/src/__tests__/index.ts +++ b/packages/schema/bind/src/__tests__/index.ts @@ -64,7 +64,6 @@ export function fetchTestCases(): TestCases { const outputLanguages = fs .readdirSync(outputDir, { withFileTypes: true }) .filter((item: fs.Dirent) => item.isDirectory()) - .filter((item: fs.Dirent) => item.name == "wasm-go") .map((item: fs.Dirent) => { return { language: item.name, From 6d637e4aee795435d83f48ad5c8afe7da9f28052 Mon Sep 17 00:00:00 2001 From: ramil Date: Tue, 23 Aug 2022 17:34:04 +0300 Subject: [PATCH 11/65] fix tests regarding latest changes from origin --- packages/schema/bind/src/__tests__/index.ts | 1 + .../golang/{wasm-go => }/functions.ts | 2 +- .../schema/bind/src/bindings/golang/index.ts | 3 + .../golang/{wasm-go => }/reservedWords.ts | 0 .../golang/{wasm-go/baseTypes.ts => types.ts} | 6 +- .../golang/{wasm-go => wasm}/index.ts | 155 ++++++++++-------- .../templates/deserialize_array.mustache | 0 .../templates/deserialize_enum.mustache | 0 .../templates/deserialize_map.mustache | 0 .../templates/deserialize_object.mustache | 0 .../templates/deserialize_scalar.mustache | 0 .../enum-type/Enum%type%-go.mustache | 0 .../templates/env-type/Env%type%-go.mustache | 0 .../Env%type%Serialization-go.mustache | 0 .../imported/enum-type/Enum%type%-go.mustache | 0 .../imported/env-type/Env%type%-go.mustache | 0 .../Env%type%Serialization-go.mustache | 0 .../interface-type/%type%-go.mustache | 0 .../%type%Serialization-go.mustache | 0 .../module-type/%type%Wrapped-go.mustache | 0 .../object-type/Object%type%-go.mustache | 0 .../Object%type%Serialization-go.mustache | 0 .../interface-type/%type%-go.mustache | 0 .../templates/main-go.mustache | 0 .../%type%Serialization-go.mustache | 0 .../module-type/%type%Wrapped-go.mustache | 0 .../object-type/Object%type%-go.mustache | 0 .../Object%type%Serialization-go.mustache | 0 .../templates/serialize_array.mustache | 0 .../templates/serialize_enum.mustache | 0 .../templates/serialize_map.mustache | 0 .../templates/serialize_object.mustache | 0 .../templates/serialize_scalar.mustache | 0 .../value_deserialize_array.mustache | 0 .../templates/value_deserialize_enum.mustache | 0 .../templates/value_deserialize_map.mustache | 0 .../value_deserialize_object.mustache | 0 .../value_deserialize_scalar.mustache | 0 .../templates/value_serialize_array.mustache | 0 .../templates/value_serialize_enum.mustache | 0 .../templates/value_serialize_map.mustache | 0 .../templates/value_serialize_object.mustache | 0 .../templates/value_serialize_scalar.mustache | 0 .../cases/bind/sanity/output/wasm-go/main.go | 2 + .../sanity/output/wasm-go/types/enumwhile.go | 38 +++++ .../wasm-go/types/module_serialization.go | 53 ++++++ .../output/wasm-go/types/module_wrapped.go | 9 + .../wasm-go/types/object_custom_map_value.go | 25 +++ .../object_custom_map_value_serialization.go | 56 +++++++ .../wasm-go/types/object_custom_type.go | 1 + .../types/object_custom_type_serialization.go | 40 ++++- .../sanity/output/wasm-go/types/objectelse.go | 25 +++ .../wasm-go/types/objectelse_serialization.go | 56 +++++++ 53 files changed, 399 insertions(+), 73 deletions(-) rename packages/schema/bind/src/bindings/golang/{wasm-go => }/functions.ts (99%) create mode 100644 packages/schema/bind/src/bindings/golang/index.ts rename packages/schema/bind/src/bindings/golang/{wasm-go => }/reservedWords.ts (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go/baseTypes.ts => types.ts} (71%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/index.ts (57%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/deserialize_array.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/deserialize_enum.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/deserialize_map.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/deserialize_object.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/deserialize_scalar.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/enum-type/Enum%type%-go.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/env-type/Env%type%-go.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/env-type/Env%type%Serialization-go.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/imported/enum-type/Enum%type%-go.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/imported/env-type/Env%type%-go.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/imported/env-type/Env%type%Serialization-go.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/imported/interface-type/%type%-go.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/imported/module-type/%type%Serialization-go.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/imported/module-type/%type%Wrapped-go.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/imported/object-type/Object%type%-go.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/imported/object-type/Object%type%Serialization-go.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/interface-type/%type%-go.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/main-go.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/module-type/%type%Serialization-go.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/module-type/%type%Wrapped-go.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/object-type/Object%type%-go.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/object-type/Object%type%Serialization-go.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/serialize_array.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/serialize_enum.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/serialize_map.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/serialize_object.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/serialize_scalar.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/value_deserialize_array.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/value_deserialize_enum.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/value_deserialize_map.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/value_deserialize_object.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/value_deserialize_scalar.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/value_serialize_array.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/value_serialize_enum.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/value_serialize_map.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/value_serialize_object.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/value_serialize_scalar.mustache (100%) create mode 100644 packages/test-cases/cases/bind/sanity/output/wasm-go/types/enumwhile.go create mode 100644 packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value.go create mode 100644 packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value_serialization.go create mode 100644 packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse.go create mode 100644 packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse_serialization.go diff --git a/packages/schema/bind/src/__tests__/index.ts b/packages/schema/bind/src/__tests__/index.ts index 1fd3557924..efe0d6ff43 100644 --- a/packages/schema/bind/src/__tests__/index.ts +++ b/packages/schema/bind/src/__tests__/index.ts @@ -64,6 +64,7 @@ export function fetchTestCases(): TestCases { const outputLanguages = fs .readdirSync(outputDir, { withFileTypes: true }) .filter((item: fs.Dirent) => item.isDirectory()) + .filter((item: fs.Dirent) => item.name == "wasm-go") .map((item: fs.Dirent) => { return { language: item.name, diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/functions.ts b/packages/schema/bind/src/bindings/golang/functions.ts similarity index 99% rename from packages/schema/bind/src/bindings/golang/wasm-go/functions.ts rename to packages/schema/bind/src/bindings/golang/functions.ts index d73d73fb4b..2590d0b782 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/functions.ts +++ b/packages/schema/bind/src/bindings/golang/functions.ts @@ -1,5 +1,5 @@ import { reservedWordsAS } from "./reservedWords"; -import { MustacheFn } from "../../types"; +import { MustacheFn } from "../types"; let num = -1; diff --git a/packages/schema/bind/src/bindings/golang/index.ts b/packages/schema/bind/src/bindings/golang/index.ts new file mode 100644 index 0000000000..a01310ad9e --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/index.ts @@ -0,0 +1,3 @@ +export * as Wasm from "./wasm"; +export * as Functions from "./functions"; +export * as Types from "./types"; diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/reservedWords.ts b/packages/schema/bind/src/bindings/golang/reservedWords.ts similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/reservedWords.ts rename to packages/schema/bind/src/bindings/golang/reservedWords.ts diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/baseTypes.ts b/packages/schema/bind/src/bindings/golang/types.ts similarity index 71% rename from packages/schema/bind/src/bindings/golang/wasm-go/baseTypes.ts rename to packages/schema/bind/src/bindings/golang/types.ts index e667344d20..e57c1b9b88 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/baseTypes.ts +++ b/packages/schema/bind/src/bindings/golang/types.ts @@ -1,4 +1,4 @@ -const baseTypes = { +const types = { u8: "u8", u16: "u16", u32: "u32", @@ -9,10 +9,10 @@ const baseTypes = { bool: "bool", }; -export type BaseTypes = typeof baseTypes; +export type BaseTypes = typeof types; export type BaseType = keyof BaseTypes; export function isBaseType(type: string): type is BaseType { - return type in baseTypes; + return type in types; } diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/index.ts b/packages/schema/bind/src/bindings/golang/wasm/index.ts similarity index 57% rename from packages/schema/bind/src/bindings/golang/wasm-go/index.ts rename to packages/schema/bind/src/bindings/golang/wasm/index.ts index edb7df1988..d1a7a96300 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/index.ts +++ b/packages/schema/bind/src/bindings/golang/wasm/index.ts @@ -1,6 +1,7 @@ -import * as Functions from "./functions"; +import { Functions } from "../"; import { GenerateBindingFn } from "../.."; -import { renderTemplates, loadSubTemplates } from "../../utils/templates"; +import { renderTemplates } from "../.."; +import { loadSubTemplates } from "../../utils"; import { BindOptions, BindOutput } from "../../.."; import { @@ -37,71 +38,81 @@ export const generateBinding: GenerateBindingFn = ( const abi = applyTransforms(options.abi); // Generate object type folders - for (const objectType of abi.objectTypes) { - output.entries.push({ - type: "Directory", - name: "types", - data: renderTemplates( - templatePath("object-type"), - objectType, - subTemplates - ), - }); + if (abi.objectTypes) { + for (const objectType of abi.objectTypes) { + output.entries.push({ + type: "Directory", + name: "types", + data: renderTemplates( + templatePath("object-type"), + objectType, + subTemplates + ), + }); + } } // Generate imported folder const importEntries: OutputEntry[] = []; // Generate imported module type folders - for (const importedModuleType of abi.importedModuleTypes) { - importEntries.push({ - type: "Directory", - name: `${camel2snake(importedModuleType.namespace)}`, - data: renderTemplates( - templatePath("imported/module-type"), - importedModuleType, - subTemplates - ), - }); + if (abi.importedModuleTypes) { + for (const importedModuleType of abi.importedModuleTypes) { + importEntries.push({ + type: "Directory", + name: `${camel2snake(importedModuleType.namespace)}`, + data: renderTemplates( + templatePath("imported/module-type"), + importedModuleType, + subTemplates + ), + }); + } } // // Generate imported env type folders - for (const importedEnvType of abi.importedEnvTypes) { - importEntries.push({ - type: "Directory", - name: `${camel2snake(importedEnvType.namespace)}`, - data: renderTemplates( - templatePath("imported/env-type"), - importedEnvType, - subTemplates - ), - }); + if (abi.importedEnvTypes) { + for (const importedEnvType of abi.importedEnvTypes) { + importEntries.push({ + type: "Directory", + name: `${camel2snake(importedEnvType.namespace)}`, + data: renderTemplates( + templatePath("imported/env-type"), + importedEnvType, + subTemplates + ), + }); + } } // Generate imported enum type folders - for (const importedEnumType of abi.importedEnumTypes) { - importEntries.push({ - type: "Directory", - name: `${camel2snake(importedEnumType.namespace)}`, - data: renderTemplates( - templatePath("imported/enum-type"), - importedEnumType, - subTemplates - ), - }); + if (abi.importedEnumTypes) { + for (const importedEnumType of abi.importedEnumTypes) { + importEntries.push({ + type: "Directory", + name: `${camel2snake(importedEnumType.namespace)}`, + data: renderTemplates( + templatePath("imported/enum-type"), + importedEnumType, + subTemplates + ), + }); + } } // Generate imported object type folders - for (const importedObectType of abi.importedObjectTypes) { - importEntries.push({ - type: "Directory", - name: `${camel2snake(importedObectType.namespace)}`, - data: renderTemplates( - templatePath("imported/object-type"), - importedObectType, - subTemplates - ), - }); + if (abi.importedObjectTypes) { + for (const importedObectType of abi.importedObjectTypes) { + importEntries.push({ + type: "Directory", + name: `${camel2snake(importedObectType.namespace)}`, + data: renderTemplates( + templatePath("imported/object-type"), + importedObectType, + subTemplates + ), + }); + } } if (importEntries.length) { @@ -116,16 +127,18 @@ export const generateBinding: GenerateBindingFn = ( } // Generate interface type folders - for (const interfaceType of abi.interfaceTypes) { - output.entries.push({ - type: "Directory", - name: "interfaces", - data: renderTemplates( - templatePath("interface-type"), - interfaceType, - subTemplates - ), - }); + if (abi.interfaceTypes) { + for (const interfaceType of abi.interfaceTypes) { + output.entries.push({ + type: "Directory", + name: "interfaces", + data: renderTemplates( + templatePath("interface-type"), + interfaceType, + subTemplates + ), + }); + } } // Generate module type folders @@ -142,12 +155,18 @@ export const generateBinding: GenerateBindingFn = ( } // Generate enum type folders - for (const enumType of abi.enumTypes) { - output.entries.push({ - type: "Directory", - name: "types", - data: renderTemplates(templatePath("enum-type"), enumType, subTemplates), - }); + if (abi.enumTypes) { + for (const enumType of abi.enumTypes) { + output.entries.push({ + type: "Directory", + name: "types", + data: renderTemplates( + templatePath("enum-type"), + enumType, + subTemplates + ), + }); + } } // Generate env type folders diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_array.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/deserialize_array.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_array.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/deserialize_array.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_enum.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/deserialize_enum.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_enum.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/deserialize_enum.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_map.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/deserialize_map.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_map.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/deserialize_map.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_object.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/deserialize_object.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_object.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/deserialize_object.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_scalar.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/deserialize_scalar.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_scalar.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/deserialize_scalar.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/enum-type/Enum%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/enum-type/Enum%type%-go.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/enum-type/Enum%type%-go.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/enum-type/Enum%type%-go.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/env-type/Env%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%-go.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/env-type/Env%type%-go.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%-go.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/env-type/Env%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%Serialization-go.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/env-type/Env%type%Serialization-go.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%Serialization-go.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/enum-type/Enum%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/enum-type/Enum%type%-go.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/enum-type/Enum%type%-go.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/imported/enum-type/Enum%type%-go.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/env-type/Env%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%-go.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/env-type/Env%type%-go.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%-go.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/env-type/Env%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%Serialization-go.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/env-type/Env%type%Serialization-go.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%Serialization-go.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/interface-type/%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/interface-type/%type%-go.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/interface-type/%type%-go.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/imported/interface-type/%type%-go.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/module-type/%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Serialization-go.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/module-type/%type%Serialization-go.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Serialization-go.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/module-type/%type%Wrapped-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Wrapped-go.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/module-type/%type%Wrapped-go.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Wrapped-go.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/object-type/Object%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%-go.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/object-type/Object%type%-go.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%-go.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/object-type/Object%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%Serialization-go.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/object-type/Object%type%Serialization-go.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%Serialization-go.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/interface-type/%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/interface-type/%type%-go.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/interface-type/%type%-go.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/interface-type/%type%-go.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/main-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/main-go.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/main-go.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/main-go.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/module-type/%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/%type%Serialization-go.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/module-type/%type%Serialization-go.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/module-type/%type%Serialization-go.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/module-type/%type%Wrapped-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/%type%Wrapped-go.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/module-type/%type%Wrapped-go.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/module-type/%type%Wrapped-go.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/Object%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%-go.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/Object%type%-go.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%-go.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/Object%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%Serialization-go.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/Object%type%Serialization-go.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%Serialization-go.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_array.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/serialize_array.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_array.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/serialize_array.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_enum.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/serialize_enum.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_enum.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/serialize_enum.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_map.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/serialize_map.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_map.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/serialize_map.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_object.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/serialize_object.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_object.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/serialize_object.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_scalar.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/serialize_scalar.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_scalar.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/serialize_scalar.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_array.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/value_deserialize_array.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_array.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/value_deserialize_array.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_enum.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/value_deserialize_enum.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_enum.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/value_deserialize_enum.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_map.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/value_deserialize_map.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_map.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/value_deserialize_map.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_object.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/value_deserialize_object.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_object.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/value_deserialize_object.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_scalar.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/value_deserialize_scalar.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_scalar.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/value_deserialize_scalar.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_array.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/value_serialize_array.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_array.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/value_serialize_array.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_enum.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/value_serialize_enum.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_enum.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/value_serialize_enum.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_map.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/value_serialize_map.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_map.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/value_serialize_map.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_object.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/value_serialize_object.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_object.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/value_serialize_object.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_scalar.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/value_serialize_scalar.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_scalar.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/value_serialize_scalar.mustache diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go index 23ef94b6fb..c3782bf700 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go @@ -15,6 +15,8 @@ func _wrap_invoke(methodSize, argsSize, envSize uint32) bool { return polywrap.WrapInvoke(args, envSize, module.ObjectMethodWrapped) case "optionalEnvMethod": return polywrap.WrapInvoke(args, envSize, module.OptionalEnvMethodWrapped) + case "if": + return polywrap.WrapInvoke(args, envSize, module.IfWrapped) default: return polywrap.WrapInvoke(args, envSize, nil) } diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/enumwhile.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/enumwhile.go new file mode 100644 index 0000000000..16ed26f498 --- /dev/null +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/enumwhile.go @@ -0,0 +1,38 @@ +package types + +type While int32 + +const ( + Whilefor = iota + Whilein = iota + whileMax = iota +) + +func SanitizeWhileValue(value int32) { + if !(value >= 0 && value < int32(whileMax)) { + panic("Invalid value for enum 'While'") + } +} + +func GetWhileValue(key string) While { + switch key { + case "for": + return Whilefor + case "in": + return Whilein + default: + panic("Invalid key for enum 'While'") + } +} + +func GetWhileKey(value While) string { + SanitizeWhileValue(int32(value)) + switch value { + case Whilefor: + return "for" + case Whilein: + return "in" + default: + panic("Invalid value for enum 'While'") + } +} diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_serialization.go index 8bbc6a75a0..c59b6436ef 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_serialization.go @@ -434,3 +434,56 @@ func WriteOptionalEnvMethodResult(writer msgpack.Write, value *AnotherType) { } writer.Context().Pop() } + +type ArgsIf struct { + M_if else +} + +func DeserializeIfArgs(argsBuf []byte) *ArgsIf { + ctx := msgpack.NewContext("Deserializing module-type: If") + reader := msgpack.NewReadDecoder(ctx, argsBuf) + + var ( + _if else + _ifSet bool + ) + + for i := int32(reader.ReadMapLength()); i > 0; i-- { + field := reader.ReadString() + reader.Context().Push(field, "unknown", "searching for property type") + reader.Context().Pop() + switch field { + case "M_if": + reader.Context().Push(field, "else", "type found, reading property") + if v := ElseRead(reader); v != nil { + _if = *v + } + _ifSet = true + reader.Context().Pop() + } + } + + if !_ifSet { + panic(reader.Context().PrintWithContext("Missing required property: 'if: else'")) + } + + return &ArgsIf{ + M_if: _if, + } +} + +func SerializeIfResult(value else) []byte { + ctx := msgpack.NewContext("Serializing module-type: If") + encoder := msgpack.NewWriteEncoder(ctx) + WriteIfResult(encoder, value); + return encoder.Buffer() +} + +func WriteIfResult(writer msgpack.Write, value else) { + writer.Context().Push("if", "else", "writing property") + { + v := value + ElseWrite(writer, &v) + } + writer.Context().Pop() +} diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_wrapped.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_wrapped.go index 8b77f7a4a8..089b9e3704 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_wrapped.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_wrapped.go @@ -43,3 +43,12 @@ func OptionalEnvMethodWrapped(argsBuf []byte, envSize uint32) []byte { return SerializeOptionalEnvMethodResult(result) } +func IfWrapped(argsBuf []byte, envSize uint32) []byte { + var env *Env + + args := DeserializeIfArgs(argsBuf) + + result := methods.If(args) + return SerializeIfResult(result) +} + diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value.go new file mode 100644 index 0000000000..155d3c7d21 --- /dev/null +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value.go @@ -0,0 +1,25 @@ +package types + +import ( + "github.com/consideritdone/polywrap-go/polywrap/msgpack" +) + +type CustomMapValue struct { + Foo string +} + +func CustomMapValueToBuffer(value *CustomMapValue) []byte { + return serializeCustomMapValue(value) +} + +func CustomMapValueFromBuffer(data []byte) *CustomMapValue { + return deserializeCustomMapValue(data) +} + +func CustomMapValueWrite(writer msgpack.Write, value *CustomMapValue) { + writeCustomMapValue(writer, value) +} + +func CustomMapValueRead(reader msgpack.Read) *CustomMapValue { + return readCustomMapValue(reader) +} diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value_serialization.go new file mode 100644 index 0000000000..2e0ee49210 --- /dev/null +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value_serialization.go @@ -0,0 +1,56 @@ +package types + +import ( + "github.com/consideritdone/polywrap-go/polywrap/msgpack" +) + +func serializeCustomMapValue(value *CustomMapValue) []byte { + ctx := msgpack.NewContext("Serializing (encoding) env-type: CustomMapValue") + encoder := msgpack.NewWriteEncoder(ctx) + writeCustomMapValue(encoder, value) + return encoder.Buffer() +} + +func writeCustomMapValue(writer msgpack.Write, value *CustomMapValue) { + writer.WriteMapLength(1) + writer.Context().Push("Foo", "string", "writing property") + writer.WriteString("Foo") + { + v := value.Foo + writer.WriteString(v) + } + writer.Context().Pop() +} + +func deserializeCustomMapValue(data []byte) *CustomMapValue { + ctx := msgpack.NewContext("Deserializing (decoding) env-type: CustomMapValue") + reader := msgpack.NewReadDecoder(ctx, data) + return readCustomMapValue(reader) +} + +func readCustomMapValue(reader msgpack.Read) *CustomMapValue { + var ( + _foo string + _fooSet bool + ) + + for i := int32(reader.ReadMapLength()); i > 0; i-- { + field := reader.ReadString() + reader.Context().Push(field, "unknown", "searching for property type") + switch field { + case "Foo": + reader.Context().Push(field, "string", "type found, reading property") + _foo = reader.ReadString() + _fooSet = true + reader.Context().Pop() + } + reader.Context().Pop() + } + + if !_fooSet { + panic(reader.Context().PrintWithContext("Missing required property: 'foo: String'")) + } + return &CustomMapValue{ + Foo: _foo, + } +} diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type.go index d2198e9826..129eedcb94 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type.go @@ -48,6 +48,7 @@ type CustomType struct { MapOfArr map[string][]int32 MapOfObj map[string]AnotherType MapOfArrOfObj map[string][]AnotherType + MapCustomValue map[string]*CustomMapValue } func CustomTypeToBuffer(value *CustomType) []byte { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go index 74d75efa54..743b468443 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go @@ -14,7 +14,7 @@ func serializeCustomType(value *CustomType) []byte { } func writeCustomType(writer msgpack.Write, value *CustomType) { - writer.WriteMapLength(41) + writer.WriteMapLength(42) writer.Context().Push("Str", "string", "writing property") writer.WriteString("Str") { @@ -554,6 +554,22 @@ func writeCustomType(writer msgpack.Write, value *CustomType) { } } writer.Context().Pop() + writer.Context().Push("MapCustomValue", "map[string]*CustomMapValue", "writing property") + writer.WriteString("MapCustomValue") + if value.MapCustomValue == nil { + writer.WriteNil() + } else if len(value.MapCustomValue) == 0 { + writer.WriteNil() + } else { + for i0 := range value.MapCustomValue { + writer.WriteString(i0) + { + v := value.MapCustomValue[i0] + CustomMapValueWrite(writer, v) + } + } + } + writer.Context().Pop() } func deserializeCustomType(data []byte) *CustomType { @@ -631,6 +647,8 @@ func readCustomType(reader msgpack.Read) *CustomType { _mapOfObjSet bool _mapOfArrOfObj map[string][]AnotherType _mapOfArrOfObjSet bool + _mapCustomValue map[string]*CustomMapValue + _mapCustomValueSet bool ) for i := int32(reader.ReadMapLength()); i > 0; i-- { @@ -1083,6 +1101,22 @@ func readCustomType(reader msgpack.Read) *CustomType { } _mapOfArrOfObjSet = true reader.Context().Pop() + case "MapCustomValue": + reader.Context().Push(field, "map[string]*CustomMapValue", "type found, reading property") + if reader.IsNil() { + _mapCustomValue = nil + } else { + ln0 := reader.ReadMapLength() + _mapCustomValue = make(map[string]*CustomMapValue) + for j0 := uint32(0); j0 < ln0; j0++ { + i0 := reader.ReadString() + if v := CustomMapValueRead(reader); v != nil { + _mapCustomValue[i0] = v + } + } + } + _mapCustomValueSet = true + reader.Context().Pop() } reader.Context().Pop() } @@ -1165,6 +1199,9 @@ func readCustomType(reader msgpack.Read) *CustomType { if !_mapOfArrOfObjSet { panic(reader.Context().PrintWithContext("Missing required property: 'mapOfArrOfObj: Map'")) } + if !_mapCustomValueSet { + panic(reader.Context().PrintWithContext("Missing required property: 'mapCustomValue: Map'")) + } return &CustomType{ Str: _str, OptStr: _optStr, @@ -1207,5 +1244,6 @@ func readCustomType(reader msgpack.Read) *CustomType { MapOfArr: _mapOfArr, MapOfObj: _mapOfObj, MapOfArrOfObj: _mapOfArrOfObj, + MapCustomValue: _mapCustomValue, } } diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse.go new file mode 100644 index 0000000000..3a1d9679c3 --- /dev/null +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse.go @@ -0,0 +1,25 @@ +package types + +import ( + "github.com/consideritdone/polywrap-go/polywrap/msgpack" +) + +type Else struct { + M_else string +} + +func ElseToBuffer(value *Else) []byte { + return serializeElse(value) +} + +func ElseFromBuffer(data []byte) *Else { + return deserializeElse(data) +} + +func ElseWrite(writer msgpack.Write, value *Else) { + writeElse(writer, value) +} + +func ElseRead(reader msgpack.Read) *Else { + return readElse(reader) +} diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse_serialization.go new file mode 100644 index 0000000000..5aa212aca2 --- /dev/null +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse_serialization.go @@ -0,0 +1,56 @@ +package types + +import ( + "github.com/consideritdone/polywrap-go/polywrap/msgpack" +) + +func serializeElse(value *Else) []byte { + ctx := msgpack.NewContext("Serializing (encoding) env-type: Else") + encoder := msgpack.NewWriteEncoder(ctx) + writeElse(encoder, value) + return encoder.Buffer() +} + +func writeElse(writer msgpack.Write, value *Else) { + writer.WriteMapLength(1) + writer.Context().Push("M_else", "string", "writing property") + writer.WriteString("M_else") + { + v := value.M_else + writer.WriteString(v) + } + writer.Context().Pop() +} + +func deserializeElse(data []byte) *Else { + ctx := msgpack.NewContext("Deserializing (decoding) env-type: Else") + reader := msgpack.NewReadDecoder(ctx, data) + return readElse(reader) +} + +func readElse(reader msgpack.Read) *Else { + var ( + _else string + _elseSet bool + ) + + for i := int32(reader.ReadMapLength()); i > 0; i-- { + field := reader.ReadString() + reader.Context().Push(field, "unknown", "searching for property type") + switch field { + case "M_else": + reader.Context().Push(field, "string", "type found, reading property") + _else = reader.ReadString() + _elseSet = true + reader.Context().Pop() + } + reader.Context().Pop() + } + + if !_elseSet { + panic(reader.Context().PrintWithContext("Missing required property: 'else: String'")) + } + return &Else{ + M_else: _else, + } +} From a34daeb761a8d7c6a4b5bfc9018a353a6aabac9c Mon Sep 17 00:00:00 2001 From: n0cte Date: Wed, 24 Aug 2022 14:16:52 +0300 Subject: [PATCH 12/65] add golang package injection --- packages/schema/bind/src/bindings/golang/wasm/index.ts | 3 ++- .../templates/imported/module-type/%type%Wrapped-go.mustache | 1 - .../wasm/templates/module-type/%type%Wrapped-go.mustache | 2 +- .../imported/test_import/test_import__module_wrapped.go | 1 - .../cases/bind/sanity/output/wasm-go/types/module_wrapped.go | 2 +- 5 files changed, 4 insertions(+), 5 deletions(-) diff --git a/packages/schema/bind/src/bindings/golang/wasm/index.ts b/packages/schema/bind/src/bindings/golang/wasm/index.ts index d1a7a96300..44a6c56acc 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/index.ts +++ b/packages/schema/bind/src/bindings/golang/wasm/index.ts @@ -36,6 +36,7 @@ export const generateBinding: GenerateBindingFn = ( }; const output = result.output; const abi = applyTransforms(options.abi); + const goImport = "github.com/testorg/testrepo"; // Generate object type folders if (abi.objectTypes) { @@ -148,7 +149,7 @@ export const generateBinding: GenerateBindingFn = ( name: "types", data: renderTemplates( templatePath("module-type"), - abi.moduleType, + { goImport, ...abi.moduleType }, subTemplates ), }); diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Wrapped-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Wrapped-go.mustache index 1340695e91..74b5f3e794 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Wrapped-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Wrapped-go.mustache @@ -3,7 +3,6 @@ package {{#toSnakeCase}}{{namespace}}{{/toSnakeCase}} {{#methods.length}} import ( "github.com/consideritdone/polywrap-go/polywrap" - "some/library/to/methods" ) {{/methods.length}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/%type%Wrapped-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/%type%Wrapped-go.mustache index 3941f19b41..1d85289bdc 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/%type%Wrapped-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/%type%Wrapped-go.mustache @@ -3,7 +3,7 @@ package types {{#methods.length}} import ( "github.com/consideritdone/polywrap-go/polywrap" - "some/library/to/methods" + methods "{{goImport}}" ) {{/methods.length}} diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_wrapped.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_wrapped.go index 9b45b19f55..9273cd4e30 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_wrapped.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_wrapped.go @@ -2,7 +2,6 @@ package test_import import ( "github.com/consideritdone/polywrap-go/polywrap" - "some/library/to/methods" ) func MethodImportedMethod(uri string, args *ArgsImportedMethod) (*TestImport_Object, error) { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_wrapped.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_wrapped.go index 089b9e3704..4a0fd678b3 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_wrapped.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_wrapped.go @@ -2,7 +2,7 @@ package types import ( "github.com/consideritdone/polywrap-go/polywrap" - "some/library/to/methods" + methods "github.com/testorg/testrepo" ) func ModuleMethodWrapped(argsBuf []byte, envSize uint32) []byte { From 91ce0a8d4c30f4a02ccba1d7c8edbb68c2ea9178 Mon Sep 17 00:00:00 2001 From: ramil Date: Tue, 23 Aug 2022 17:53:29 +0300 Subject: [PATCH 13/65] remove debug --- packages/schema/bind/src/__tests__/index.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/schema/bind/src/__tests__/index.ts b/packages/schema/bind/src/__tests__/index.ts index efe0d6ff43..1fd3557924 100644 --- a/packages/schema/bind/src/__tests__/index.ts +++ b/packages/schema/bind/src/__tests__/index.ts @@ -64,7 +64,6 @@ export function fetchTestCases(): TestCases { const outputLanguages = fs .readdirSync(outputDir, { withFileTypes: true }) .filter((item: fs.Dirent) => item.isDirectory()) - .filter((item: fs.Dirent) => item.name == "wasm-go") .map((item: fs.Dirent) => { return { language: item.name, From e2506a8f4ecdbdbe849b7e6f57634d4530be4f6d Mon Sep 17 00:00:00 2001 From: ramil Date: Wed, 24 Aug 2022 18:15:30 +0300 Subject: [PATCH 14/65] add compiler options override for Golang --- packages/cli/lang/en.json | 4 +- packages/cli/lang/es.json | 4 +- .../build-images/wasm/golang/index.ts | 43 +++++++++++++++++++ .../cli/src/lib/project/PolywrapProject.ts | 4 +- packages/cli/src/lib/project/Project.ts | 3 +- .../project/manifests/polywrap/languages.ts | 3 ++ 6 files changed, 57 insertions(+), 4 deletions(-) create mode 100644 packages/cli/src/lib/defaults/build-images/wasm/golang/index.ts diff --git a/packages/cli/lang/en.json b/packages/cli/lang/en.json index 82fd6532eb..479ee7250d 100644 --- a/packages/cli/lang/en.json +++ b/packages/cli/lang/en.json @@ -4,6 +4,7 @@ "commands_build_description": "Builds a wrapper", "commands_build_error_manifestPathMissing": "{option} option missing {argument} argument", "commands_build_error_manifestNotFound": "Manifest not found. Search paths used: {paths}", + "commands_build_error_goModNotFound": "go.mod file not found. Search paths used: {paths}", "commands_build_error_outputDirMissingPath": "{option} option missing {argument} argument", "commands_build_keypressListener_exit": "Exit: [CTRL + C], [ESC], or [Q]", "commands_build_keypressListener_watching": "Watching", @@ -279,6 +280,7 @@ "lib_typescript_tsNodeNotInstalled": "Your project uses typescript, but ts-node is not installed", "lib_watcher_alreadyWatching": "Watcher session is already in progress. Directory: {dir}", "lib_wasm_rust_invalidModule": "Module paths must point to Cargo.toml files. Found: {path}", + "lib_wasm_golang_invalidModule": "Module paths must point to go.mod file. Found: {path}", "lib_docker_invalidImageId": "Invalid docker image ID returned: {imageId}", "lib_docker_noInstall": "Docker executable not found in PATH", "lib_infra_unrecognizedModule": "Unrecognized modules: {modules}. Default modules: {defaultModules}", @@ -286,4 +288,4 @@ "lib_helpers_wrap_manifest_outputText": "WRAP manifest written in {path}", "lib_helpers_wrap_manifest_outputError": "Error writing WRAP manifest in {path}", "lib_helpers_wrap_manifest_outputWarning": "Warning writing WRAP manifest in {path}" -} \ No newline at end of file +} diff --git a/packages/cli/lang/es.json b/packages/cli/lang/es.json index 71a843e9b5..04a8edde74 100644 --- a/packages/cli/lang/es.json +++ b/packages/cli/lang/es.json @@ -4,6 +4,7 @@ "commands_build_description": "Builds a wrapper", "commands_build_error_manifestPathMissing": "{option} option missing {argument} argument", "commands_build_error_manifestNotFound": "Manifest not found. Search paths used: {paths}", + "commands_build_error_goModNotFound": "go.mod file not found. Search paths used: {paths}", "commands_build_error_outputDirMissingPath": "{option} option missing {argument} argument", "commands_build_keypressListener_exit": "Exit: [CTRL + C], [ESC], or [Q]", "commands_build_keypressListener_watching": "Watching", @@ -279,6 +280,7 @@ "lib_typescript_tsNodeNotInstalled": "Your project uses typescript, but ts-node is not installed", "lib_watcher_alreadyWatching": "Watcher session is already in progress. Directory: {dir}", "lib_wasm_rust_invalidModule": "Module paths must point to Cargo.toml files. Found: {path}", + "lib_wasm_golang_invalidModule": "Module paths must point to go.mod file. Found: {path}", "lib_docker_invalidImageId": "Invalid docker image ID returned: {imageId}", "lib_docker_noInstall": "Docker executable not found in PATH", "lib_infra_unrecognizedModule": "Unrecognized modules: {modules}. Default modules: {defaultModules}", @@ -286,4 +288,4 @@ "lib_helpers_wrap_manifest_outputText": "WRAP manifest written in {path}", "lib_helpers_wrap_manifest_outputError": "Error writing WRAP manifest in {path}", "lib_helpers_wrap_manifest_outputWarning": "Warning writing WRAP manifest in {path}" -} \ No newline at end of file +} diff --git a/packages/cli/src/lib/defaults/build-images/wasm/golang/index.ts b/packages/cli/src/lib/defaults/build-images/wasm/golang/index.ts new file mode 100644 index 0000000000..c10376bbd2 --- /dev/null +++ b/packages/cli/src/lib/defaults/build-images/wasm/golang/index.ts @@ -0,0 +1,43 @@ +import { CompilerOverrides } from "../../../../Compiler"; +import { intlMsg } from "../../../../intl"; +import { resolvePathIfExists } from "../../../../system"; + +import { PolywrapManifest } from "@polywrap/polywrap-manifest-types-js"; + +/** go.mod + * module bla-bla + */ +export function getCompilerOverrides(): CompilerOverrides { + let golangModuleName = ""; + return { + validateManifest: (manifest: PolywrapManifest) => { + const module = manifest.source.module; + + if (!module || module.indexOf("go.mod") === -1) { + throw Error( + intlMsg.lib_wasm_golang_invalidModule({ path: module as string }) + ); + } + const goModPaths = [module as string]; + const goModFile = resolvePathIfExists(goModPaths); + if (!goModFile) { + throw Error( + intlMsg.commands_build_error_goModNotFound({ + paths: module as string, + }) + ); + } + + // file open + // file parse + const value = "github.com/consideritdone/testproject"; + golangModuleName = value; + }, + getCompilerOptions: (): Record => { + return { + golangModuleName, + }; + }, + generationSubPath: "wrap", + }; +} diff --git a/packages/cli/src/lib/project/PolywrapProject.ts b/packages/cli/src/lib/project/PolywrapProject.ts index ddddb4e71b..5d57365746 100644 --- a/packages/cli/src/lib/project/PolywrapProject.ts +++ b/packages/cli/src/lib/project/PolywrapProject.ts @@ -144,7 +144,8 @@ export class PolywrapProject extends Project { public async generateSchemaBindings( abi: WrapAbi, - generationSubPath?: string + generationSubPath?: string, + bindConfig?: Record ): Promise { const manifest = await this.getManifest(); const module = manifest.source.module as string; @@ -165,6 +166,7 @@ export class PolywrapProject extends Project { abi, outputDirAbs: moduleDirectory, bindLanguage, + config: bindConfig, }; return bindSchema(options); diff --git a/packages/cli/src/lib/project/Project.ts b/packages/cli/src/lib/project/Project.ts index 3c47c1c170..4985f31f05 100644 --- a/packages/cli/src/lib/project/Project.ts +++ b/packages/cli/src/lib/project/Project.ts @@ -67,7 +67,8 @@ export abstract class Project { public abstract generateSchemaBindings( abi: Abi, - generationSubPath?: string + generationSubPath?: string, + bindConfig?: Record ): Promise; public get quiet(): boolean { diff --git a/packages/cli/src/lib/project/manifests/polywrap/languages.ts b/packages/cli/src/lib/project/manifests/polywrap/languages.ts index e5b4a9fe64..ab23979fd6 100644 --- a/packages/cli/src/lib/project/manifests/polywrap/languages.ts +++ b/packages/cli/src/lib/project/manifests/polywrap/languages.ts @@ -5,6 +5,7 @@ import { BindLanguage } from "@polywrap/schema-bind"; export const polywrapManifestLanguages = { "wasm/assemblyscript": "wasm/assemblyscript", "wasm/rust": "wasm/rust", + "wasm/golang": "wasm/golang", interface: "interface", }; @@ -26,6 +27,8 @@ export function polywrapManifestLanguageToBindLanguage( return "wasm-as"; case "wasm/rust": return "wasm-rs"; + case "wasm/golang": + return "wasm-go"; case "interface": throw Error(intlMsg.lib_language_noInterfaceCodegen()); default: From b29151f2967fb0904bcf880b670ae6aa8f249f40 Mon Sep 17 00:00:00 2001 From: ramil Date: Wed, 24 Aug 2022 18:21:45 +0300 Subject: [PATCH 15/65] add compiler options override for Golang --- packages/cli/src/lib/Compiler.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/cli/src/lib/Compiler.ts b/packages/cli/src/lib/Compiler.ts index 90dcfc8e04..97ac14c49b 100644 --- a/packages/cli/src/lib/Compiler.ts +++ b/packages/cli/src/lib/Compiler.ts @@ -36,6 +36,7 @@ interface CompilerState { export interface CompilerOverrides { validateManifest: (manifest: PolywrapManifest) => void; generationSubPath: string; + getCompilerOptions: () => Record; } export interface CompilerConfig { @@ -214,7 +215,8 @@ export class Compiler { // Generate the bindings const binding = await project.generateSchemaBindings( abi, - compilerOverrides?.generationSubPath + compilerOverrides?.generationSubPath, + compilerOverrides?.getCompilerOptions() ); // Output the bindings From 81dae40db74f864b8803ca785fa97f965ccf82a5 Mon Sep 17 00:00:00 2001 From: ramil Date: Wed, 24 Aug 2022 20:07:18 +0300 Subject: [PATCH 16/65] fix build for rust fix unit tests for golang wasm --- .../lib/defaults/build-images/wasm/rust/index.ts | 3 +++ .../schema/bind/src/__tests__/test-cases.spec.ts | 15 ++++++++++++--- .../schema/bind/src/bindings/golang/wasm/index.ts | 6 ++++-- .../golang/wasm/templates/main-go.mustache | 4 ++-- .../cases/bind/sanity/output/wasm-go/main.go | 10 +++++----- 5 files changed, 26 insertions(+), 12 deletions(-) diff --git a/packages/cli/src/lib/defaults/build-images/wasm/rust/index.ts b/packages/cli/src/lib/defaults/build-images/wasm/rust/index.ts index 76a98ca4af..71bcd78b74 100644 --- a/packages/cli/src/lib/defaults/build-images/wasm/rust/index.ts +++ b/packages/cli/src/lib/defaults/build-images/wasm/rust/index.ts @@ -12,6 +12,9 @@ export function getCompilerOverrides(): CompilerOverrides { throw Error(intlMsg.lib_wasm_rust_invalidModule({ path: module })); } }, + getCompilerOptions(): Record { + return {}; + }, generationSubPath: "src/wrap", }; } diff --git a/packages/schema/bind/src/__tests__/test-cases.spec.ts b/packages/schema/bind/src/__tests__/test-cases.spec.ts index 9617eb6587..722590bdf9 100644 --- a/packages/schema/bind/src/__tests__/test-cases.spec.ts +++ b/packages/schema/bind/src/__tests__/test-cases.spec.ts @@ -2,7 +2,7 @@ import { fetchTestCases } from "./index"; import { bindSchema, BindLanguage, - BindOutput + BindOutput, BindOptions } from "../"; import { @@ -37,10 +37,19 @@ describe("Polywrap Binding Test Suite", () => { outputDirAbs: testCase.input.outputDirAbs, }; - const output = bindSchema({ + const bindOptions: BindOptions = { ...testCase.input, bindLanguage: language as BindLanguage, - }); + }; + + if (language == "wasm-go") { + if (!bindOptions.config) { + bindOptions.config = {}; + } + bindOptions.config.golangModuleName = "github.com/testorg/testrepo"; + } + + const output = bindSchema(bindOptions); const sort = (array: OutputEntry[]): OutputEntry[] => { array.forEach((entry) => { diff --git a/packages/schema/bind/src/bindings/golang/wasm/index.ts b/packages/schema/bind/src/bindings/golang/wasm/index.ts index 44a6c56acc..78f3307e0a 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/index.ts +++ b/packages/schema/bind/src/bindings/golang/wasm/index.ts @@ -36,7 +36,7 @@ export const generateBinding: GenerateBindingFn = ( }; const output = result.output; const abi = applyTransforms(options.abi); - const goImport = "github.com/testorg/testrepo"; + const goImport = options.config?.golangModuleName; // Generate object type folders if (abi.objectTypes) { @@ -184,7 +184,9 @@ export const generateBinding: GenerateBindingFn = ( } // Generate root entry file - output.entries.push(...renderTemplates(templatePath(""), abi, subTemplates)); + output.entries.push( + ...renderTemplates(templatePath(""), { goImport, ...abi }, subTemplates) + ); output.entries = mergePaths(output.entries); return result; diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/main-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/main-go.mustache index 9e70cc5fbd..a9a4eeeecd 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/main-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/main-go.mustache @@ -1,7 +1,7 @@ package main import ( - "github.com/consideritdone/polywrap-go/examples/demo1/wrap/module" + "{{goImport}}/wrap/types" "github.com/consideritdone/polywrap-go/polywrap" ) @@ -12,7 +12,7 @@ func _wrap_invoke(methodSize, argsSize, envSize uint32) bool { {{#moduleType}} {{#methods}} case "{{name}}": - return polywrap.WrapInvoke(args, envSize, module.{{#toUpper}}{{name}}{{/toUpper}}Wrapped) + return polywrap.WrapInvoke(args, envSize, types.{{#toUpper}}{{name}}{{/toUpper}}Wrapped) {{/methods}} {{/moduleType}} default: diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go index c3782bf700..c58ac39081 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go @@ -1,7 +1,7 @@ package main import ( - "github.com/consideritdone/polywrap-go/examples/demo1/wrap/module" + "github.com/testorg/testrepo/wrap/types" "github.com/consideritdone/polywrap-go/polywrap" ) @@ -10,13 +10,13 @@ func _wrap_invoke(methodSize, argsSize, envSize uint32) bool { args := polywrap.WrapInvokeArgs(methodSize, argsSize) switch args.Method { case "moduleMethod": - return polywrap.WrapInvoke(args, envSize, module.ModuleMethodWrapped) + return polywrap.WrapInvoke(args, envSize, types.ModuleMethodWrapped) case "objectMethod": - return polywrap.WrapInvoke(args, envSize, module.ObjectMethodWrapped) + return polywrap.WrapInvoke(args, envSize, types.ObjectMethodWrapped) case "optionalEnvMethod": - return polywrap.WrapInvoke(args, envSize, module.OptionalEnvMethodWrapped) + return polywrap.WrapInvoke(args, envSize, types.OptionalEnvMethodWrapped) case "if": - return polywrap.WrapInvoke(args, envSize, module.IfWrapped) + return polywrap.WrapInvoke(args, envSize, types.IfWrapped) default: return polywrap.WrapInvoke(args, envSize, nil) } From 2586cc4bc00c77ea0fb4e7f873bd734ebc8fe17d Mon Sep 17 00:00:00 2001 From: n0cte Date: Wed, 24 Aug 2022 21:31:58 +0300 Subject: [PATCH 17/65] move env variable to desired section --- .../golang/wasm/templates/module-type/%type%Wrapped-go.mustache | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/%type%Wrapped-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/%type%Wrapped-go.mustache index 1d85289bdc..26b51462dc 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/%type%Wrapped-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/%type%Wrapped-go.mustache @@ -9,8 +9,8 @@ import ( {{#methods}} func {{#toUpper}}{{name}}{{/toUpper}}Wrapped(argsBuf []byte, envSize uint32) []byte { - var env *Env {{#env}} + var env *Env {{#required}} if envSize == 0 { panic("Environment is not set, and it is required by method 'objectMethod'") From 43755c7e4381be5acbeb39c159453cdf6ff97bfb Mon Sep 17 00:00:00 2001 From: n0cte Date: Wed, 24 Aug 2022 21:33:03 +0300 Subject: [PATCH 18/65] allow go-package allocation in imports --- packages/schema/bind/src/bindings/golang/functions.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/packages/schema/bind/src/bindings/golang/functions.ts b/packages/schema/bind/src/bindings/golang/functions.ts index 2590d0b782..c111697c57 100644 --- a/packages/schema/bind/src/bindings/golang/functions.ts +++ b/packages/schema/bind/src/bindings/golang/functions.ts @@ -99,6 +99,12 @@ export const makeImports: MustacheFn = () => { return (text: string, render: (template: string) => string): string => { const types = render(text).split(","); const exist: { [key: string]: boolean } = {}; + const pattern = new RegExp('^(https?:\\/\\/)?'+ // protocol + '((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|'+ // domain name + '((\\d{1,3}\\.){3}\\d{1,3}))'+ // OR ip (v4) address + '(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*'+ // port and path + '(\\?[;&a-z\\d%_.~+=-]*)?'+ // query string + '(\\#[-a-z\\d_]*)?$','i'); for (const t of types) { switch (t) { case "*big.Int": @@ -109,6 +115,11 @@ export const makeImports: MustacheFn = () => { case "*fastjson.Value": exist["github.com/valyala/fastjson"] = true; break; + default: + if (pattern.test(t)) { + exist[t] = true; + } + break; } } const imports: Array = [ From a3f884705cc6c8cae7c15e788625f89784ff1894 Mon Sep 17 00:00:00 2001 From: n0cte Date: Wed, 24 Aug 2022 21:33:39 +0300 Subject: [PATCH 19/65] custom types must be capitalized --- packages/schema/bind/src/bindings/golang/functions.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/schema/bind/src/bindings/golang/functions.ts b/packages/schema/bind/src/bindings/golang/functions.ts index c111697c57..553d0e24c0 100644 --- a/packages/schema/bind/src/bindings/golang/functions.ts +++ b/packages/schema/bind/src/bindings/golang/functions.ts @@ -291,7 +291,7 @@ export const toWasm: MustacheFn = () => { type = `${type.replace("Enum_", "")}`; isEnum = true; } else { - type = `${type}`; + type = type.charAt(0).toUpperCase() + type.slice(1); } } From 095377b1f1db45b77767a495bcf8d19d71c456d2 Mon Sep 17 00:00:00 2001 From: n0cte Date: Wed, 24 Aug 2022 22:04:39 +0300 Subject: [PATCH 20/65] add mustache fn for checking scalar prefix --- .../bind/src/bindings/golang/functions.ts | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/packages/schema/bind/src/bindings/golang/functions.ts b/packages/schema/bind/src/bindings/golang/functions.ts index 553d0e24c0..bbdf53240f 100644 --- a/packages/schema/bind/src/bindings/golang/functions.ts +++ b/packages/schema/bind/src/bindings/golang/functions.ts @@ -217,6 +217,35 @@ export const toMsgPack: MustacheFn = () => { }; }; +export const typeable: MustacheFn = () => { + return (value: string, render: (template: string) => string) => { + let type = render(value); + switch (type) { + case "int8": + case "int16": + case "int32": + case "int64": + case "uint32": + case "uint8": + case "uint16": + case "uint32": + case "uint64": + case "string": + case "bool": + case "[]byte": + case "*big.Int": + case "*big.Int": + case "*fastjson.Value": + return type; + default: + if (type.startsWith("*")) { + return `*types.${type.slice(1)}`; + } + return `types.${type}`; + } + } +} + export const toWasm: MustacheFn = () => { return (value: string, render: (template: string) => string) => { let type = render(value); From cf49e7b137bd75cfcca5ec0ac011791fd18655f6 Mon Sep 17 00:00:00 2001 From: n0cte Date: Wed, 24 Aug 2022 22:37:17 +0300 Subject: [PATCH 21/65] split the module into two packages --- .../bind/src/bindings/golang/wasm/index.ts | 11 ++- .../golang/wasm/templates/main-go.mustache | 4 +- .../%type%Serialization-go.mustache | 20 ++--- .../{ => module}/%type%Wrapped-go.mustache | 2 +- .../module-type/types/%type%Args-go.mustache | 16 ++++ .../templates/value_serialize_object.mustache | 4 +- .../cases/bind/sanity/output/wasm-go/main.go | 10 +-- .../{types => module}/module_serialization.go | 74 ++++++------------- .../{types => module}/module_wrapped.go | 4 +- .../output/wasm-go/types/module_args.go | 36 +++++++++ 10 files changed, 101 insertions(+), 80 deletions(-) rename packages/schema/bind/src/bindings/golang/wasm/templates/module-type/{ => module}/%type%Serialization-go.mustache (81%) rename packages/schema/bind/src/bindings/golang/wasm/templates/module-type/{ => module}/%type%Wrapped-go.mustache (98%) create mode 100644 packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache rename packages/test-cases/cases/bind/sanity/output/wasm-go/{types => module}/module_serialization.go (87%) rename packages/test-cases/cases/bind/sanity/output/wasm-go/{types => module}/module_wrapped.go (96%) create mode 100644 packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_args.go diff --git a/packages/schema/bind/src/bindings/golang/wasm/index.ts b/packages/schema/bind/src/bindings/golang/wasm/index.ts index 78f3307e0a..3102d038b3 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/index.ts +++ b/packages/schema/bind/src/bindings/golang/wasm/index.ts @@ -148,7 +148,16 @@ export const generateBinding: GenerateBindingFn = ( type: "Directory", name: "types", data: renderTemplates( - templatePath("module-type"), + templatePath("module-type/types"), + { goImport, ...abi.moduleType }, + subTemplates + ), + }); + output.entries.push({ + type: "Directory", + name: "module", + data: renderTemplates( + templatePath("module-type/module"), { goImport, ...abi.moduleType }, subTemplates ), diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/main-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/main-go.mustache index a9a4eeeecd..6a3450710c 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/main-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/main-go.mustache @@ -1,7 +1,7 @@ package main import ( - "{{goImport}}/wrap/types" + "{{goImport}}/wrap/module" "github.com/consideritdone/polywrap-go/polywrap" ) @@ -12,7 +12,7 @@ func _wrap_invoke(methodSize, argsSize, envSize uint32) bool { {{#moduleType}} {{#methods}} case "{{name}}": - return polywrap.WrapInvoke(args, envSize, types.{{#toUpper}}{{name}}{{/toUpper}}Wrapped) + return polywrap.WrapInvoke(args, envSize, module.{{#toUpper}}{{name}}{{/toUpper}}Wrapped) {{/methods}} {{/moduleType}} default: diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Serialization-go.mustache similarity index 81% rename from packages/schema/bind/src/bindings/golang/wasm/templates/module-type/%type%Serialization-go.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Serialization-go.mustache index 292aa1978d..2da6b2f512 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Serialization-go.mustache @@ -1,17 +1,9 @@ -package types +package module -{{#makeImports}}{{#arguments}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/arguments}}{{/makeImports}} +{{#makeImports}}{{goImport}}/wrap/types,{{#arguments}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/arguments}}{{/makeImports}} {{#methods}} -type Args{{#toUpper}}{{name}}{{/toUpper}} struct { -{{#stuctProps}} -{{#arguments}} -{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} -{{/arguments}} -{{/stuctProps}} -} - -func Deserialize{{#toUpper}}{{name}}{{/toUpper}}Args(argsBuf []byte) *Args{{#toUpper}}{{name}}{{/toUpper}} { +func Deserialize{{#toUpper}}{{name}}{{/toUpper}}Args(argsBuf []byte) *types.Args{{#toUpper}}{{name}}{{/toUpper}} { ctx := msgpack.NewContext("Deserializing module-type: {{#toUpper}}{{name}}{{/toUpper}}") {{#arguments.length}} reader := msgpack.NewReadDecoder(ctx, argsBuf) @@ -71,7 +63,7 @@ func Deserialize{{#toUpper}}{{name}}{{/toUpper}}Args(argsBuf []byte) *Args{{#toU {{/arguments}} {{/arguments.length}} - return &Args{{#toUpper}}{{name}}{{/toUpper}}{ + return &types.Args{{#toUpper}}{{name}}{{/toUpper}}{ {{#stuctProps}} {{#arguments}} {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}: _{{name}}, @@ -80,14 +72,14 @@ func Deserialize{{#toUpper}}{{name}}{{/toUpper}}Args(argsBuf []byte) *Args{{#toU } } -func Serialize{{#toUpper}}{{name}}{{/toUpper}}Result(value {{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}) []byte { +func Serialize{{#toUpper}}{{name}}{{/toUpper}}Result(value {{#return}}{{#typeable}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/typeable}}{{/return}}) []byte { ctx := msgpack.NewContext("Serializing module-type: {{#toUpper}}{{name}}{{/toUpper}}") encoder := msgpack.NewWriteEncoder(ctx) Write{{#toUpper}}{{name}}{{/toUpper}}Result(encoder, value); return encoder.Buffer() } -func Write{{#toUpper}}{{name}}{{/toUpper}}Result(writer msgpack.Write, value {{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}) { +func Write{{#toUpper}}{{name}}{{/toUpper}}Result(writer msgpack.Write, value {{#return}}{{#typeable}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/typeable}}{{/return}}) { {{#return}} writer.Context().Push("{{name}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") {{#scalar}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/%type%Wrapped-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Wrapped-go.mustache similarity index 98% rename from packages/schema/bind/src/bindings/golang/wasm/templates/module-type/%type%Wrapped-go.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Wrapped-go.mustache index 26b51462dc..737b7ea2ab 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/%type%Wrapped-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Wrapped-go.mustache @@ -1,4 +1,4 @@ -package types +package module {{#methods.length}} import ( diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache new file mode 100644 index 0000000000..8e777aaa0e --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache @@ -0,0 +1,16 @@ +package types + +{{#makeImports}}{{#arguments}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/arguments}}{{/makeImports}} + +{{#methods}} +type Args{{#toUpper}}{{name}}{{/toUpper}} struct { +{{#stuctProps}} +{{#arguments}} +{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} +{{/arguments}} +{{/stuctProps}} +} +{{^last}} + +{{/last}} +{{/methods}} \ No newline at end of file diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/value_serialize_object.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/value_serialize_object.mustache index 3b6ae4d7c6..b01650869d 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/value_serialize_object.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/value_serialize_object.mustache @@ -1,9 +1,9 @@ { v := value{{#lastFullIter}}i{{/lastFullIter}} {{#required}} - {{#toUpper}}{{type}}{{/toUpper}}Write(writer, &v) + types.{{#toUpper}}{{type}}{{/toUpper}}Write(writer, &v) {{/required}} {{^required}} - {{#toUpper}}{{type}}{{/toUpper}}Write(writer, v) + types.{{#toUpper}}{{type}}{{/toUpper}}Write(writer, v) {{/required}} } diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go index c58ac39081..605398790b 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go @@ -1,7 +1,7 @@ package main import ( - "github.com/testorg/testrepo/wrap/types" + "github.com/testorg/testrepo/wrap/module" "github.com/consideritdone/polywrap-go/polywrap" ) @@ -10,13 +10,13 @@ func _wrap_invoke(methodSize, argsSize, envSize uint32) bool { args := polywrap.WrapInvokeArgs(methodSize, argsSize) switch args.Method { case "moduleMethod": - return polywrap.WrapInvoke(args, envSize, types.ModuleMethodWrapped) + return polywrap.WrapInvoke(args, envSize, module.ModuleMethodWrapped) case "objectMethod": - return polywrap.WrapInvoke(args, envSize, types.ObjectMethodWrapped) + return polywrap.WrapInvoke(args, envSize, module.ObjectMethodWrapped) case "optionalEnvMethod": - return polywrap.WrapInvoke(args, envSize, types.OptionalEnvMethodWrapped) + return polywrap.WrapInvoke(args, envSize, module.OptionalEnvMethodWrapped) case "if": - return polywrap.WrapInvoke(args, envSize, types.IfWrapped) + return polywrap.WrapInvoke(args, envSize, module.IfWrapped) default: return polywrap.WrapInvoke(args, envSize, nil) } diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_serialization.go similarity index 87% rename from packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_serialization.go rename to packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_serialization.go index c59b6436ef..b076f507c3 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_serialization.go @@ -1,23 +1,11 @@ -package types +package module import ( "github.com/consideritdone/polywrap-go/polywrap/msgpack" + "github.com/testorg/testrepo/wrap/types" ) -type ArgsModuleMethod struct { - Str string - OptStr *string - En CustomEnum - OptEnum *CustomEnum - EnumArray []CustomEnum - OptEnumArray []*CustomEnum - Map map[string]int32 - MapOfArr map[string][]int32 - MapOfObj map[string]AnotherType - MapOfArrOfObj map[string][]AnotherType -} - -func DeserializeModuleMethodArgs(argsBuf []byte) *ArgsModuleMethod { +func DeserializeModuleMethodArgs(argsBuf []byte) *types.ArgsModuleMethod { ctx := msgpack.NewContext("Deserializing module-type: ModuleMethod") reader := msgpack.NewReadDecoder(ctx, argsBuf) @@ -203,7 +191,7 @@ func DeserializeModuleMethodArgs(argsBuf []byte) *ArgsModuleMethod { panic(reader.Context().PrintWithContext("Missing required property: 'mapOfArrOfObj: Map'")) } - return &ArgsModuleMethod{ + return &types.ArgsModuleMethod{ Str: _str, OptStr: _optStr, En: _en, @@ -233,14 +221,7 @@ func WriteModuleMethodResult(writer msgpack.Write, value int32) { writer.Context().Pop() } -type ArgsObjectMethod struct { - Object AnotherType - OptObject *AnotherType - ObjectArray []AnotherType - OptObjectArray []*AnotherType -} - -func DeserializeObjectMethodArgs(argsBuf []byte) *ArgsObjectMethod { +func DeserializeObjectMethodArgs(argsBuf []byte) *types.ArgsObjectMethod { ctx := msgpack.NewContext("Deserializing module-type: ObjectMethod") reader := msgpack.NewReadDecoder(ctx, argsBuf) @@ -310,7 +291,7 @@ func DeserializeObjectMethodArgs(argsBuf []byte) *ArgsObjectMethod { panic(reader.Context().PrintWithContext("Missing required property: 'objectArray: [AnotherType]'")) } - return &ArgsObjectMethod{ + return &types.ArgsObjectMethod{ Object: _object, OptObject: _optObject, ObjectArray: _objectArray, @@ -318,30 +299,23 @@ func DeserializeObjectMethodArgs(argsBuf []byte) *ArgsObjectMethod { } } -func SerializeObjectMethodResult(value *AnotherType) []byte { +func SerializeObjectMethodResult(value *types.AnotherType) []byte { ctx := msgpack.NewContext("Serializing module-type: ObjectMethod") encoder := msgpack.NewWriteEncoder(ctx) WriteObjectMethodResult(encoder, value); return encoder.Buffer() } -func WriteObjectMethodResult(writer msgpack.Write, value *AnotherType) { +func WriteObjectMethodResult(writer msgpack.Write, value *types.AnotherType) { writer.Context().Push("objectMethod", "*AnotherType", "writing property") { v := value - AnotherTypeWrite(writer, v) + types.AnotherTypeWrite(writer, v) } writer.Context().Pop() } -type ArgsOptionalEnvMethod struct { - Object AnotherType - OptObject *AnotherType - ObjectArray []AnotherType - OptObjectArray []*AnotherType -} - -func DeserializeOptionalEnvMethodArgs(argsBuf []byte) *ArgsOptionalEnvMethod { +func DeserializeOptionalEnvMethodArgs(argsBuf []byte) *types.ArgsOptionalEnvMethod { ctx := msgpack.NewContext("Deserializing module-type: OptionalEnvMethod") reader := msgpack.NewReadDecoder(ctx, argsBuf) @@ -411,7 +385,7 @@ func DeserializeOptionalEnvMethodArgs(argsBuf []byte) *ArgsOptionalEnvMethod { panic(reader.Context().PrintWithContext("Missing required property: 'objectArray: [AnotherType]'")) } - return &ArgsOptionalEnvMethod{ + return &types.ArgsOptionalEnvMethod{ Object: _object, OptObject: _optObject, ObjectArray: _objectArray, @@ -419,32 +393,28 @@ func DeserializeOptionalEnvMethodArgs(argsBuf []byte) *ArgsOptionalEnvMethod { } } -func SerializeOptionalEnvMethodResult(value *AnotherType) []byte { +func SerializeOptionalEnvMethodResult(value *types.AnotherType) []byte { ctx := msgpack.NewContext("Serializing module-type: OptionalEnvMethod") encoder := msgpack.NewWriteEncoder(ctx) WriteOptionalEnvMethodResult(encoder, value); return encoder.Buffer() } -func WriteOptionalEnvMethodResult(writer msgpack.Write, value *AnotherType) { +func WriteOptionalEnvMethodResult(writer msgpack.Write, value *types.AnotherType) { writer.Context().Push("optionalEnvMethod", "*AnotherType", "writing property") { v := value - AnotherTypeWrite(writer, v) + types.AnotherTypeWrite(writer, v) } writer.Context().Pop() } -type ArgsIf struct { - M_if else -} - -func DeserializeIfArgs(argsBuf []byte) *ArgsIf { +func DeserializeIfArgs(argsBuf []byte) *types.ArgsIf { ctx := msgpack.NewContext("Deserializing module-type: If") reader := msgpack.NewReadDecoder(ctx, argsBuf) var ( - _if else + _if Else _ifSet bool ) @@ -454,7 +424,7 @@ func DeserializeIfArgs(argsBuf []byte) *ArgsIf { reader.Context().Pop() switch field { case "M_if": - reader.Context().Push(field, "else", "type found, reading property") + reader.Context().Push(field, "Else", "type found, reading property") if v := ElseRead(reader); v != nil { _if = *v } @@ -467,23 +437,23 @@ func DeserializeIfArgs(argsBuf []byte) *ArgsIf { panic(reader.Context().PrintWithContext("Missing required property: 'if: else'")) } - return &ArgsIf{ + return &types.ArgsIf{ M_if: _if, } } -func SerializeIfResult(value else) []byte { +func SerializeIfResult(value types.Else) []byte { ctx := msgpack.NewContext("Serializing module-type: If") encoder := msgpack.NewWriteEncoder(ctx) WriteIfResult(encoder, value); return encoder.Buffer() } -func WriteIfResult(writer msgpack.Write, value else) { - writer.Context().Push("if", "else", "writing property") +func WriteIfResult(writer msgpack.Write, value types.Else) { + writer.Context().Push("if", "Else", "writing property") { v := value - ElseWrite(writer, &v) + types.ElseWrite(writer, &v) } writer.Context().Pop() } diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_wrapped.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_wrapped.go similarity index 96% rename from packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_wrapped.go rename to packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_wrapped.go index 4a0fd678b3..3e003cad4b 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_wrapped.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_wrapped.go @@ -1,4 +1,4 @@ -package types +package module import ( "github.com/consideritdone/polywrap-go/polywrap" @@ -6,7 +6,6 @@ import ( ) func ModuleMethodWrapped(argsBuf []byte, envSize uint32) []byte { - var env *Env args := DeserializeModuleMethodArgs(argsBuf) @@ -44,7 +43,6 @@ func OptionalEnvMethodWrapped(argsBuf []byte, envSize uint32) []byte { } func IfWrapped(argsBuf []byte, envSize uint32) []byte { - var env *Env args := DeserializeIfArgs(argsBuf) diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_args.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_args.go new file mode 100644 index 0000000000..fba2f3ead7 --- /dev/null +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_args.go @@ -0,0 +1,36 @@ +package types + +import ( + "github.com/consideritdone/polywrap-go/polywrap/msgpack" +) + +type ArgsModuleMethod struct { + Str string + OptStr *string + En CustomEnum + OptEnum *CustomEnum + EnumArray []CustomEnum + OptEnumArray []*CustomEnum + Map map[string]int32 + MapOfArr map[string][]int32 + MapOfObj map[string]AnotherType + MapOfArrOfObj map[string][]AnotherType +} + +type ArgsObjectMethod struct { + Object AnotherType + OptObject *AnotherType + ObjectArray []AnotherType + OptObjectArray []*AnotherType +} + +type ArgsOptionalEnvMethod struct { + Object AnotherType + OptObject *AnotherType + ObjectArray []AnotherType + OptObjectArray []*AnotherType +} + +type ArgsIf struct { + M_if Else +} From 7b07dc124b59d9f388fb1e7896932a0a3acd6fc7 Mon Sep 17 00:00:00 2001 From: n0cte Date: Wed, 24 Aug 2022 22:42:19 +0300 Subject: [PATCH 22/65] fix code linting --- .../bind/src/bindings/golang/functions.ts | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/packages/schema/bind/src/bindings/golang/functions.ts b/packages/schema/bind/src/bindings/golang/functions.ts index bbdf53240f..132a5962c7 100644 --- a/packages/schema/bind/src/bindings/golang/functions.ts +++ b/packages/schema/bind/src/bindings/golang/functions.ts @@ -99,12 +99,15 @@ export const makeImports: MustacheFn = () => { return (text: string, render: (template: string) => string): string => { const types = render(text).split(","); const exist: { [key: string]: boolean } = {}; - const pattern = new RegExp('^(https?:\\/\\/)?'+ // protocol - '((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|'+ // domain name - '((\\d{1,3}\\.){3}\\d{1,3}))'+ // OR ip (v4) address - '(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*'+ // port and path - '(\\?[;&a-z\\d%_.~+=-]*)?'+ // query string - '(\\#[-a-z\\d_]*)?$','i'); + const pattern = new RegExp( + "^(https?:\\/\\/)?" + // protocol + "((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|" + // domain name + "((\\d{1,3}\\.){3}\\d{1,3}))" + // OR ip (v4) address + "(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*" + // port and path + "(\\?[;&a-z\\d%_.~+=-]*)?" + // query string + "(\\#[-a-z\\d_]*)?$", + "i" + ); for (const t of types) { switch (t) { case "*big.Int": @@ -219,13 +222,12 @@ export const toMsgPack: MustacheFn = () => { export const typeable: MustacheFn = () => { return (value: string, render: (template: string) => string) => { - let type = render(value); + const type = render(value); switch (type) { case "int8": case "int16": case "int32": case "int64": - case "uint32": case "uint8": case "uint16": case "uint32": @@ -234,7 +236,6 @@ export const typeable: MustacheFn = () => { case "bool": case "[]byte": case "*big.Int": - case "*big.Int": case "*fastjson.Value": return type; default: @@ -243,8 +244,8 @@ export const typeable: MustacheFn = () => { } return `types.${type}`; } - } -} + }; +}; export const toWasm: MustacheFn = () => { return (value: string, render: (template: string) => string) => { From d9f7b293a68eb3dd938a99cd9f461d52efc11c7c Mon Sep 17 00:00:00 2001 From: ramil Date: Thu, 25 Aug 2022 14:35:09 +0300 Subject: [PATCH 23/65] parse go.mod file --- packages/cli/lang/en.json | 2 ++ packages/cli/lang/es.json | 2 ++ .../build-images/wasm/golang/index.ts | 25 ++++++++++++++++--- .../module/%type%Wrapped-go.mustache | 2 +- .../module-type/types/%type%Args-go.mustache | 3 +-- 5 files changed, 27 insertions(+), 7 deletions(-) diff --git a/packages/cli/lang/en.json b/packages/cli/lang/en.json index 479ee7250d..454322da69 100644 --- a/packages/cli/lang/en.json +++ b/packages/cli/lang/en.json @@ -251,6 +251,8 @@ "lib_helpers_deployManifestExt_loadError": "Failed to load deploy manifest extension from {path}", "lib_helpers_deployManifestExt_loadText": "Load manifest extension from {path}", "lib_helpers_deployManifestExt_loadWarning": "No manifest extension found in {path}", + "lib_helpers_gomod_unableToLoad": "Unable to load go.mod: {path}", + "lib_helpers_gomod_invalid": "Invalid format of go.mod: {path}", "lib_helpers_manifest_outputError": "Failed to output manifest to {path}", "lib_helpers_manifest_outputText": "Manifest written to {path}", "lib_helpers_manifest_outputWarning": "Warnings writing manifest to {path}", diff --git a/packages/cli/lang/es.json b/packages/cli/lang/es.json index 04a8edde74..372c4cbe4f 100644 --- a/packages/cli/lang/es.json +++ b/packages/cli/lang/es.json @@ -251,6 +251,8 @@ "lib_helpers_deployManifestExt_loadError": "Failed to load deploy manifest extension from {path}", "lib_helpers_deployManifestExt_loadText": "Load manifest extension from {path}", "lib_helpers_deployManifestExt_loadWarning": "No manifest extension found in {path}", + "lib_helpers_gomod_unableToLoad": "Unable to load go.mod: {path}", + "lib_helpers_gomod_invalid": "Invalid format of go.mod: {path}", "lib_helpers_manifest_outputError": "Failed to output manifest to {path}", "lib_helpers_manifest_outputText": "Manifest written to {path}", "lib_helpers_manifest_outputWarning": "Warnings writing manifest to {path}", diff --git a/packages/cli/src/lib/defaults/build-images/wasm/golang/index.ts b/packages/cli/src/lib/defaults/build-images/wasm/golang/index.ts index c10376bbd2..28031cd73f 100644 --- a/packages/cli/src/lib/defaults/build-images/wasm/golang/index.ts +++ b/packages/cli/src/lib/defaults/build-images/wasm/golang/index.ts @@ -3,6 +3,7 @@ import { intlMsg } from "../../../../intl"; import { resolvePathIfExists } from "../../../../system"; import { PolywrapManifest } from "@polywrap/polywrap-manifest-types-js"; +import fs from "fs"; /** go.mod * module bla-bla @@ -28,10 +29,7 @@ export function getCompilerOverrides(): CompilerOverrides { ); } - // file open - // file parse - const value = "github.com/consideritdone/testproject"; - golangModuleName = value; + golangModuleName = loadGoModeFile(module); }, getCompilerOptions: (): Record => { return { @@ -41,3 +39,22 @@ export function getCompilerOverrides(): CompilerOverrides { generationSubPath: "wrap", }; } + +function loadGoModeFile(filePath: string): string { + const goMod = fs.readFileSync(filePath, "utf-8"); + + if (!goMod) { + const noLoadMessage = intlMsg.lib_helpers_gomod_unableToLoad({ + path: filePath, + }); + throw Error(noLoadMessage); + } + + const regex = /module (.+)/m; + const module = goMod.match(regex); + if (!module || module.length != 2) { + throw Error(intlMsg.lib_helpers_gomod_invalid({ path: filePath })); + } + + return module[1]; +} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Wrapped-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Wrapped-go.mustache index 737b7ea2ab..e644f895e1 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Wrapped-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Wrapped-go.mustache @@ -3,7 +3,7 @@ package module {{#methods.length}} import ( "github.com/consideritdone/polywrap-go/polywrap" - methods "{{goImport}}" + methods "{{goImport}}/module" ) {{/methods.length}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache index 8e777aaa0e..6beabd9e0e 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache @@ -1,6 +1,5 @@ package types -{{#makeImports}}{{#arguments}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/arguments}}{{/makeImports}} {{#methods}} type Args{{#toUpper}}{{name}}{{/toUpper}} struct { @@ -13,4 +12,4 @@ type Args{{#toUpper}}{{name}}{{/toUpper}} struct { {{^last}} {{/last}} -{{/methods}} \ No newline at end of file +{{/methods}} From 6bf4b44c2197ac8756610c46de2ce59bbde5873c Mon Sep 17 00:00:00 2001 From: ramil Date: Thu, 25 Aug 2022 19:03:52 +0300 Subject: [PATCH 24/65] dockerfile for golang build --- .../build-images/wasm/golang/Dockerfile.mustache | 13 +++++++++++++ .../build-images/wasm/golang/polywrap.build.yaml | 3 +++ .../module-type/module/%type%Wrapped-go.mustache | 2 ++ 3 files changed, 18 insertions(+) create mode 100644 packages/cli/src/lib/defaults/build-images/wasm/golang/Dockerfile.mustache create mode 100644 packages/cli/src/lib/defaults/build-images/wasm/golang/polywrap.build.yaml diff --git a/packages/cli/src/lib/defaults/build-images/wasm/golang/Dockerfile.mustache b/packages/cli/src/lib/defaults/build-images/wasm/golang/Dockerfile.mustache new file mode 100644 index 0000000000..695273b82d --- /dev/null +++ b/packages/cli/src/lib/defaults/build-images/wasm/golang/Dockerfile.mustache @@ -0,0 +1,13 @@ +FROM consideritdone/polywrap-base-go:0.1.0 + +WORKDIR /project + +COPY . . + +RUN tinygo build -o main.wasm -target wasm-memory wrap/main.go + +# Make the build directory +RUN rm -rf ./build +RUN mkdir ./build + +RUN wasm-snip -o ./build/wrap.wasm main.wasm -p syscall runtime.ticks fd_write diff --git a/packages/cli/src/lib/defaults/build-images/wasm/golang/polywrap.build.yaml b/packages/cli/src/lib/defaults/build-images/wasm/golang/polywrap.build.yaml new file mode 100644 index 0000000000..9df4ff713b --- /dev/null +++ b/packages/cli/src/lib/defaults/build-images/wasm/golang/polywrap.build.yaml @@ -0,0 +1,3 @@ +format: 0.1.0 +docker: + dockerfile: ./Dockerfile.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Wrapped-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Wrapped-go.mustache index e644f895e1..ae82e5b3c5 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Wrapped-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Wrapped-go.mustache @@ -2,7 +2,9 @@ package module {{#methods.length}} import ( + {{#env}} "github.com/consideritdone/polywrap-go/polywrap" + {{/env}} methods "{{goImport}}/module" ) {{/methods.length}} From bca807f7d1ea3a15a2cd1e0452a0b2a19474e138 Mon Sep 17 00:00:00 2001 From: ramil Date: Sat, 27 Aug 2022 01:10:52 +0300 Subject: [PATCH 25/65] fix golang code generated --- .../src/lib/defaults/build-images/wasm/golang/index.ts | 4 ++-- .../module-type/module/%type%Serialization-go.mustache | 10 +++++----- .../module-type/module/%type%Wrapped-go.mustache | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/cli/src/lib/defaults/build-images/wasm/golang/index.ts b/packages/cli/src/lib/defaults/build-images/wasm/golang/index.ts index 28031cd73f..365b99b78e 100644 --- a/packages/cli/src/lib/defaults/build-images/wasm/golang/index.ts +++ b/packages/cli/src/lib/defaults/build-images/wasm/golang/index.ts @@ -19,7 +19,7 @@ export function getCompilerOverrides(): CompilerOverrides { intlMsg.lib_wasm_golang_invalidModule({ path: module as string }) ); } - const goModPaths = [module as string]; + const goModPaths = [`../${module}`, module as string]; const goModFile = resolvePathIfExists(goModPaths); if (!goModFile) { throw Error( @@ -29,7 +29,7 @@ export function getCompilerOverrides(): CompilerOverrides { ); } - golangModuleName = loadGoModeFile(module); + golangModuleName = loadGoModeFile(goModFile); }, getCompilerOptions: (): Record => { return { diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Serialization-go.mustache index 2da6b2f512..6bd9f9c0f1 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Serialization-go.mustache @@ -3,7 +3,7 @@ package module {{#makeImports}}{{goImport}}/wrap/types,{{#arguments}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/arguments}}{{/makeImports}} {{#methods}} -func Deserialize{{#toUpper}}{{name}}{{/toUpper}}Args(argsBuf []byte) *types.Args{{#toUpper}}{{name}}{{/toUpper}} { +func deserialize{{#toUpper}}{{name}}{{/toUpper}}Args(argsBuf []byte) *types.Args{{#toUpper}}{{name}}{{/toUpper}} { ctx := msgpack.NewContext("Deserializing module-type: {{#toUpper}}{{name}}{{/toUpper}}") {{#arguments.length}} reader := msgpack.NewReadDecoder(ctx, argsBuf) @@ -22,10 +22,9 @@ func Deserialize{{#toUpper}}{{name}}{{/toUpper}}Args(argsBuf []byte) *types.Args for i := int32(reader.ReadMapLength()); i > 0; i-- { field := reader.ReadString() reader.Context().Push(field, "unknown", "searching for property type") - reader.Context().Pop() switch field { {{#arguments}} - case "{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}": + case "{{#handleKeywords}}{{name}}{{/handleKeywords}}": reader.Context().Push(field, "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "type found, reading property") {{#scalar}} {{> deserialize_scalar}} @@ -52,7 +51,8 @@ func Deserialize{{#toUpper}}{{name}}{{/toUpper}}Args(argsBuf []byte) *types.Args reader.Context().Pop() {{/arguments}} } - } + reader.Context().Pop() + } {{#arguments}} {{#required}} @@ -107,4 +107,4 @@ func Write{{#toUpper}}{{name}}{{/toUpper}}Result(writer msgpack.Write, value {{# {{^last}} {{/last}} -{{/methods}} \ No newline at end of file +{{/methods}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Wrapped-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Wrapped-go.mustache index ae82e5b3c5..f3da3b7cfe 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Wrapped-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Wrapped-go.mustache @@ -25,7 +25,7 @@ func {{#toUpper}}{{name}}{{/toUpper}}Wrapped(argsBuf []byte, envSize uint32) []b {{/env}} {{#arguments.length}} - args := Deserialize{{#toUpper}}{{name}}{{/toUpper}}Args(argsBuf) + args := deserialize{{#toUpper}}{{name}}{{/toUpper}}Args(argsBuf) {{/arguments.length}} result := methods.{{#toUpper}}{{name}}{{/toUpper}}({{#arguments.length}}args{{/arguments.length}}{{^arguments.length}}nil{{/arguments.length}}{{#env}}, env{{/env}}) From 2ae2c81d52971cb820091319d40cf9297606681f Mon Sep 17 00:00:00 2001 From: Ilnur Date: Tue, 6 Sep 2022 17:55:00 +0300 Subject: [PATCH 26/65] Golang: add test cases (#1198) * add test cases for simple types * add test wrappers for golang generator * add "asyncify"-wrapper and add tags "go:generate" * update wrapper's test cases --- .../asyncify/abis/memory-storage.graphql | 5 + .../cases/wrappers/wasm-go/asyncify/go.mod | 7 ++ .../cases/wrappers/wasm-go/asyncify/go.sum | 4 + .../wasm-go/asyncify/module/method.go | 107 ++++++++++++++++++ .../wasm-go/asyncify/polywrap.build.yaml | 5 + .../wrappers/wasm-go/asyncify/polywrap.yaml | 12 ++ .../wrappers/wasm-go/asyncify/schema.graphql | 62 ++++++++++ .../cases/wrappers/wasm-go/bigint-type/go.mod | 7 ++ .../cases/wrappers/wasm-go/bigint-type/go.sum | 4 + .../wasm-go/bigint-type/module/method.go | 21 ++++ .../wasm-go/bigint-type/polywrap.build.yaml | 5 + .../wasm-go/bigint-type/polywrap.yaml | 9 ++ .../wasm-go/bigint-type/schema.graphql | 12 ++ .../cases/wrappers/wasm-go/bytes-type/go.mod | 7 ++ .../cases/wrappers/wasm-go/bytes-type/go.sum | 4 + .../wasm-go/bytes-type/module/bytesMethod.go | 18 +++ .../wasm-go/bytes-type/polywrap.build.yaml | 6 + .../wrappers/wasm-go/bytes-type/polywrap.yaml | 9 ++ .../wasm-go/bytes-type/schema.graphql | 9 ++ .../cases/wrappers/wasm-go/enum-types/go.mod | 7 ++ .../cases/wrappers/wasm-go/enum-types/go.sum | 4 + .../wasm-go/enum-types/module/module.go | 13 +++ .../wasm-go/enum-types/polywrap.build.yaml | 4 + .../wrappers/wasm-go/enum-types/polywrap.yaml | 9 ++ .../wasm-go/enum-types/schema.graphql | 17 +++ .../wasm-go/env-types/external/go.mod | 7 ++ .../wasm-go/env-types/external/go.sum | 4 + .../env-types/external/module/module.go | 8 ++ .../env-types/external/polywrap.build.yaml | 4 + .../wasm-go/env-types/external/polywrap.yaml | 9 ++ .../wasm-go/env-types/external/schema.graphql | 8 ++ .../test-interface/polywrap.yaml | 6 + .../test-interface/schema.graphql | 13 +++ .../implementations/test-use-getImpl/go.mod | 7 ++ .../implementations/test-use-getImpl/go.sum | 4 + .../test-use-getImpl/module/module.go | 20 ++++ .../test-use-getImpl/polywrap.build.yaml | 5 + .../test-use-getImpl/polywrap.yaml | 12 ++ .../test-use-getImpl/schema.graphql | 13 +++ .../implementations/test-wrapper/go.mod | 7 ++ .../implementations/test-wrapper/go.sum | 4 + .../test-wrapper/module/module.go | 15 +++ .../test-wrapper/polywrap.build.yaml | 3 + .../test-wrapper/polywrap.yaml | 12 ++ .../test-wrapper/schema.graphql | 11 ++ .../wrappers/wasm-go/invalid-types/go.mod | 7 ++ .../wrappers/wasm-go/invalid-types/go.sum | 4 + .../wasm-go/invalid-types/module/module.go | 26 +++++ .../wasm-go/invalid-types/polywrap.build.yaml | 3 + .../wasm-go/invalid-types/polywrap.yaml | 9 ++ .../wasm-go/invalid-types/schema.graphql | 21 ++++ .../cases/wrappers/wasm-go/json-type/go.mod | 8 ++ .../cases/wrappers/wasm-go/json-type/go.sum | 4 + .../wasm-go/json-type/module/module.go | 40 +++++++ .../wasm-go/json-type/polywrap.build.yaml | 3 + .../wrappers/wasm-go/json-type/polywrap.yaml | 9 ++ .../wrappers/wasm-go/json-type/schema.graphql | 24 ++++ .../cases/wrappers/wasm-go/map-type/go.mod | 7 ++ .../cases/wrappers/wasm-go/map-type/go.sum | 4 + .../wasm-go/map-type/module/module.go | 17 +++ .../wasm-go/map-type/polywrap.build.yaml | 3 + .../wrappers/wasm-go/map-type/polywrap.yaml | 9 ++ .../wrappers/wasm-go/map-type/schema.graphql | 18 +++ .../wrappers/wasm-go/number-types/go.mod | 7 ++ .../wrappers/wasm-go/number-types/go.sum | 4 + .../wasm-go/number-types/module/module.go | 29 +++++ .../wasm-go/number-types/polywrap.build.yaml | 3 + .../wasm-go/number-types/polywrap.yaml | 9 ++ .../wasm-go/number-types/schema.graphql | 32 ++++++ .../wrappers/wasm-go/object-types/go.mod | 7 ++ .../wrappers/wasm-go/object-types/go.sum | 4 + .../wasm-go/object-types/module/module.go | 55 +++++++++ .../wasm-go/object-types/polywrap.build.yaml | 3 + .../wasm-go/object-types/polywrap.yaml | 9 ++ .../wasm-go/object-types/schema.graphql | 45 ++++++++ 75 files changed, 962 insertions(+) create mode 100644 packages/test-cases/cases/wrappers/wasm-go/asyncify/abis/memory-storage.graphql create mode 100644 packages/test-cases/cases/wrappers/wasm-go/asyncify/go.mod create mode 100644 packages/test-cases/cases/wrappers/wasm-go/asyncify/go.sum create mode 100644 packages/test-cases/cases/wrappers/wasm-go/asyncify/module/method.go create mode 100644 packages/test-cases/cases/wrappers/wasm-go/asyncify/polywrap.build.yaml create mode 100644 packages/test-cases/cases/wrappers/wasm-go/asyncify/polywrap.yaml create mode 100644 packages/test-cases/cases/wrappers/wasm-go/asyncify/schema.graphql create mode 100644 packages/test-cases/cases/wrappers/wasm-go/bigint-type/go.mod create mode 100644 packages/test-cases/cases/wrappers/wasm-go/bigint-type/go.sum create mode 100644 packages/test-cases/cases/wrappers/wasm-go/bigint-type/module/method.go create mode 100644 packages/test-cases/cases/wrappers/wasm-go/bigint-type/polywrap.build.yaml create mode 100644 packages/test-cases/cases/wrappers/wasm-go/bigint-type/polywrap.yaml create mode 100644 packages/test-cases/cases/wrappers/wasm-go/bigint-type/schema.graphql create mode 100644 packages/test-cases/cases/wrappers/wasm-go/bytes-type/go.mod create mode 100644 packages/test-cases/cases/wrappers/wasm-go/bytes-type/go.sum create mode 100644 packages/test-cases/cases/wrappers/wasm-go/bytes-type/module/bytesMethod.go create mode 100644 packages/test-cases/cases/wrappers/wasm-go/bytes-type/polywrap.build.yaml create mode 100644 packages/test-cases/cases/wrappers/wasm-go/bytes-type/polywrap.yaml create mode 100644 packages/test-cases/cases/wrappers/wasm-go/bytes-type/schema.graphql create mode 100644 packages/test-cases/cases/wrappers/wasm-go/enum-types/go.mod create mode 100644 packages/test-cases/cases/wrappers/wasm-go/enum-types/go.sum create mode 100644 packages/test-cases/cases/wrappers/wasm-go/enum-types/module/module.go create mode 100644 packages/test-cases/cases/wrappers/wasm-go/enum-types/polywrap.build.yaml create mode 100644 packages/test-cases/cases/wrappers/wasm-go/enum-types/polywrap.yaml create mode 100644 packages/test-cases/cases/wrappers/wasm-go/enum-types/schema.graphql create mode 100644 packages/test-cases/cases/wrappers/wasm-go/env-types/external/go.mod create mode 100644 packages/test-cases/cases/wrappers/wasm-go/env-types/external/go.sum create mode 100644 packages/test-cases/cases/wrappers/wasm-go/env-types/external/module/module.go create mode 100644 packages/test-cases/cases/wrappers/wasm-go/env-types/external/polywrap.build.yaml create mode 100644 packages/test-cases/cases/wrappers/wasm-go/env-types/external/polywrap.yaml create mode 100644 packages/test-cases/cases/wrappers/wasm-go/env-types/external/schema.graphql create mode 100644 packages/test-cases/cases/wrappers/wasm-go/implementations/test-interface/polywrap.yaml create mode 100644 packages/test-cases/cases/wrappers/wasm-go/implementations/test-interface/schema.graphql create mode 100644 packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/go.mod create mode 100644 packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/go.sum create mode 100644 packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/module/module.go create mode 100644 packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/polywrap.build.yaml create mode 100644 packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/polywrap.yaml create mode 100644 packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/schema.graphql create mode 100644 packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/go.mod create mode 100644 packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/go.sum create mode 100644 packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/module/module.go create mode 100644 packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/polywrap.build.yaml create mode 100644 packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/polywrap.yaml create mode 100644 packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/schema.graphql create mode 100644 packages/test-cases/cases/wrappers/wasm-go/invalid-types/go.mod create mode 100644 packages/test-cases/cases/wrappers/wasm-go/invalid-types/go.sum create mode 100644 packages/test-cases/cases/wrappers/wasm-go/invalid-types/module/module.go create mode 100644 packages/test-cases/cases/wrappers/wasm-go/invalid-types/polywrap.build.yaml create mode 100644 packages/test-cases/cases/wrappers/wasm-go/invalid-types/polywrap.yaml create mode 100644 packages/test-cases/cases/wrappers/wasm-go/invalid-types/schema.graphql create mode 100644 packages/test-cases/cases/wrappers/wasm-go/json-type/go.mod create mode 100644 packages/test-cases/cases/wrappers/wasm-go/json-type/go.sum create mode 100644 packages/test-cases/cases/wrappers/wasm-go/json-type/module/module.go create mode 100644 packages/test-cases/cases/wrappers/wasm-go/json-type/polywrap.build.yaml create mode 100644 packages/test-cases/cases/wrappers/wasm-go/json-type/polywrap.yaml create mode 100644 packages/test-cases/cases/wrappers/wasm-go/json-type/schema.graphql create mode 100644 packages/test-cases/cases/wrappers/wasm-go/map-type/go.mod create mode 100644 packages/test-cases/cases/wrappers/wasm-go/map-type/go.sum create mode 100644 packages/test-cases/cases/wrappers/wasm-go/map-type/module/module.go create mode 100644 packages/test-cases/cases/wrappers/wasm-go/map-type/polywrap.build.yaml create mode 100644 packages/test-cases/cases/wrappers/wasm-go/map-type/polywrap.yaml create mode 100644 packages/test-cases/cases/wrappers/wasm-go/map-type/schema.graphql create mode 100644 packages/test-cases/cases/wrappers/wasm-go/number-types/go.mod create mode 100644 packages/test-cases/cases/wrappers/wasm-go/number-types/go.sum create mode 100644 packages/test-cases/cases/wrappers/wasm-go/number-types/module/module.go create mode 100644 packages/test-cases/cases/wrappers/wasm-go/number-types/polywrap.build.yaml create mode 100644 packages/test-cases/cases/wrappers/wasm-go/number-types/polywrap.yaml create mode 100644 packages/test-cases/cases/wrappers/wasm-go/number-types/schema.graphql create mode 100644 packages/test-cases/cases/wrappers/wasm-go/object-types/go.mod create mode 100644 packages/test-cases/cases/wrappers/wasm-go/object-types/go.sum create mode 100644 packages/test-cases/cases/wrappers/wasm-go/object-types/module/module.go create mode 100644 packages/test-cases/cases/wrappers/wasm-go/object-types/polywrap.build.yaml create mode 100644 packages/test-cases/cases/wrappers/wasm-go/object-types/polywrap.yaml create mode 100644 packages/test-cases/cases/wrappers/wasm-go/object-types/schema.graphql diff --git a/packages/test-cases/cases/wrappers/wasm-go/asyncify/abis/memory-storage.graphql b/packages/test-cases/cases/wrappers/wasm-go/asyncify/abis/memory-storage.graphql new file mode 100644 index 0000000000..c10ae67370 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/asyncify/abis/memory-storage.graphql @@ -0,0 +1,5 @@ +type Module { + getData: Int32! + + setData(value: Int32!): Boolean! +} diff --git a/packages/test-cases/cases/wrappers/wasm-go/asyncify/go.mod b/packages/test-cases/cases/wrappers/wasm-go/asyncify/go.mod new file mode 100644 index 0000000000..dbfd3f2ddf --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/asyncify/go.mod @@ -0,0 +1,7 @@ +module github.com/testorg/testrepo + +go 1.17 + +require github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba + +require github.com/valyala/fastjson v1.6.3 // indirect diff --git a/packages/test-cases/cases/wrappers/wasm-go/asyncify/go.sum b/packages/test-cases/cases/wrappers/wasm-go/asyncify/go.sum new file mode 100644 index 0000000000..89ffed76d2 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/asyncify/go.sum @@ -0,0 +1,4 @@ +github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba h1:zalC+tj7u2wwOA53sJPvPwrIr6bgQF/5KiULuAi0tcE= +github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba/go.mod h1:IHk2chh2cl2rACqPLh5sE1LKTooxw19biP+zzYOiULg= +github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= +github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= diff --git a/packages/test-cases/cases/wrappers/wasm-go/asyncify/module/method.go b/packages/test-cases/cases/wrappers/wasm-go/asyncify/module/method.go new file mode 100644 index 0000000000..636b37e9be --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/asyncify/module/method.go @@ -0,0 +1,107 @@ +package module + +import ( + "strconv" + + "github.com/testorg/testrepo/wrap/imported/storage" + "github.com/testorg/testrepo/wrap/types" +) + +//go:generate polywrap build -v -m ../polywrap.yaml -o ../build + +func GetData() uint32 { + res, err := storage.MethodGetData(nil) + if err != nil { + panic(err) + } + return uint32(res) +} + +func ReturnTrue() bool { + return true +} + +func SetDataWithLargeArgs(args *types.MethodArgsSetDataWithLargeArgs) string { + largeString := args.Value + num, err := strconv.ParseInt(largeString, 10, 32) + if err != nil { + panic(err) + } + _, err = storage.MethodSetData(&storage.ArgsSetData{Value: int32(num)}) + if err != nil { + panic(err) + } + return largeString +} + +func SetDataWithManyArgs(args *types.MethodArgsSetDataWithManyArgs) string { + argsA := args.ValueA + argsB := args.ValueB + argsC := args.ValueC + argsD := args.ValueD + argsE := args.ValueE + argsF := args.ValueF + argsG := args.ValueG + argsH := args.ValueH + argsI := args.ValueI + argsJ := args.ValueJ + argsK := args.ValueK + argsL := args.ValueL + + _, err := storage.MethodSetData(&storage.ArgsSetData{Value: 55}) + if err != nil { + panic(err) + } + + return argsA + argsB + argsC + argsD + argsE + argsF + argsG + argsH + argsI + argsJ + argsK + argsL +} + +func SetDataWithManyStructuredArgs(args *types.MethodArgsSetDataWithManyStructuredArgs) bool { + _, err := storage.MethodSetData(&storage.ArgsSetData{Value: 44}) + if err != nil { + panic(err) + } + return true +} + +func LocalVarMethod() bool { + functionArg := false + functionArg = ReturnTrue() + + _, err := storage.MethodSetData(&storage.ArgsSetData{Value: 88}) + if err != nil { + panic(err) + } + + return functionArg +} + +var globalValue bool = false + +func GlobalVarMethod() bool { + globalValue = true + + _, err := storage.MethodSetData(&storage.ArgsSetData{Value: 77}) + if err != nil { + panic(err) + } + + return globalValue +} + +func SubsequentInvokes(args *types.MethodArgsSubsequentInvokes) []string { + result := make([]string, args.NumberOfTimes) + for i := int32(0); i < args.NumberOfTimes; i++ { + _, err := storage.MethodSetData(&storage.ArgsSetData{Value: i}) + if err != nil { + panic(err) + } + res, err := storage.MethodGetData(nil) + if err != nil { + panic(err) + } + result[i] = strconv.FormatInt(int64(res), 10) + } + + return result +} diff --git a/packages/test-cases/cases/wrappers/wasm-go/asyncify/polywrap.build.yaml b/packages/test-cases/cases/wrappers/wasm-go/asyncify/polywrap.build.yaml new file mode 100644 index 0000000000..e768939364 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/asyncify/polywrap.build.yaml @@ -0,0 +1,5 @@ +format: 0.1.0 +docker: + name: asyncify-wasm-go +config: + node_version: "16.13.0" diff --git a/packages/test-cases/cases/wrappers/wasm-go/asyncify/polywrap.yaml b/packages/test-cases/cases/wrappers/wasm-go/asyncify/polywrap.yaml new file mode 100644 index 0000000000..374d0c2aae --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/asyncify/polywrap.yaml @@ -0,0 +1,12 @@ +format: 0.2.0 +project: + name: Asyncify + type: wasm/golang +source: + schema: ./schema.graphql + module: ./go.mod + import_abis: + - uri: "ens/memory-storage.polywrap.eth" + abi: ./abis/memory-storage.graphql +extensions: + build: ./polywrap.build.yaml \ No newline at end of file diff --git a/packages/test-cases/cases/wrappers/wasm-go/asyncify/schema.graphql b/packages/test-cases/cases/wrappers/wasm-go/asyncify/schema.graphql new file mode 100644 index 0000000000..2660ba2f06 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/asyncify/schema.graphql @@ -0,0 +1,62 @@ +#import { Module } into Storage from "wrap://ens/memory-storage.polywrap.eth" + +type Module { + getData: UInt32! + + setDataWithLargeArgs( + value: String! + ): String! + + setDataWithManyArgs( + valueA: String! + valueB: String! + valueC: String! + valueD: String! + valueE: String! + valueF: String! + valueG: String! + valueH: String! + valueI: String! + valueJ: String! + valueK: String! + valueL: String! + ): String! + + setDataWithManyStructuredArgs( + valueA: BigObj! + valueB: BigObj! + valueC: BigObj! + valueD: BigObj! + valueE: BigObj! + valueF: BigObj! + valueG: BigObj! + valueH: BigObj! + valueI: BigObj! + valueJ: BigObj! + valueK: BigObj! + valueL: BigObj! + ): Boolean! + + localVarMethod: Boolean! + + globalVarMethod: Boolean! + + subsequentInvokes( + numberOfTimes: Int! + ): [String!]! +} + +type BigObj { + propA: String! + propB: String! + propC: String! + propD: String! + propE: String! + propF: String! + propG: String! + propH: String! + propI: String! + propJ: String! + propK: String! + propL: String! +} diff --git a/packages/test-cases/cases/wrappers/wasm-go/bigint-type/go.mod b/packages/test-cases/cases/wrappers/wasm-go/bigint-type/go.mod new file mode 100644 index 0000000000..dbfd3f2ddf --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/bigint-type/go.mod @@ -0,0 +1,7 @@ +module github.com/testorg/testrepo + +go 1.17 + +require github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba + +require github.com/valyala/fastjson v1.6.3 // indirect diff --git a/packages/test-cases/cases/wrappers/wasm-go/bigint-type/go.sum b/packages/test-cases/cases/wrappers/wasm-go/bigint-type/go.sum new file mode 100644 index 0000000000..89ffed76d2 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/bigint-type/go.sum @@ -0,0 +1,4 @@ +github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba h1:zalC+tj7u2wwOA53sJPvPwrIr6bgQF/5KiULuAi0tcE= +github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba/go.mod h1:IHk2chh2cl2rACqPLh5sE1LKTooxw19biP+zzYOiULg= +github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= +github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= diff --git a/packages/test-cases/cases/wrappers/wasm-go/bigint-type/module/method.go b/packages/test-cases/cases/wrappers/wasm-go/bigint-type/module/method.go new file mode 100644 index 0000000000..0b0b81b7d4 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/bigint-type/module/method.go @@ -0,0 +1,21 @@ +package module + +import ( + "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" + "github.com/testorg/testrepo/wrap/types" +) + +//go:generate polywrap build -v -m ../polywrap.yaml -o ../build +func Method(args *types.MethodArgsMethod) *big.Int { + result := new(big.Int).Mul(args.Arg1, args.Obj.Prop1) + + if args.Arg2 != nil { + result = result.Mul(result, args.Arg2) + } + + if args.Obj.Prop2 != nil { + result = result.Mul(result, args.Obj.Prop2) + } + + return result +} diff --git a/packages/test-cases/cases/wrappers/wasm-go/bigint-type/polywrap.build.yaml b/packages/test-cases/cases/wrappers/wasm-go/bigint-type/polywrap.build.yaml new file mode 100644 index 0000000000..46c036809b --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/bigint-type/polywrap.build.yaml @@ -0,0 +1,5 @@ +format: 0.1.0 +docker: + name: bigint-type-wasm-go +config: + node_version: "16.13.0" diff --git a/packages/test-cases/cases/wrappers/wasm-go/bigint-type/polywrap.yaml b/packages/test-cases/cases/wrappers/wasm-go/bigint-type/polywrap.yaml new file mode 100644 index 0000000000..bea7b6b71b --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/bigint-type/polywrap.yaml @@ -0,0 +1,9 @@ +format: 0.2.0 +project: + name: BigInt + type: wasm/golang +source: + schema: ./schema.graphql + module: ./go.mod +extensions: + build: ./polywrap.build.yaml \ No newline at end of file diff --git a/packages/test-cases/cases/wrappers/wasm-go/bigint-type/schema.graphql b/packages/test-cases/cases/wrappers/wasm-go/bigint-type/schema.graphql new file mode 100644 index 0000000000..7696ac2202 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/bigint-type/schema.graphql @@ -0,0 +1,12 @@ +type Module { + method( + arg1: BigInt! + arg2: BigInt + obj: BigIntArg! + ): BigInt! +} + +type BigIntArg { + prop1: BigInt! + prop2: BigInt +} diff --git a/packages/test-cases/cases/wrappers/wasm-go/bytes-type/go.mod b/packages/test-cases/cases/wrappers/wasm-go/bytes-type/go.mod new file mode 100644 index 0000000000..dbfd3f2ddf --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/bytes-type/go.mod @@ -0,0 +1,7 @@ +module github.com/testorg/testrepo + +go 1.17 + +require github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba + +require github.com/valyala/fastjson v1.6.3 // indirect diff --git a/packages/test-cases/cases/wrappers/wasm-go/bytes-type/go.sum b/packages/test-cases/cases/wrappers/wasm-go/bytes-type/go.sum new file mode 100644 index 0000000000..89ffed76d2 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/bytes-type/go.sum @@ -0,0 +1,4 @@ +github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba h1:zalC+tj7u2wwOA53sJPvPwrIr6bgQF/5KiULuAi0tcE= +github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba/go.mod h1:IHk2chh2cl2rACqPLh5sE1LKTooxw19biP+zzYOiULg= +github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= +github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= diff --git a/packages/test-cases/cases/wrappers/wasm-go/bytes-type/module/bytesMethod.go b/packages/test-cases/cases/wrappers/wasm-go/bytes-type/module/bytesMethod.go new file mode 100644 index 0000000000..c57eba5f50 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/bytes-type/module/bytesMethod.go @@ -0,0 +1,18 @@ +package module + +import ( + "bytes" + + "github.com/testorg/testrepo/wrap/types" +) + +//go:generate polywrap build -v -m ../polywrap.yaml -o ../build +func BytesMethod(args *types.MethodArgsBytesMethod) []byte { + return bytes.Join( + [][]byte{ + args.Arg.Prop, + []byte("Sanity!"), + }, + []byte(" "), + ) +} diff --git a/packages/test-cases/cases/wrappers/wasm-go/bytes-type/polywrap.build.yaml b/packages/test-cases/cases/wrappers/wasm-go/bytes-type/polywrap.build.yaml new file mode 100644 index 0000000000..2657f101fd --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/bytes-type/polywrap.build.yaml @@ -0,0 +1,6 @@ +format: 0.1.0 +docker: + name: bytes-type-wasm-go +config: + node_version: "16.13.0" + diff --git a/packages/test-cases/cases/wrappers/wasm-go/bytes-type/polywrap.yaml b/packages/test-cases/cases/wrappers/wasm-go/bytes-type/polywrap.yaml new file mode 100644 index 0000000000..292392bba4 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/bytes-type/polywrap.yaml @@ -0,0 +1,9 @@ +format: 0.2.0 +project: + name: BytesType + type: wasm/golang +source: + schema: ./schema.graphql + module: ./go.mod +extensions: + build: ./polywrap.build.yaml \ No newline at end of file diff --git a/packages/test-cases/cases/wrappers/wasm-go/bytes-type/schema.graphql b/packages/test-cases/cases/wrappers/wasm-go/bytes-type/schema.graphql new file mode 100644 index 0000000000..44dc183585 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/bytes-type/schema.graphql @@ -0,0 +1,9 @@ +type Module { + bytesMethod( + arg: Args! + ): Bytes! +} + +type Args { + prop: Bytes! +} diff --git a/packages/test-cases/cases/wrappers/wasm-go/enum-types/go.mod b/packages/test-cases/cases/wrappers/wasm-go/enum-types/go.mod new file mode 100644 index 0000000000..dbfd3f2ddf --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/enum-types/go.mod @@ -0,0 +1,7 @@ +module github.com/testorg/testrepo + +go 1.17 + +require github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba + +require github.com/valyala/fastjson v1.6.3 // indirect diff --git a/packages/test-cases/cases/wrappers/wasm-go/enum-types/go.sum b/packages/test-cases/cases/wrappers/wasm-go/enum-types/go.sum new file mode 100644 index 0000000000..89ffed76d2 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/enum-types/go.sum @@ -0,0 +1,4 @@ +github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba h1:zalC+tj7u2wwOA53sJPvPwrIr6bgQF/5KiULuAi0tcE= +github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba/go.mod h1:IHk2chh2cl2rACqPLh5sE1LKTooxw19biP+zzYOiULg= +github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= +github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= diff --git a/packages/test-cases/cases/wrappers/wasm-go/enum-types/module/module.go b/packages/test-cases/cases/wrappers/wasm-go/enum-types/module/module.go new file mode 100644 index 0000000000..9e91033414 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/enum-types/module/module.go @@ -0,0 +1,13 @@ +package module + +import "github.com/testorg/testrepo/wrap/types" + +//go:generate polywrap build -v -m ../polywrap.yaml -o ../build + +func Method1(args *types.MethodArgsMethod1) types.SanityEnum { + return args.En +} + +func Method2(args *types.MethodArgsMethod2) []types.SanityEnum { + return args.EnumArray +} diff --git a/packages/test-cases/cases/wrappers/wasm-go/enum-types/polywrap.build.yaml b/packages/test-cases/cases/wrappers/wasm-go/enum-types/polywrap.build.yaml new file mode 100644 index 0000000000..f41ac3765e --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/enum-types/polywrap.build.yaml @@ -0,0 +1,4 @@ +format: 0.1.0 +config: + node_version: "16.13.0" + diff --git a/packages/test-cases/cases/wrappers/wasm-go/enum-types/polywrap.yaml b/packages/test-cases/cases/wrappers/wasm-go/enum-types/polywrap.yaml new file mode 100644 index 0000000000..49939f942e --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/enum-types/polywrap.yaml @@ -0,0 +1,9 @@ +format: 0.2.0 +project: + name: EnumTypes + type: wasm/golang +source: + schema: ./schema.graphql + module: ./go.mod +extensions: + build: ./polywrap.build.yaml \ No newline at end of file diff --git a/packages/test-cases/cases/wrappers/wasm-go/enum-types/schema.graphql b/packages/test-cases/cases/wrappers/wasm-go/enum-types/schema.graphql new file mode 100644 index 0000000000..3bfbc465be --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/enum-types/schema.graphql @@ -0,0 +1,17 @@ +type Module { + method1( + en: SanityEnum! + optEnum: SanityEnum + ): SanityEnum! + + method2( + enumArray: [SanityEnum!]! + optEnumArray: [SanityEnum] + ): [SanityEnum!]! +} + +enum SanityEnum { + OPTION1 + OPTION2 + OPTION3 +} diff --git a/packages/test-cases/cases/wrappers/wasm-go/env-types/external/go.mod b/packages/test-cases/cases/wrappers/wasm-go/env-types/external/go.mod new file mode 100644 index 0000000000..dbfd3f2ddf --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/env-types/external/go.mod @@ -0,0 +1,7 @@ +module github.com/testorg/testrepo + +go 1.17 + +require github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba + +require github.com/valyala/fastjson v1.6.3 // indirect diff --git a/packages/test-cases/cases/wrappers/wasm-go/env-types/external/go.sum b/packages/test-cases/cases/wrappers/wasm-go/env-types/external/go.sum new file mode 100644 index 0000000000..89ffed76d2 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/env-types/external/go.sum @@ -0,0 +1,4 @@ +github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba h1:zalC+tj7u2wwOA53sJPvPwrIr6bgQF/5KiULuAi0tcE= +github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba/go.mod h1:IHk2chh2cl2rACqPLh5sE1LKTooxw19biP+zzYOiULg= +github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= +github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= diff --git a/packages/test-cases/cases/wrappers/wasm-go/env-types/external/module/module.go b/packages/test-cases/cases/wrappers/wasm-go/env-types/external/module/module.go new file mode 100644 index 0000000000..63caecec92 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/env-types/external/module/module.go @@ -0,0 +1,8 @@ +package module + +import "github.com/testorg/testrepo/wrap/types" + +//go:generate polywrap build -v -m ../polywrap.yaml -o ../build +func ExternalEnvMethod(env *types.Env) types.Env { + return *env +} diff --git a/packages/test-cases/cases/wrappers/wasm-go/env-types/external/polywrap.build.yaml b/packages/test-cases/cases/wrappers/wasm-go/env-types/external/polywrap.build.yaml new file mode 100644 index 0000000000..f41ac3765e --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/env-types/external/polywrap.build.yaml @@ -0,0 +1,4 @@ +format: 0.1.0 +config: + node_version: "16.13.0" + diff --git a/packages/test-cases/cases/wrappers/wasm-go/env-types/external/polywrap.yaml b/packages/test-cases/cases/wrappers/wasm-go/env-types/external/polywrap.yaml new file mode 100644 index 0000000000..065819aec2 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/env-types/external/polywrap.yaml @@ -0,0 +1,9 @@ +format: 0.2.0 +project: + name: EnvTypeExternal + type: wasm/golang +source: + schema: ./schema.graphql + module: ./go.mod +extensions: + build: ./polywrap.build.yaml \ No newline at end of file diff --git a/packages/test-cases/cases/wrappers/wasm-go/env-types/external/schema.graphql b/packages/test-cases/cases/wrappers/wasm-go/env-types/external/schema.graphql new file mode 100644 index 0000000000..d2325113e2 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/env-types/external/schema.graphql @@ -0,0 +1,8 @@ +type Env { + externalArray: [UInt32!]! + externalString: String! +} + +type Module { + externalEnvMethod: Env! @env(required: true) +} diff --git a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-interface/polywrap.yaml b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-interface/polywrap.yaml new file mode 100644 index 0000000000..b2e18e3c2f --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-interface/polywrap.yaml @@ -0,0 +1,6 @@ +format: 0.2.0 +project: + name: TestInterface + type: interface +source: + schema: ./schema.graphql diff --git a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-interface/schema.graphql b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-interface/schema.graphql new file mode 100644 index 0000000000..b80a6e620b --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-interface/schema.graphql @@ -0,0 +1,13 @@ +type Module { + abstractModuleMethod( + arg: Argument! + ): String! +} + +type Argument { + str: String! +} + +type InterfaceType { + uint8: UInt8! +} \ No newline at end of file diff --git a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/go.mod b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/go.mod new file mode 100644 index 0000000000..dbfd3f2ddf --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/go.mod @@ -0,0 +1,7 @@ +module github.com/testorg/testrepo + +go 1.17 + +require github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba + +require github.com/valyala/fastjson v1.6.3 // indirect diff --git a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/go.sum b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/go.sum new file mode 100644 index 0000000000..89ffed76d2 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/go.sum @@ -0,0 +1,4 @@ +github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba h1:zalC+tj7u2wwOA53sJPvPwrIr6bgQF/5KiULuAi0tcE= +github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba/go.mod h1:IHk2chh2cl2rACqPLh5sE1LKTooxw19biP+zzYOiULg= +github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= +github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= diff --git a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/module/module.go b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/module/module.go new file mode 100644 index 0000000000..9e4d85a0b2 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/module/module.go @@ -0,0 +1,20 @@ +package module + +import ( + "github.com/testorg/testrepo/wrap/interfaces" + "github.com/testorg/testrepo/wrap/types" +) + +//go:generate polywrap build -v -m ../polywrap.yaml -o ../build + +func ModuleImplementations() []string { + return interfaces.InterfaceImplementations() +} + +func ModuleMethod(args *types.MethodArgsModuleMethod) types.ImplementationType { + return args.Arg +} + +func AbstractModuleMethod(args *types.MethodArgsAbstractModuleMethod) string { + return args.Arg.Str +} diff --git a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/polywrap.build.yaml b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/polywrap.build.yaml new file mode 100644 index 0000000000..a7ca19eefa --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/polywrap.build.yaml @@ -0,0 +1,5 @@ +format: 0.1.0 +docker: + name: test-use-get-impl-wasm-as +config: + node_version: "16.13.0" diff --git a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/polywrap.yaml b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/polywrap.yaml new file mode 100644 index 0000000000..7d275c3de4 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/polywrap.yaml @@ -0,0 +1,12 @@ +format: 0.2.0 +project: + name: TestUseGetImpl + type: wasm/golang +source: + schema: ./schema.graphql + module: ./go.mod + import_abis: + - uri: wrap://ens/interface.eth + abi: ../test-interface/build/wrap.info +extensions: + build: ./polywrap.build.yaml diff --git a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/schema.graphql b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/schema.graphql new file mode 100644 index 0000000000..bd51ae7828 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/schema.graphql @@ -0,0 +1,13 @@ +#import { Module, InterfaceType } into Interface from "wrap://ens/interface.eth" +#use { getImplementations } for Interface + +type Module implements Interface_Module { + moduleImplementations: [String!]! + moduleMethod( + arg: ImplementationType! + ): ImplementationType! +} + +type ImplementationType implements Interface_InterfaceType { + str: String! +} \ No newline at end of file diff --git a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/go.mod b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/go.mod new file mode 100644 index 0000000000..dbfd3f2ddf --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/go.mod @@ -0,0 +1,7 @@ +module github.com/testorg/testrepo + +go 1.17 + +require github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba + +require github.com/valyala/fastjson v1.6.3 // indirect diff --git a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/go.sum b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/go.sum new file mode 100644 index 0000000000..89ffed76d2 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/go.sum @@ -0,0 +1,4 @@ +github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba h1:zalC+tj7u2wwOA53sJPvPwrIr6bgQF/5KiULuAi0tcE= +github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba/go.mod h1:IHk2chh2cl2rACqPLh5sE1LKTooxw19biP+zzYOiULg= +github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= +github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= diff --git a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/module/module.go b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/module/module.go new file mode 100644 index 0000000000..53dcaeb681 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/module/module.go @@ -0,0 +1,15 @@ +package module + +import ( + "github.com/testorg/testrepo/wrap/types" +) + +//go:generate polywrap build -v -m ../polywrap.yaml -o ../build + +func ModuleMethod(args *types.MethodArgsModuleMethod) types.ImplementationType { + return args.Arg +} + +func AbstractModuleMethod(args *types.MethodArgsAbstractModuleMethod) string { + return args.Arg.Str +} diff --git a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/polywrap.build.yaml b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/polywrap.build.yaml new file mode 100644 index 0000000000..aa5f7201ed --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/polywrap.build.yaml @@ -0,0 +1,3 @@ +format: 0.1.0 +config: + node_version: "16.13.0" diff --git a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/polywrap.yaml b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/polywrap.yaml new file mode 100644 index 0000000000..c9fafb06d2 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/polywrap.yaml @@ -0,0 +1,12 @@ +format: 0.2.0 +project: + name: TestWrapper + type: wasm/golang +source: + schema: ./schema.graphql + module: ./go.mod + import_abis: + - uri: wrap://ens/interface.eth + abi: ../test-interface/build/wrap.info +extensions: + build: ./polywrap.build.yaml diff --git a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/schema.graphql b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/schema.graphql new file mode 100644 index 0000000000..0b28cfb495 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/schema.graphql @@ -0,0 +1,11 @@ +#import { Module, InterfaceType } into Interface from "wrap://ens/interface.eth" + +type Module implements Interface_Module { + moduleMethod( + arg: ImplementationType! + ): ImplementationType! +} + +type ImplementationType implements Interface_InterfaceType { + str: String! +} \ No newline at end of file diff --git a/packages/test-cases/cases/wrappers/wasm-go/invalid-types/go.mod b/packages/test-cases/cases/wrappers/wasm-go/invalid-types/go.mod new file mode 100644 index 0000000000..dbfd3f2ddf --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/invalid-types/go.mod @@ -0,0 +1,7 @@ +module github.com/testorg/testrepo + +go 1.17 + +require github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba + +require github.com/valyala/fastjson v1.6.3 // indirect diff --git a/packages/test-cases/cases/wrappers/wasm-go/invalid-types/go.sum b/packages/test-cases/cases/wrappers/wasm-go/invalid-types/go.sum new file mode 100644 index 0000000000..89ffed76d2 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/invalid-types/go.sum @@ -0,0 +1,4 @@ +github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba h1:zalC+tj7u2wwOA53sJPvPwrIr6bgQF/5KiULuAi0tcE= +github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba/go.mod h1:IHk2chh2cl2rACqPLh5sE1LKTooxw19biP+zzYOiULg= +github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= +github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= diff --git a/packages/test-cases/cases/wrappers/wasm-go/invalid-types/module/module.go b/packages/test-cases/cases/wrappers/wasm-go/invalid-types/module/module.go new file mode 100644 index 0000000000..5981ee38b3 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/invalid-types/module/module.go @@ -0,0 +1,26 @@ +package module + +import ( + "github.com/testorg/testrepo/wrap/types" +) + +//go:generate polywrap build -v -m ../polywrap.yaml -o ../build +func BoolMethod(args *types.MethodArgsBoolMethod) bool { + return args.Arg +} + +func IntMethod(args *types.MethodArgsIntMethod) int32 { + return args.Arg +} + +func UIntMethod(args *types.MethodArgsUIntMethod) uint32 { + return args.Arg +} + +func BytesMethod(args *types.MethodArgsBytesMethod) []byte { + return args.Arg +} + +func ArrayMethod(args *types.MethodArgsArrayMethod) []string { + return args.Arg +} diff --git a/packages/test-cases/cases/wrappers/wasm-go/invalid-types/polywrap.build.yaml b/packages/test-cases/cases/wrappers/wasm-go/invalid-types/polywrap.build.yaml new file mode 100644 index 0000000000..aa5f7201ed --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/invalid-types/polywrap.build.yaml @@ -0,0 +1,3 @@ +format: 0.1.0 +config: + node_version: "16.13.0" diff --git a/packages/test-cases/cases/wrappers/wasm-go/invalid-types/polywrap.yaml b/packages/test-cases/cases/wrappers/wasm-go/invalid-types/polywrap.yaml new file mode 100644 index 0000000000..5b2b05d01b --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/invalid-types/polywrap.yaml @@ -0,0 +1,9 @@ +format: 0.2.0 +project: + name: InvalidTypes + type: wasm/golang +source: + schema: ./schema.graphql + module: ./go.mod +extensions: + build: ./polywrap.build.yaml diff --git a/packages/test-cases/cases/wrappers/wasm-go/invalid-types/schema.graphql b/packages/test-cases/cases/wrappers/wasm-go/invalid-types/schema.graphql new file mode 100644 index 0000000000..5df1ac9c73 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/invalid-types/schema.graphql @@ -0,0 +1,21 @@ +type Module { + boolMethod( + arg: Boolean! + ): Boolean! + + intMethod( + arg: Int32! + ): Int32! + + uIntMethod( + arg: UInt32! + ): UInt32! + + bytesMethod( + arg: Bytes! + ): Bytes! + + arrayMethod( + arg: [String!]! + ): [String!] +} diff --git a/packages/test-cases/cases/wrappers/wasm-go/json-type/go.mod b/packages/test-cases/cases/wrappers/wasm-go/json-type/go.mod new file mode 100644 index 0000000000..6018d3c1c5 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/json-type/go.mod @@ -0,0 +1,8 @@ +module github.com/testorg/testrepo + +go 1.17 + +require ( + github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba + github.com/valyala/fastjson v1.6.3 +) diff --git a/packages/test-cases/cases/wrappers/wasm-go/json-type/go.sum b/packages/test-cases/cases/wrappers/wasm-go/json-type/go.sum new file mode 100644 index 0000000000..89ffed76d2 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/json-type/go.sum @@ -0,0 +1,4 @@ +github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba h1:zalC+tj7u2wwOA53sJPvPwrIr6bgQF/5KiULuAi0tcE= +github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba/go.mod h1:IHk2chh2cl2rACqPLh5sE1LKTooxw19biP+zzYOiULg= +github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= +github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= diff --git a/packages/test-cases/cases/wrappers/wasm-go/json-type/module/module.go b/packages/test-cases/cases/wrappers/wasm-go/json-type/module/module.go new file mode 100644 index 0000000000..62ab2b2d04 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/json-type/module/module.go @@ -0,0 +1,40 @@ +package module + +import ( + "github.com/testorg/testrepo/wrap/types" + "github.com/valyala/fastjson" +) + +//go:generate polywrap build -v -m ../polywrap.yaml -o ../build + +func Parse(args *types.MethodArgsParse) *fastjson.Value { + return fastjson.MustParse(args.Value) +} + +func Stringify(args *types.MethodArgsStringify) string { + str := "" + for i := range args.Values { + str += args.Values[i].String() + } + return str +} + +func StringifyObject(args *types.MethodArgsStringifyObject) string { + str := "" + str += args.Object.JsonA.String() + str += args.Object.JsonB.String() + return str +} + +func MethodJSON(args *types.MethodArgsMethodJSON) *fastjson.Value { + arena := new(fastjson.Arena) + result := arena.NewObject() + result.Set("valueA", arena.NewNumberInt(int(args.ValueA))) + result.Set("valueB", arena.NewString(args.ValueB)) + if args.ValueC { + result.Set("valueC", arena.NewTrue()) + } else { + result.Set("valueC", arena.NewFalse()) + } + return result +} diff --git a/packages/test-cases/cases/wrappers/wasm-go/json-type/polywrap.build.yaml b/packages/test-cases/cases/wrappers/wasm-go/json-type/polywrap.build.yaml new file mode 100644 index 0000000000..aa5f7201ed --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/json-type/polywrap.build.yaml @@ -0,0 +1,3 @@ +format: 0.1.0 +config: + node_version: "16.13.0" diff --git a/packages/test-cases/cases/wrappers/wasm-go/json-type/polywrap.yaml b/packages/test-cases/cases/wrappers/wasm-go/json-type/polywrap.yaml new file mode 100644 index 0000000000..91efb8d20a --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/json-type/polywrap.yaml @@ -0,0 +1,9 @@ +format: 0.2.0 +project: + name: JsonType + type: wasm/golang +source: + schema: ./schema.graphql + module: ./go.mod +extensions: + build: ./polywrap.build.yaml diff --git a/packages/test-cases/cases/wrappers/wasm-go/json-type/schema.graphql b/packages/test-cases/cases/wrappers/wasm-go/json-type/schema.graphql new file mode 100644 index 0000000000..cb60b87271 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/json-type/schema.graphql @@ -0,0 +1,24 @@ +type Module { + parse( + value: String! + ): JSON! + + stringify( + values: [JSON!]! + ): String! + + stringifyObject( + object: Object! + ): String! + + methodJSON( + valueA: Int! + valueB: String! + valueC: Boolean! + ): JSON! +} + +type Object { + jsonA: JSON! + jsonB: JSON! +} \ No newline at end of file diff --git a/packages/test-cases/cases/wrappers/wasm-go/map-type/go.mod b/packages/test-cases/cases/wrappers/wasm-go/map-type/go.mod new file mode 100644 index 0000000000..dbfd3f2ddf --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/map-type/go.mod @@ -0,0 +1,7 @@ +module github.com/testorg/testrepo + +go 1.17 + +require github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba + +require github.com/valyala/fastjson v1.6.3 // indirect diff --git a/packages/test-cases/cases/wrappers/wasm-go/map-type/go.sum b/packages/test-cases/cases/wrappers/wasm-go/map-type/go.sum new file mode 100644 index 0000000000..89ffed76d2 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/map-type/go.sum @@ -0,0 +1,4 @@ +github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba h1:zalC+tj7u2wwOA53sJPvPwrIr6bgQF/5KiULuAi0tcE= +github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba/go.mod h1:IHk2chh2cl2rACqPLh5sE1LKTooxw19biP+zzYOiULg= +github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= +github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= diff --git a/packages/test-cases/cases/wrappers/wasm-go/map-type/module/module.go b/packages/test-cases/cases/wrappers/wasm-go/map-type/module/module.go new file mode 100644 index 0000000000..511395f40e --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/map-type/module/module.go @@ -0,0 +1,17 @@ +package module + +import "github.com/testorg/testrepo/wrap/types" + +//go:generate polywrap build -v -m ../polywrap.yaml -o ../build + +func GetKey(args *types.MethodArgsGetKey) int32 { + return args.Foo.M_map[args.Key] +} + +func ReturnMap(args *types.MethodArgsReturnMap) map[string]int32 { + return args.M_map +} + +func ReturnCustomMap(args *types.MethodArgsReturnCustomMap) types.CustomMap { + return args.Foo +} diff --git a/packages/test-cases/cases/wrappers/wasm-go/map-type/polywrap.build.yaml b/packages/test-cases/cases/wrappers/wasm-go/map-type/polywrap.build.yaml new file mode 100644 index 0000000000..aa5f7201ed --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/map-type/polywrap.build.yaml @@ -0,0 +1,3 @@ +format: 0.1.0 +config: + node_version: "16.13.0" diff --git a/packages/test-cases/cases/wrappers/wasm-go/map-type/polywrap.yaml b/packages/test-cases/cases/wrappers/wasm-go/map-type/polywrap.yaml new file mode 100644 index 0000000000..292392bba4 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/map-type/polywrap.yaml @@ -0,0 +1,9 @@ +format: 0.2.0 +project: + name: BytesType + type: wasm/golang +source: + schema: ./schema.graphql + module: ./go.mod +extensions: + build: ./polywrap.build.yaml \ No newline at end of file diff --git a/packages/test-cases/cases/wrappers/wasm-go/map-type/schema.graphql b/packages/test-cases/cases/wrappers/wasm-go/map-type/schema.graphql new file mode 100644 index 0000000000..b79ca553c5 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/map-type/schema.graphql @@ -0,0 +1,18 @@ +type Module { + getKey( + key: String! + foo: CustomMap! + ): Int! + + returnMap( + map: Map! @annotate(type: "Map!") + ): Map! @annotate(type: "Map!") + + returnCustomMap( + foo: CustomMap! + ): CustomMap! +} + +type CustomMap { + map: Map! @annotate(type: "Map!") +} diff --git a/packages/test-cases/cases/wrappers/wasm-go/number-types/go.mod b/packages/test-cases/cases/wrappers/wasm-go/number-types/go.mod new file mode 100644 index 0000000000..dbfd3f2ddf --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/number-types/go.mod @@ -0,0 +1,7 @@ +module github.com/testorg/testrepo + +go 1.17 + +require github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba + +require github.com/valyala/fastjson v1.6.3 // indirect diff --git a/packages/test-cases/cases/wrappers/wasm-go/number-types/go.sum b/packages/test-cases/cases/wrappers/wasm-go/number-types/go.sum new file mode 100644 index 0000000000..89ffed76d2 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/number-types/go.sum @@ -0,0 +1,4 @@ +github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba h1:zalC+tj7u2wwOA53sJPvPwrIr6bgQF/5KiULuAi0tcE= +github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba/go.mod h1:IHk2chh2cl2rACqPLh5sE1LKTooxw19biP+zzYOiULg= +github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= +github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= diff --git a/packages/test-cases/cases/wrappers/wasm-go/number-types/module/module.go b/packages/test-cases/cases/wrappers/wasm-go/number-types/module/module.go new file mode 100644 index 0000000000..35be7fc298 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/number-types/module/module.go @@ -0,0 +1,29 @@ +package module + +import "github.com/testorg/testrepo/wrap/types" + +//go:generate polywrap build -v -m ../polywrap.yaml -o ../build + +func I8Method(args *types.MethodArgsI8Method) int8 { + return args.First + args.Second +} + +func U8Method(args *types.MethodArgsU8Method) uint8 { + return args.First + args.Second +} + +func I16Method(args *types.MethodArgsI16Method) int16 { + return args.First + args.Second +} + +func U16Method(args *types.MethodArgsU16Method) uint16 { + return args.First + args.Second +} + +func I32Method(args *types.MethodArgsI32Method) int32 { + return args.First + args.Second +} + +func U32Method(args *types.MethodArgsU32Method) uint32 { + return args.First + args.Second +} diff --git a/packages/test-cases/cases/wrappers/wasm-go/number-types/polywrap.build.yaml b/packages/test-cases/cases/wrappers/wasm-go/number-types/polywrap.build.yaml new file mode 100644 index 0000000000..d16e9c9f18 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/number-types/polywrap.build.yaml @@ -0,0 +1,3 @@ +format: 0.1.0 +config: + node_version: "16.13.0" \ No newline at end of file diff --git a/packages/test-cases/cases/wrappers/wasm-go/number-types/polywrap.yaml b/packages/test-cases/cases/wrappers/wasm-go/number-types/polywrap.yaml new file mode 100644 index 0000000000..cbef1cd38d --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/number-types/polywrap.yaml @@ -0,0 +1,9 @@ +format: 0.2.0 +project: + name: NumberTypes + type: wasm/golang +source: + schema: ./schema.graphql + module: ./go.mod +extensions: + build: ./polywrap.build.yaml \ No newline at end of file diff --git a/packages/test-cases/cases/wrappers/wasm-go/number-types/schema.graphql b/packages/test-cases/cases/wrappers/wasm-go/number-types/schema.graphql new file mode 100644 index 0000000000..81d5005b5a --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/number-types/schema.graphql @@ -0,0 +1,32 @@ +type Module { + + i8Method( + first: Int8! + second: Int8! + ): Int8! + + u8Method( + first: UInt8! + second: UInt8! + ): UInt8! + + i16Method( + first: Int16! + second: Int16! + ): Int16! + + u16Method( + first: UInt16! + second: UInt16! + ): UInt16! + + i32Method( + first: Int! + second: Int! + ): Int! + + u32Method( + first: UInt32! + second: UInt32! + ): UInt32! +} \ No newline at end of file diff --git a/packages/test-cases/cases/wrappers/wasm-go/object-types/go.mod b/packages/test-cases/cases/wrappers/wasm-go/object-types/go.mod new file mode 100644 index 0000000000..dbfd3f2ddf --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/object-types/go.mod @@ -0,0 +1,7 @@ +module github.com/testorg/testrepo + +go 1.17 + +require github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba + +require github.com/valyala/fastjson v1.6.3 // indirect diff --git a/packages/test-cases/cases/wrappers/wasm-go/object-types/go.sum b/packages/test-cases/cases/wrappers/wasm-go/object-types/go.sum new file mode 100644 index 0000000000..89ffed76d2 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/object-types/go.sum @@ -0,0 +1,4 @@ +github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba h1:zalC+tj7u2wwOA53sJPvPwrIr6bgQF/5KiULuAi0tcE= +github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba/go.mod h1:IHk2chh2cl2rACqPLh5sE1LKTooxw19biP+zzYOiULg= +github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= +github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= diff --git a/packages/test-cases/cases/wrappers/wasm-go/object-types/module/module.go b/packages/test-cases/cases/wrappers/wasm-go/object-types/module/module.go new file mode 100644 index 0000000000..9ecf0355cc --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/object-types/module/module.go @@ -0,0 +1,55 @@ +package module + +import "github.com/testorg/testrepo/wrap/types" + +//go:generate polywrap build -v -m ../polywrap.yaml -o ../build + +func Method1(args *types.MethodArgsMethod1) []types.Output { + out1 := types.Output{ + Prop: args.Arg1.Prop, + Nested: types.Nested{ + Prop: args.Arg1.Nested.Prop, + }, + } + out2 := types.Output{} + if args.Arg2 != nil { + out2 = types.Output{ + Prop: args.Arg2.Prop, + Nested: types.Nested{ + Prop: args.Arg2.Circular.Prop, + }, + } + } + return []types.Output{out1, out2} +} + +func Method2(args *types.MethodArgsMethod2) *types.Output { + if args == nil { + return nil + } + return &types.Output{ + Prop: args.Arg.Prop, + Nested: types.Nested{ + Prop: args.Arg.Nested.Prop, + }, + } +} + +func Method3(args *types.MethodArgsMethod3) []*types.Output { + out2 := &types.Output{ + Prop: args.Arg.Prop, + Nested: types.Nested{ + Prop: args.Arg.Nested.Prop, + }, + } + return []*types.Output{nil, out2} +} + +func Method5(args *types.MethodArgsMethod5) types.Output { + return types.Output{ + Prop: string(args.Arg.Prop), + Nested: types.Nested{ + Prop: "nested prop", + }, + } +} diff --git a/packages/test-cases/cases/wrappers/wasm-go/object-types/polywrap.build.yaml b/packages/test-cases/cases/wrappers/wasm-go/object-types/polywrap.build.yaml new file mode 100644 index 0000000000..d16e9c9f18 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/object-types/polywrap.build.yaml @@ -0,0 +1,3 @@ +format: 0.1.0 +config: + node_version: "16.13.0" \ No newline at end of file diff --git a/packages/test-cases/cases/wrappers/wasm-go/object-types/polywrap.yaml b/packages/test-cases/cases/wrappers/wasm-go/object-types/polywrap.yaml new file mode 100644 index 0000000000..1bf4bdb549 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/object-types/polywrap.yaml @@ -0,0 +1,9 @@ +format: 0.2.0 +project: + name: ObjectTypes + type: wasm/golang +source: + schema: ./schema.graphql + module: ./go.mod +extensions: + build: ./polywrap.build.yaml \ No newline at end of file diff --git a/packages/test-cases/cases/wrappers/wasm-go/object-types/schema.graphql b/packages/test-cases/cases/wrappers/wasm-go/object-types/schema.graphql new file mode 100644 index 0000000000..03f068148a --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/object-types/schema.graphql @@ -0,0 +1,45 @@ +type Module { + method1( + arg1: Arg1! + arg2: Arg2 + ): [Output!]! + + method2( + arg: Arg1! + ): Output + + method3( + arg: Arg1! + ): [Output]! + + method5( + arg: Arg3! + ): Output! +} + +type Arg1 { + prop: String! + nested: Nested! +} + +type Arg2 { + prop: String! + circular: Circular! +} + +type Arg3 { + prop: Bytes! +} + +type Output { + prop: String! + nested: Nested! +} + +type Nested { + prop: String! +} + +type Circular { + prop: String! +} From 9c5b9d34b38215a4ec60013079b543f66a219aa1 Mon Sep 17 00:00:00 2001 From: Ilnur Date: Tue, 6 Sep 2022 17:55:40 +0300 Subject: [PATCH 27/65] simplify package url matching (#1184) * simplify package url matching * remove unused import * fix template for imported module * add synonym for a imports * fix imported modules and remove spaces * fix import problem for module package in wrapper * fix import formatting * remove unused var from generated code * import types if env used * fix module deserialization in go-codegen * add sanitization for imported pkgs names and fix problem with similar struct's names * fix schema testcase location --- .../bind/src/bindings/golang/functions.ts | 147 +++++------------- .../bind/src/bindings/golang/reservedWords.ts | 25 +++ .../bind/src/bindings/golang/wasm/index.ts | 31 +++- .../templates/env-type/Env%type%-go.mustache | 2 +- .../Env%type%Serialization-go.mustache | 2 +- .../imported/enum-type/Enum%type%-go.mustache | 2 +- .../imported/env-type/Env%type%-go.mustache | 11 +- .../Env%type%Serialization-go.mustache | 11 +- .../interface-type/%type%-go.mustache | 2 +- .../%type%Serialization-go.mustache | 13 +- .../module-type/%type%Wrapped-go.mustache | 28 ++-- .../object-type/Object%type%-go.mustache | 11 +- .../Object%type%Serialization-go.mustache | 11 +- .../module/%type%Serialization-go.mustache | 29 ++-- .../module/%type%Wrapped-go.mustache | 22 ++- .../module-type/types/%type%Args-go.mustache | 16 +- .../object-type/Object%type%-go.mustache | 9 +- .../Object%type%Serialization-go.mustache | 9 +- .../templates/value_serialize_object.mustache | 4 +- .../test_import__module_wrapped.go | 26 +++- .../wasm-go/module/module_serialization.go | 84 +++++----- .../output/wasm-go/module/module_wrapped.go | 8 +- .../output/wasm-go/types/module_args.go | 14 +- .../wasm-go/types/object_custom_type.go | 2 +- .../types/object_custom_type_serialization.go | 16 +- 25 files changed, 282 insertions(+), 253 deletions(-) diff --git a/packages/schema/bind/src/bindings/golang/functions.ts b/packages/schema/bind/src/bindings/golang/functions.ts index 132a5962c7..6c5e836981 100644 --- a/packages/schema/bind/src/bindings/golang/functions.ts +++ b/packages/schema/bind/src/bindings/golang/functions.ts @@ -99,41 +99,38 @@ export const makeImports: MustacheFn = () => { return (text: string, render: (template: string) => string): string => { const types = render(text).split(","); const exist: { [key: string]: boolean } = {}; - const pattern = new RegExp( - "^(https?:\\/\\/)?" + // protocol - "((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|" + // domain name - "((\\d{1,3}\\.){3}\\d{1,3}))" + // OR ip (v4) address - "(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*" + // port and path - "(\\?[;&a-z\\d%_.~+=-]*)?" + // query string - "(\\#[-a-z\\d_]*)?$", - "i" - ); - for (const t of types) { - switch (t) { - case "*big.Int": - exist[ - "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" - ] = true; - break; - case "*fastjson.Value": - exist["github.com/valyala/fastjson"] = true; - break; - default: - if (pattern.test(t)) { - exist[t] = true; - } - break; + for (let t of types) { + t = t.trim(); + if (t.endsWith("big.Int")) { + exist[ + "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" + ] = true; + } else if (t.endsWith("fastjson.Value")) { + exist["github.com/valyala/fastjson"] = true; + } else if (/([^/\s]+\/)(.*)/.test(t)) { + exist[t] = true; } } - const imports: Array = [ - "github.com/consideritdone/polywrap-go/polywrap/msgpack", - ]; + const imports: Array = []; imports.push(...Object.keys(exist)); const txt = imports .sort() - .map((imp) => `\t"${imp}"`) + .map((imp) => { + let res = ""; + if (imp.startsWith(". ")) { + res = `. "${imp.slice(2)}"`; + } else { + const parts = imp.split(" as "); + if (parts.length > 1) { + res = `${parts[1]} "${parts[0]}"`; + } else { + res = `"${imp}"`; + } + } + return `\t${res}`; + }) .join("\n"); - return `import (\n${txt}\n)`; + return txt !== "" ? `\nimport (\n${txt}\n)\n\n` : "\n"; }; }; @@ -220,33 +217,6 @@ export const toMsgPack: MustacheFn = () => { }; }; -export const typeable: MustacheFn = () => { - return (value: string, render: (template: string) => string) => { - const type = render(value); - switch (type) { - case "int8": - case "int16": - case "int32": - case "int64": - case "uint8": - case "uint16": - case "uint32": - case "uint64": - case "string": - case "bool": - case "[]byte": - case "*big.Int": - case "*fastjson.Value": - return type; - default: - if (type.startsWith("*")) { - return `*types.${type.slice(1)}`; - } - return `types.${type}`; - } - }; -}; - export const toWasm: MustacheFn = () => { return (value: string, render: (template: string) => string) => { let type = render(value); @@ -376,69 +346,32 @@ const applyOptional = (type: string, optional: boolean, _: boolean): string => { } }; -function replaceAt(str: string, index: number, replacement: string): string { - return ( - str.substr(0, index) + replacement + str.substr(index + replacement.length) - ); -} - export const toLower: MustacheFn = () => { return (value: string, render: (template: string) => string) => { - let type = render(value); - - for (let i = 0; i < type.length; ++i) { - const char = type.charAt(i); - const lower = char.toLowerCase(); - - if (char !== lower) { - // Replace the uppercase char w/ the lowercase version - type = replaceAt(type, i, lower); - - // if (i !== 0 && type[i - 1] !== "_") { - // // Make sure all lowercase conversions have an underscore before them - // type = insertAt(type, i, "_"); - // } - } - } - - return type; + return render(value) + .split("") + .map((v) => v.toLowerCase()) + .join(""); }; }; export const toFirstLower: MustacheFn = () => { return (value: string, render: (template: string) => string) => { - let type = render(value); - - // First character must always be upper case - const firstChar = type.charAt(0); - const firstLower = firstChar.toLowerCase(); - type = replaceAt(type, 0, firstLower); - - return type; + const type = render(value); + return type.charAt(0).toLowerCase() + type.slice(1); }; }; export const toUpper: MustacheFn = () => { return (value: string, render: (template: string) => string) => { - let type = render(value); - - // First character must always be upper case - const firstChar = type.charAt(0); - const firstUpper = firstChar.toUpperCase(); - type = replaceAt(type, 0, firstUpper); - - // Look for any underscores, remove them if they exist, and make next letter uppercase - // for (let i = 0; i < type.length; ++i) { - // const char = type.charAt(i); - // - // if (char === "_") { - // const nextChar = type.charAt(i + 1); - // const nextCharUpper = nextChar.toUpperCase(); - // type = replaceAt(type, i + 1, nextCharUpper); - // type = removeAt(type, i); - // } - // } + const type = render(value); + return type.charAt(0).toUpperCase() + type.slice(1); + }; +}; - return type; +export const pkgName: MustacheFn = () => { + return (text: string, render: (template: string) => string): string => { + const name = render(text); + return reservedWordsAS.has(name) ? `pkg${name}` : name; }; }; diff --git a/packages/schema/bind/src/bindings/golang/reservedWords.ts b/packages/schema/bind/src/bindings/golang/reservedWords.ts index f962c6f7b5..696a767cb4 100644 --- a/packages/schema/bind/src/bindings/golang/reservedWords.ts +++ b/packages/schema/bind/src/bindings/golang/reservedWords.ts @@ -198,4 +198,29 @@ export const reservedWordsAS: Set = new Set([ "__visit", "__newBuffer", "__newArray", + "break", + "default", + "func", + "interface", + "select", + "case", + "defer", + "go", + "map", + "struct", + "chan", + "else", + "goto", + "package", + "switch", + "const", + "fallthrough", + "if", + "range", + "type", + "continue", + "for", + "import", + "return", + "var", ]); diff --git a/packages/schema/bind/src/bindings/golang/wasm/index.ts b/packages/schema/bind/src/bindings/golang/wasm/index.ts index 3102d038b3..8eb30576ad 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/index.ts +++ b/packages/schema/bind/src/bindings/golang/wasm/index.ts @@ -3,6 +3,7 @@ import { GenerateBindingFn } from "../.."; import { renderTemplates } from "../.."; import { loadSubTemplates } from "../../utils"; import { BindOptions, BindOutput } from "../../.."; +import { reservedWordsAS } from "../reservedWords"; import { Abi, @@ -19,6 +20,10 @@ const subTemplates = loadSubTemplates(templatesDir.entries); const templatePath = (subpath: string) => path.join(__dirname, "./templates", subpath); +function pkgName(str: string): string { + return reservedWordsAS.has(str) ? `pkg${str}` : str; +} + function camel2snake(str: string): string { str = str.replace(/([A-Z])/g, "_$1"); str = str.startsWith("_") ? str.slice(1) : str; @@ -61,7 +66,7 @@ export const generateBinding: GenerateBindingFn = ( for (const importedModuleType of abi.importedModuleTypes) { importEntries.push({ type: "Directory", - name: `${camel2snake(importedModuleType.namespace)}`, + name: `${pkgName(camel2snake(importedModuleType.namespace))}`, data: renderTemplates( templatePath("imported/module-type"), importedModuleType, @@ -76,7 +81,7 @@ export const generateBinding: GenerateBindingFn = ( for (const importedEnvType of abi.importedEnvTypes) { importEntries.push({ type: "Directory", - name: `${camel2snake(importedEnvType.namespace)}`, + name: `${pkgName(camel2snake(importedEnvType.namespace))}`, data: renderTemplates( templatePath("imported/env-type"), importedEnvType, @@ -91,7 +96,7 @@ export const generateBinding: GenerateBindingFn = ( for (const importedEnumType of abi.importedEnumTypes) { importEntries.push({ type: "Directory", - name: `${camel2snake(importedEnumType.namespace)}`, + name: `${pkgName(camel2snake(importedEnumType.namespace))}`, data: renderTemplates( templatePath("imported/enum-type"), importedEnumType, @@ -106,7 +111,7 @@ export const generateBinding: GenerateBindingFn = ( for (const importedObectType of abi.importedObjectTypes) { importEntries.push({ type: "Directory", - name: `${camel2snake(importedObectType.namespace)}`, + name: `${pkgName(camel2snake(importedObectType.namespace))}`, data: renderTemplates( templatePath("imported/object-type"), importedObectType, @@ -144,12 +149,26 @@ export const generateBinding: GenerateBindingFn = ( // Generate module type folders if (abi.moduleType) { + const imports: { [key: string]: boolean } = {}; + abi.moduleType.methods?.forEach(function (method) { + method.arguments?.forEach(function (arg) { + const tp = abi.importedObjectTypes?.find(function (mt) { + return mt.type === arg.type; + }); + if (tp) { + imports[tp.namespace] = true; + } + }); + }); + const importedTypes = Object.keys(imports).map((namespace) => ({ + namespace, + })); output.entries.push({ type: "Directory", name: "types", data: renderTemplates( templatePath("module-type/types"), - { goImport, ...abi.moduleType }, + { importedTypes, goImport, ...abi.moduleType }, subTemplates ), }); @@ -158,7 +177,7 @@ export const generateBinding: GenerateBindingFn = ( name: "module", data: renderTemplates( templatePath("module-type/module"), - { goImport, ...abi.moduleType }, + { importedTypes, goImport, ...abi.moduleType }, subTemplates ), }); diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%-go.mustache index 4cc1a1eea6..5f8f4bb605 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%-go.mustache @@ -1,6 +1,6 @@ package types -{{#makeImports}}{{#properties}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/properties}}{{/makeImports}} +{{#makeImports}}github.com/consideritdone/polywrap-go/polywrap/msgpack,{{#properties}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/properties}}{{/makeImports}} type {{#toUpper}}{{type}}{{/toUpper}} struct { {{#stuctProps}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%Serialization-go.mustache index 0574f0e584..e5f6038776 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%Serialization-go.mustache @@ -1,6 +1,6 @@ package types -{{#makeImports}}{{#properties}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/properties}}{{/makeImports}} +{{#makeImports}}github.com/consideritdone/polywrap-go/polywrap/msgpack,{{#properties}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/properties}}{{/makeImports}} func serialize{{#toUpper}}{{type}}{{/toUpper}}(value *{{#toUpper}}{{type}}{{/toUpper}}) []byte { ctx := msgpack.NewContext("Serializing (encoding) env-type: {{#toUpper}}{{type}}{{/toUpper}}") diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/enum-type/Enum%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/enum-type/Enum%type%-go.mustache index 1bd32360c5..72cd7bfeb6 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/enum-type/Enum%type%-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/enum-type/Enum%type%-go.mustache @@ -1,4 +1,4 @@ -package {{#toSnakeCase}}{{namespace}}{{/toSnakeCase}} +package {{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}} type {{#toUpper}}{{type}}{{/toUpper}} int32 diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%-go.mustache index 7f50e2c6a6..b650c91755 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%-go.mustache @@ -1,7 +1,10 @@ -package {{#toSnakeCase}}{{namespace}}{{/toSnakeCase}} - -{{#makeImports}}{{#properties}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/properties}}{{/makeImports}} - +package {{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}} +{{#makeImports}} + github.com/consideritdone/polywrap-go/polywrap/msgpack, + {{#properties}} + {{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}} + {{/properties}} +{{/makeImports}} type {{#toUpper}}{{type}}{{/toUpper}} struct { {{#stuctProps}} {{#properties}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%Serialization-go.mustache index ac4ea04a6f..af9a965b12 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%Serialization-go.mustache @@ -1,7 +1,10 @@ -package {{#toSnakeCase}}{{namespace}}{{/toSnakeCase}} - -{{#makeImports}}{{#properties}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/properties}}{{/makeImports}} - +package {{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}} +{{#makeImports}} + github.com/consideritdone/polywrap-go/polywrap/msgpack, + {{#properties}} + {{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}} + {{/properties}} +{{/makeImports}} func serialize{{#toUpper}}{{type}}{{/toUpper}}(value *{{#toUpper}}{{type}}{{/toUpper}}) []byte { ctx := msgpack.NewContext("Serializing (encoding) env-type: {{#toUpper}}{{type}}{{/toUpper}}") encoder := msgpack.NewWriteEncoder(ctx) diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/interface-type/%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/interface-type/%type%-go.mustache index c63551016a..c433d42468 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/interface-type/%type%-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/interface-type/%type%-go.mustache @@ -1,4 +1,4 @@ -package {{#toSnakeCase}}{{namespace}}{{/toSnakeCase}} +package {{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}} {{#capabilities}} {{#getImplementations}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Serialization-go.mustache index e908e48bfc..c30f7d21ec 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Serialization-go.mustache @@ -1,7 +1,10 @@ -package {{#toSnakeCase}}{{namespace}}{{/toSnakeCase}} - -{{#makeImports}}{{#arguments}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/arguments}}{{/makeImports}} - +package {{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}} +{{#makeImports}} + github.com/consideritdone/polywrap-go/polywrap/msgpack, + {{#arguments}} + {{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}} + {{/arguments}} +{{/makeImports}} {{#methods}} type Args{{#toUpper}}{{name}}{{/toUpper}} struct { {{#stuctProps}} @@ -19,6 +22,7 @@ func Serialize{{#toUpper}}{{name}}{{/toUpper}}Args(value *Args{{#toUpper}}{{name } func Write{{#toUpper}}{{name}}{{/toUpper}}Args(writer msgpack.Write, value *Args{{#toUpper}}{{name}}{{/toUpper}}) { + {{#arguments.length}} writer.WriteMapLength({{arguments.length}}) {{#arguments}} writer.Context().Push("{{name}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") @@ -44,6 +48,7 @@ func Write{{#toUpper}}{{name}}{{/toUpper}}Args(writer msgpack.Write, value *Args {{/enum}} writer.Context().Pop() {{/arguments}} + {{/arguments.length}} } func Deserialize{{#toUpper}}{{name}}{{/toUpper}}Result(argsBuf []byte) {{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}} { diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Wrapped-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Wrapped-go.mustache index 74b5f3e794..3f4fe38bd8 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Wrapped-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Wrapped-go.mustache @@ -1,4 +1,4 @@ -package {{#toSnakeCase}}{{namespace}}{{/toSnakeCase}} +package {{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}} {{#methods.length}} import ( @@ -10,11 +10,16 @@ import ( {{#methods}} func {{#toUpper}}{{type}}{{/toUpper}}{{#toUpper}}{{name}}{{/toUpper}}(args *Args{{#toUpper}}{{name}}{{/toUpper}}) ({{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}, error) { argsBuf := Serialize{{#toUpper}}{{name}}{{/toUpper}}Args(args) - data, err := polywrap.WrapSubinvoke("{{uri}}", "{{name}}", argsBuf) - if err != nil { - return nil, result.Error() + var ( + err error + raw []byte + data {{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}} + ) + raw, err = polywrap.WrapSubinvoke("{{uri}}", "{{name}}", argsBuf) + if err == nil { + data = Deserialize{{#toUpper}}{{name}}{{/toUpper}}Result(raw) } - return Deserialize{{#toUpper}}{{name}}{{/toUpper}}Result(result.unwrap()), nil + return data, err } {{^last}} @@ -25,11 +30,16 @@ func {{#toUpper}}{{type}}{{/toUpper}}{{#toUpper}}{{name}}{{/toUpper}}(args *Args {{#methods}} func {{#toUpper}}{{type}}{{/toUpper}}{{#toUpper}}{{name}}{{/toUpper}}(uri string, args *Args{{#toUpper}}{{name}}{{/toUpper}}) ({{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}, error) { argsBuf := Serialize{{#toUpper}}{{name}}{{/toUpper}}Args(args) - data, err := polywrap.WrapSubinvokeImplementation("{{uri}}", uri, "{{name}}", argsBuf) - if err != nil { - return nil, err + var ( + err error + raw []byte + data {{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}} + ) + raw, err = polywrap.WrapSubinvokeImplementation("{{uri}}", uri, "{{name}}", argsBuf) + if err == nil { + data = Deserialize{{#toUpper}}{{name}}{{/toUpper}}Result(raw) } - return Deserialize{{#toUpper}}{{name}}{{/toUpper}}Result(data), nil + return data, err } {{^last}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%-go.mustache index 7f50e2c6a6..b650c91755 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%-go.mustache @@ -1,7 +1,10 @@ -package {{#toSnakeCase}}{{namespace}}{{/toSnakeCase}} - -{{#makeImports}}{{#properties}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/properties}}{{/makeImports}} - +package {{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}} +{{#makeImports}} + github.com/consideritdone/polywrap-go/polywrap/msgpack, + {{#properties}} + {{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}} + {{/properties}} +{{/makeImports}} type {{#toUpper}}{{type}}{{/toUpper}} struct { {{#stuctProps}} {{#properties}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%Serialization-go.mustache index 3274d8b9c4..8623350c71 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%Serialization-go.mustache @@ -1,7 +1,10 @@ -package {{#toSnakeCase}}{{namespace}}{{/toSnakeCase}} - -{{#makeImports}}{{#properties}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/properties}}{{/makeImports}} - +package {{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}} +{{#makeImports}} + github.com/consideritdone/polywrap-go/polywrap/msgpack, + {{#properties}} + {{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}} + {{/properties}} +{{/makeImports}} func serialize{{#toUpper}}{{type}}{{/toUpper}}(value *{{#toUpper}}{{type}}{{/toUpper}}) []byte { ctx := msgpack.NewContext("Serializing (encoding) env-type: {{#toUpper}}{{type}}{{/toUpper}}") encoder := msgpack.NewWriteEncoder(ctx) diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Serialization-go.mustache index 6bd9f9c0f1..2cc45f280f 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Serialization-go.mustache @@ -1,11 +1,18 @@ package module - -{{#makeImports}}{{goImport}}/wrap/types,{{#arguments}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/arguments}}{{/makeImports}} - +{{#makeImports}} + github.com/consideritdone/polywrap-go/polywrap/msgpack, + . {{goImport}}/wrap/types, + {{#importedTypes}} + . {{goImport}}/wrap/imported/{{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}}, + {{/importedTypes}} + {{#methods}} + {{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}, + {{/methods}} +{{/makeImports}} {{#methods}} -func deserialize{{#toUpper}}{{name}}{{/toUpper}}Args(argsBuf []byte) *types.Args{{#toUpper}}{{name}}{{/toUpper}} { +{{#arguments.length}} +func Deserialize{{#toUpper}}{{name}}{{/toUpper}}Args(argsBuf []byte) *MethodArgs{{#toUpper}}{{name}}{{/toUpper}} { ctx := msgpack.NewContext("Deserializing module-type: {{#toUpper}}{{name}}{{/toUpper}}") - {{#arguments.length}} reader := msgpack.NewReadDecoder(ctx, argsBuf) var ( @@ -51,8 +58,8 @@ func deserialize{{#toUpper}}{{name}}{{/toUpper}}Args(argsBuf []byte) *types.Args reader.Context().Pop() {{/arguments}} } - reader.Context().Pop() - } + reader.Context().Pop() + } {{#arguments}} {{#required}} @@ -61,9 +68,8 @@ func deserialize{{#toUpper}}{{name}}{{/toUpper}}Args(argsBuf []byte) *types.Args } {{/required}} {{/arguments}} - {{/arguments.length}} - return &types.Args{{#toUpper}}{{name}}{{/toUpper}}{ + return &MethodArgs{{#toUpper}}{{name}}{{/toUpper}}{ {{#stuctProps}} {{#arguments}} {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}: _{{name}}, @@ -71,15 +77,16 @@ func deserialize{{#toUpper}}{{name}}{{/toUpper}}Args(argsBuf []byte) *types.Args {{/stuctProps}} } } +{{/arguments.length}} -func Serialize{{#toUpper}}{{name}}{{/toUpper}}Result(value {{#return}}{{#typeable}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/typeable}}{{/return}}) []byte { +func Serialize{{#toUpper}}{{name}}{{/toUpper}}Result(value {{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}) []byte { ctx := msgpack.NewContext("Serializing module-type: {{#toUpper}}{{name}}{{/toUpper}}") encoder := msgpack.NewWriteEncoder(ctx) Write{{#toUpper}}{{name}}{{/toUpper}}Result(encoder, value); return encoder.Buffer() } -func Write{{#toUpper}}{{name}}{{/toUpper}}Result(writer msgpack.Write, value {{#return}}{{#typeable}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/typeable}}{{/return}}) { +func Write{{#toUpper}}{{name}}{{/toUpper}}Result(writer msgpack.Write, value {{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}) { {{#return}} writer.Context().Push("{{name}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") {{#scalar}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Wrapped-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Wrapped-go.mustache index f3da3b7cfe..65dd8ec082 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Wrapped-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Wrapped-go.mustache @@ -1,14 +1,8 @@ package module - -{{#methods.length}} -import ( - {{#env}} - "github.com/consideritdone/polywrap-go/polywrap" - {{/env}} - methods "{{goImport}}/module" -) -{{/methods.length}} - +{{#makeImports}} + {{#methods}}{{#env}}github.com/consideritdone/polywrap-go/polywrap,. {{goImport}}/wrap/types,{{/env}}{{/methods}} + {{goImport}}/module as methods, +{{/makeImports}} {{#methods}} func {{#toUpper}}{{name}}{{/toUpper}}Wrapped(argsBuf []byte, envSize uint32) []byte { {{#env}} @@ -25,11 +19,13 @@ func {{#toUpper}}{{name}}{{/toUpper}}Wrapped(argsBuf []byte, envSize uint32) []b {{/env}} {{#arguments.length}} - args := deserialize{{#toUpper}}{{name}}{{/toUpper}}Args(argsBuf) + args := Deserialize{{#toUpper}}{{name}}{{/toUpper}}Args(argsBuf) {{/arguments.length}} - result := methods.{{#toUpper}}{{name}}{{/toUpper}}({{#arguments.length}}args{{/arguments.length}}{{^arguments.length}}nil{{/arguments.length}}{{#env}}, env{{/env}}) + result := methods.{{#toUpper}}{{name}}{{/toUpper}}({{#arguments.length}}args{{#env}},{{/env}}{{/arguments.length}}{{#env}}env{{/env}}) return Serialize{{#toUpper}}{{name}}{{/toUpper}}Result(result) } +{{^last}} -{{/methods}} +{{/last}} +{{/methods}} \ No newline at end of file diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache index 6beabd9e0e..cfcdeba108 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache @@ -1,14 +1,24 @@ package types - - +{{#makeImports}} + {{#importedTypes}} + . {{goImport}}/wrap/imported/{{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}}, + {{/importedTypes}} + {{#methods}} + {{#arguments}} + {{#toWasm}}{{toGraphQLType}}{{/toWasm}}, + {{/arguments}} + {{/methods}} +{{/makeImports}} {{#methods}} -type Args{{#toUpper}}{{name}}{{/toUpper}} struct { +{{#arguments.length}} +type MethodArgs{{#toUpper}}{{name}}{{/toUpper}} struct { {{#stuctProps}} {{#arguments}} {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} {{/arguments}} {{/stuctProps}} } +{{/arguments.length}} {{^last}} {{/last}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%-go.mustache index b17610926a..ad2d15cd14 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%-go.mustache @@ -1,7 +1,10 @@ package types - -{{#makeImports}}{{#properties}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/properties}}{{/makeImports}} - +{{#makeImports}} + github.com/consideritdone/polywrap-go/polywrap/msgpack, + {{#properties}} + {{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}} + {{/properties}} +{{/makeImports}} type {{#toUpper}}{{type}}{{/toUpper}} struct { {{#stuctProps}} {{#properties}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%Serialization-go.mustache index 93bec1a7d4..f5964d5008 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%Serialization-go.mustache @@ -1,7 +1,10 @@ package types - -{{#makeImports}}{{#properties}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/properties}}{{/makeImports}} - +{{#makeImports}} + github.com/consideritdone/polywrap-go/polywrap/msgpack, + {{#properties}} + {{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}} + {{/properties}} +{{/makeImports}} func serialize{{#toUpper}}{{type}}{{/toUpper}}(value *{{#toUpper}}{{type}}{{/toUpper}}) []byte { ctx := msgpack.NewContext("Serializing (encoding) env-type: {{#toUpper}}{{type}}{{/toUpper}}") encoder := msgpack.NewWriteEncoder(ctx) diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/value_serialize_object.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/value_serialize_object.mustache index b01650869d..3b6ae4d7c6 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/value_serialize_object.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/value_serialize_object.mustache @@ -1,9 +1,9 @@ { v := value{{#lastFullIter}}i{{/lastFullIter}} {{#required}} - types.{{#toUpper}}{{type}}{{/toUpper}}Write(writer, &v) + {{#toUpper}}{{type}}{{/toUpper}}Write(writer, &v) {{/required}} {{^required}} - types.{{#toUpper}}{{type}}{{/toUpper}}Write(writer, v) + {{#toUpper}}{{type}}{{/toUpper}}Write(writer, v) {{/required}} } diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_wrapped.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_wrapped.go index 9273cd4e30..4a46374cc5 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_wrapped.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_wrapped.go @@ -6,18 +6,28 @@ import ( func MethodImportedMethod(uri string, args *ArgsImportedMethod) (*TestImport_Object, error) { argsBuf := SerializeImportedMethodArgs(args) - data, err := polywrap.WrapSubinvokeImplementation("testimport.uri.eth", uri, "importedMethod", argsBuf) - if err != nil { - return nil, err + var ( + err error + raw []byte + data *TestImport_Object + ) + raw, err = polywrap.WrapSubinvokeImplementation("testimport.uri.eth", uri, "importedMethod", argsBuf) + if err == nil { + data = DeserializeImportedMethodResult(raw) } - return DeserializeImportedMethodResult(data), nil + return data, err } func MethodAnotherMethod(uri string, args *ArgsAnotherMethod) (int32, error) { argsBuf := SerializeAnotherMethodArgs(args) - data, err := polywrap.WrapSubinvokeImplementation("testimport.uri.eth", uri, "anotherMethod", argsBuf) - if err != nil { - return nil, err + var ( + err error + raw []byte + data int32 + ) + raw, err = polywrap.WrapSubinvokeImplementation("testimport.uri.eth", uri, "anotherMethod", argsBuf) + if err == nil { + data = DeserializeAnotherMethodResult(raw) } - return DeserializeAnotherMethodResult(data), nil + return data, err } diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_serialization.go index b076f507c3..2bc6f24e14 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_serialization.go @@ -1,11 +1,11 @@ package module import ( + . "github.com/testorg/testrepo/wrap/types" "github.com/consideritdone/polywrap-go/polywrap/msgpack" - "github.com/testorg/testrepo/wrap/types" ) -func DeserializeModuleMethodArgs(argsBuf []byte) *types.ArgsModuleMethod { +func DeserializeModuleMethodArgs(argsBuf []byte) *MethodArgsModuleMethod { ctx := msgpack.NewContext("Deserializing module-type: ModuleMethod") reader := msgpack.NewReadDecoder(ctx, argsBuf) @@ -32,27 +32,26 @@ func DeserializeModuleMethodArgs(argsBuf []byte) *types.ArgsModuleMethod { for i := int32(reader.ReadMapLength()); i > 0; i-- { field := reader.ReadString() reader.Context().Push(field, "unknown", "searching for property type") - reader.Context().Pop() switch field { - case "Str": + case "str": reader.Context().Push(field, "string", "type found, reading property") _str = reader.ReadString() _strSet = true reader.Context().Pop() - case "OptStr": + case "optStr": reader.Context().Push(field, "*string", "type found, reading property") if !reader.IsNil() { v := reader.ReadString() _optStr = &v } reader.Context().Pop() - case "En": + case "en": reader.Context().Push(field, "CustomEnum", "type found, reading property") _en = CustomEnum(reader.ReadI32()) SanitizeCustomEnumValue(int32(_en)) _enSet = true reader.Context().Pop() - case "OptEnum": + case "optEnum": reader.Context().Push(field, "*CustomEnum", "type found, reading property") if !reader.IsNil() { v := CustomEnum(reader.ReadI32()) @@ -60,7 +59,7 @@ func DeserializeModuleMethodArgs(argsBuf []byte) *types.ArgsModuleMethod { _optEnum = &v } reader.Context().Pop() - case "EnumArray": + case "enumArray": reader.Context().Push(field, "[]CustomEnum", "type found, reading property") if reader.IsNil() { _enumArray = nil @@ -74,7 +73,7 @@ func DeserializeModuleMethodArgs(argsBuf []byte) *types.ArgsModuleMethod { } _enumArraySet = true reader.Context().Pop() - case "OptEnumArray": + case "optEnumArray": reader.Context().Push(field, "[]*CustomEnum", "type found, reading property") if reader.IsNil() { _optEnumArray = nil @@ -90,7 +89,7 @@ func DeserializeModuleMethodArgs(argsBuf []byte) *types.ArgsModuleMethod { } } reader.Context().Pop() - case "Map": + case "m_map": reader.Context().Push(field, "map[string]int32", "type found, reading property") if reader.IsNil() { _map = nil @@ -104,7 +103,7 @@ func DeserializeModuleMethodArgs(argsBuf []byte) *types.ArgsModuleMethod { } _mapSet = true reader.Context().Pop() - case "MapOfArr": + case "mapOfArr": reader.Context().Push(field, "map[string][]int32", "type found, reading property") if reader.IsNil() { _mapOfArr = nil @@ -126,7 +125,7 @@ func DeserializeModuleMethodArgs(argsBuf []byte) *types.ArgsModuleMethod { } _mapOfArrSet = true reader.Context().Pop() - case "MapOfObj": + case "mapOfObj": reader.Context().Push(field, "map[string]AnotherType", "type found, reading property") if reader.IsNil() { _mapOfObj = nil @@ -142,7 +141,7 @@ func DeserializeModuleMethodArgs(argsBuf []byte) *types.ArgsModuleMethod { } _mapOfObjSet = true reader.Context().Pop() - case "MapOfArrOfObj": + case "mapOfArrOfObj": reader.Context().Push(field, "map[string][]AnotherType", "type found, reading property") if reader.IsNil() { _mapOfArrOfObj = nil @@ -167,6 +166,7 @@ func DeserializeModuleMethodArgs(argsBuf []byte) *types.ArgsModuleMethod { _mapOfArrOfObjSet = true reader.Context().Pop() } + reader.Context().Pop() } if !_strSet { @@ -191,14 +191,14 @@ func DeserializeModuleMethodArgs(argsBuf []byte) *types.ArgsModuleMethod { panic(reader.Context().PrintWithContext("Missing required property: 'mapOfArrOfObj: Map'")) } - return &types.ArgsModuleMethod{ + return &MethodArgsModuleMethod{ Str: _str, OptStr: _optStr, En: _en, OptEnum: _optEnum, EnumArray: _enumArray, OptEnumArray: _optEnumArray, - Map: _map, + M_map: _map, MapOfArr: _mapOfArr, MapOfObj: _mapOfObj, MapOfArrOfObj: _mapOfArrOfObj, @@ -221,7 +221,7 @@ func WriteModuleMethodResult(writer msgpack.Write, value int32) { writer.Context().Pop() } -func DeserializeObjectMethodArgs(argsBuf []byte) *types.ArgsObjectMethod { +func DeserializeObjectMethodArgs(argsBuf []byte) *MethodArgsObjectMethod { ctx := msgpack.NewContext("Deserializing module-type: ObjectMethod") reader := msgpack.NewReadDecoder(ctx, argsBuf) @@ -237,22 +237,21 @@ func DeserializeObjectMethodArgs(argsBuf []byte) *types.ArgsObjectMethod { for i := int32(reader.ReadMapLength()); i > 0; i-- { field := reader.ReadString() reader.Context().Push(field, "unknown", "searching for property type") - reader.Context().Pop() switch field { - case "Object": + case "object": reader.Context().Push(field, "AnotherType", "type found, reading property") if v := AnotherTypeRead(reader); v != nil { _object = *v } _objectSet = true reader.Context().Pop() - case "OptObject": + case "optObject": reader.Context().Push(field, "*AnotherType", "type found, reading property") if v := AnotherTypeRead(reader); v != nil { _optObject = v } reader.Context().Pop() - case "ObjectArray": + case "objectArray": reader.Context().Push(field, "[]AnotherType", "type found, reading property") if reader.IsNil() { _objectArray = nil @@ -267,7 +266,7 @@ func DeserializeObjectMethodArgs(argsBuf []byte) *types.ArgsObjectMethod { } _objectArraySet = true reader.Context().Pop() - case "OptObjectArray": + case "optObjectArray": reader.Context().Push(field, "[]*AnotherType", "type found, reading property") if reader.IsNil() { _optObjectArray = nil @@ -282,6 +281,7 @@ func DeserializeObjectMethodArgs(argsBuf []byte) *types.ArgsObjectMethod { } reader.Context().Pop() } + reader.Context().Pop() } if !_objectSet { @@ -291,7 +291,7 @@ func DeserializeObjectMethodArgs(argsBuf []byte) *types.ArgsObjectMethod { panic(reader.Context().PrintWithContext("Missing required property: 'objectArray: [AnotherType]'")) } - return &types.ArgsObjectMethod{ + return &MethodArgsObjectMethod{ Object: _object, OptObject: _optObject, ObjectArray: _objectArray, @@ -299,23 +299,23 @@ func DeserializeObjectMethodArgs(argsBuf []byte) *types.ArgsObjectMethod { } } -func SerializeObjectMethodResult(value *types.AnotherType) []byte { +func SerializeObjectMethodResult(value *AnotherType) []byte { ctx := msgpack.NewContext("Serializing module-type: ObjectMethod") encoder := msgpack.NewWriteEncoder(ctx) WriteObjectMethodResult(encoder, value); return encoder.Buffer() } -func WriteObjectMethodResult(writer msgpack.Write, value *types.AnotherType) { +func WriteObjectMethodResult(writer msgpack.Write, value *AnotherType) { writer.Context().Push("objectMethod", "*AnotherType", "writing property") { v := value - types.AnotherTypeWrite(writer, v) + AnotherTypeWrite(writer, v) } writer.Context().Pop() } -func DeserializeOptionalEnvMethodArgs(argsBuf []byte) *types.ArgsOptionalEnvMethod { +func DeserializeOptionalEnvMethodArgs(argsBuf []byte) *MethodArgsOptionalEnvMethod { ctx := msgpack.NewContext("Deserializing module-type: OptionalEnvMethod") reader := msgpack.NewReadDecoder(ctx, argsBuf) @@ -331,22 +331,21 @@ func DeserializeOptionalEnvMethodArgs(argsBuf []byte) *types.ArgsOptionalEnvMeth for i := int32(reader.ReadMapLength()); i > 0; i-- { field := reader.ReadString() reader.Context().Push(field, "unknown", "searching for property type") - reader.Context().Pop() switch field { - case "Object": + case "object": reader.Context().Push(field, "AnotherType", "type found, reading property") if v := AnotherTypeRead(reader); v != nil { _object = *v } _objectSet = true reader.Context().Pop() - case "OptObject": + case "optObject": reader.Context().Push(field, "*AnotherType", "type found, reading property") if v := AnotherTypeRead(reader); v != nil { _optObject = v } reader.Context().Pop() - case "ObjectArray": + case "objectArray": reader.Context().Push(field, "[]AnotherType", "type found, reading property") if reader.IsNil() { _objectArray = nil @@ -361,7 +360,7 @@ func DeserializeOptionalEnvMethodArgs(argsBuf []byte) *types.ArgsOptionalEnvMeth } _objectArraySet = true reader.Context().Pop() - case "OptObjectArray": + case "optObjectArray": reader.Context().Push(field, "[]*AnotherType", "type found, reading property") if reader.IsNil() { _optObjectArray = nil @@ -376,6 +375,7 @@ func DeserializeOptionalEnvMethodArgs(argsBuf []byte) *types.ArgsOptionalEnvMeth } reader.Context().Pop() } + reader.Context().Pop() } if !_objectSet { @@ -385,7 +385,7 @@ func DeserializeOptionalEnvMethodArgs(argsBuf []byte) *types.ArgsOptionalEnvMeth panic(reader.Context().PrintWithContext("Missing required property: 'objectArray: [AnotherType]'")) } - return &types.ArgsOptionalEnvMethod{ + return &MethodArgsOptionalEnvMethod{ Object: _object, OptObject: _optObject, ObjectArray: _objectArray, @@ -393,23 +393,23 @@ func DeserializeOptionalEnvMethodArgs(argsBuf []byte) *types.ArgsOptionalEnvMeth } } -func SerializeOptionalEnvMethodResult(value *types.AnotherType) []byte { +func SerializeOptionalEnvMethodResult(value *AnotherType) []byte { ctx := msgpack.NewContext("Serializing module-type: OptionalEnvMethod") encoder := msgpack.NewWriteEncoder(ctx) WriteOptionalEnvMethodResult(encoder, value); return encoder.Buffer() } -func WriteOptionalEnvMethodResult(writer msgpack.Write, value *types.AnotherType) { +func WriteOptionalEnvMethodResult(writer msgpack.Write, value *AnotherType) { writer.Context().Push("optionalEnvMethod", "*AnotherType", "writing property") { v := value - types.AnotherTypeWrite(writer, v) + AnotherTypeWrite(writer, v) } writer.Context().Pop() } -func DeserializeIfArgs(argsBuf []byte) *types.ArgsIf { +func DeserializeIfArgs(argsBuf []byte) *MethodArgsIf { ctx := msgpack.NewContext("Deserializing module-type: If") reader := msgpack.NewReadDecoder(ctx, argsBuf) @@ -421,9 +421,8 @@ func DeserializeIfArgs(argsBuf []byte) *types.ArgsIf { for i := int32(reader.ReadMapLength()); i > 0; i-- { field := reader.ReadString() reader.Context().Push(field, "unknown", "searching for property type") - reader.Context().Pop() switch field { - case "M_if": + case "m_if": reader.Context().Push(field, "Else", "type found, reading property") if v := ElseRead(reader); v != nil { _if = *v @@ -431,29 +430,30 @@ func DeserializeIfArgs(argsBuf []byte) *types.ArgsIf { _ifSet = true reader.Context().Pop() } + reader.Context().Pop() } if !_ifSet { panic(reader.Context().PrintWithContext("Missing required property: 'if: else'")) } - return &types.ArgsIf{ + return &MethodArgsIf{ M_if: _if, } } -func SerializeIfResult(value types.Else) []byte { +func SerializeIfResult(value Else) []byte { ctx := msgpack.NewContext("Serializing module-type: If") encoder := msgpack.NewWriteEncoder(ctx) WriteIfResult(encoder, value); return encoder.Buffer() } -func WriteIfResult(writer msgpack.Write, value types.Else) { +func WriteIfResult(writer msgpack.Write, value Else) { writer.Context().Push("if", "Else", "writing property") { v := value - types.ElseWrite(writer, &v) + ElseWrite(writer, &v) } writer.Context().Pop() } diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_wrapped.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_wrapped.go index 3e003cad4b..286449f746 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_wrapped.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_wrapped.go @@ -1,8 +1,9 @@ package module import ( + . "github.com/testorg/testrepo/wrap/types" "github.com/consideritdone/polywrap-go/polywrap" - methods "github.com/testorg/testrepo" + methods "github.com/testorg/testrepo/module" ) func ModuleMethodWrapped(argsBuf []byte, envSize uint32) []byte { @@ -25,7 +26,7 @@ func ObjectMethodWrapped(argsBuf []byte, envSize uint32) []byte { args := DeserializeObjectMethodArgs(argsBuf) - result := methods.ObjectMethod(args, env) + result := methods.ObjectMethod(args,env) return SerializeObjectMethodResult(result) } @@ -38,7 +39,7 @@ func OptionalEnvMethodWrapped(argsBuf []byte, envSize uint32) []byte { args := DeserializeOptionalEnvMethodArgs(argsBuf) - result := methods.OptionalEnvMethod(args, env) + result := methods.OptionalEnvMethod(args,env) return SerializeOptionalEnvMethodResult(result) } @@ -49,4 +50,3 @@ func IfWrapped(argsBuf []byte, envSize uint32) []byte { result := methods.If(args) return SerializeIfResult(result) } - diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_args.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_args.go index fba2f3ead7..2ec6424513 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_args.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_args.go @@ -1,36 +1,32 @@ package types -import ( - "github.com/consideritdone/polywrap-go/polywrap/msgpack" -) - -type ArgsModuleMethod struct { +type MethodArgsModuleMethod struct { Str string OptStr *string En CustomEnum OptEnum *CustomEnum EnumArray []CustomEnum OptEnumArray []*CustomEnum - Map map[string]int32 + M_map map[string]int32 MapOfArr map[string][]int32 MapOfObj map[string]AnotherType MapOfArrOfObj map[string][]AnotherType } -type ArgsObjectMethod struct { +type MethodArgsObjectMethod struct { Object AnotherType OptObject *AnotherType ObjectArray []AnotherType OptObjectArray []*AnotherType } -type ArgsOptionalEnvMethod struct { +type MethodArgsOptionalEnvMethod struct { Object AnotherType OptObject *AnotherType ObjectArray []AnotherType OptObjectArray []*AnotherType } -type ArgsIf struct { +type MethodArgsIf struct { M_if Else } diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type.go index 129eedcb94..ae268082e8 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type.go @@ -44,7 +44,7 @@ type CustomType struct { OptEnum *CustomEnum EnumArray []CustomEnum OptEnumArray []*CustomEnum - Map map[string]int32 + M_map map[string]int32 MapOfArr map[string][]int32 MapOfObj map[string]AnotherType MapOfArrOfObj map[string][]AnotherType diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go index 743b468443..67a836ae91 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go @@ -474,17 +474,17 @@ func writeCustomType(writer msgpack.Write, value *CustomType) { } } writer.Context().Pop() - writer.Context().Push("Map", "map[string]int32", "writing property") - writer.WriteString("Map") - if value.Map == nil { + writer.Context().Push("M_map", "map[string]int32", "writing property") + writer.WriteString("M_map") + if value.M_map == nil { writer.WriteNil() - } else if len(value.Map) == 0 { + } else if len(value.M_map) == 0 { writer.WriteNil() } else { - for i0 := range value.Map { + for i0 := range value.M_map { writer.WriteString(i0) { - v := value.Map[i0] + v := value.M_map[i0] writer.WriteI32(v) } } @@ -1025,7 +1025,7 @@ func readCustomType(reader msgpack.Read) *CustomType { } } reader.Context().Pop() - case "Map": + case "M_map": reader.Context().Push(field, "map[string]int32", "type found, reading property") if reader.IsNil() { _map = nil @@ -1240,7 +1240,7 @@ func readCustomType(reader msgpack.Read) *CustomType { OptEnum: _optEnum, EnumArray: _enumArray, OptEnumArray: _optEnumArray, - Map: _map, + M_map: _map, MapOfArr: _mapOfArr, MapOfObj: _mapOfObj, MapOfArrOfObj: _mapOfArrOfObj, From b39fcef624c89bdbcafc9fd184259ab3ed3c0ed8 Mon Sep 17 00:00:00 2001 From: Ilnur Date: Tue, 6 Sep 2022 21:33:06 +0300 Subject: [PATCH 28/65] fix logic of function toWasmMap (#1214) --- packages/schema/bind/src/bindings/golang/functions.ts | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/packages/schema/bind/src/bindings/golang/functions.ts b/packages/schema/bind/src/bindings/golang/functions.ts index 6c5e836981..008da8bf54 100644 --- a/packages/schema/bind/src/bindings/golang/functions.ts +++ b/packages/schema/bind/src/bindings/golang/functions.ts @@ -320,15 +320,14 @@ const toWasmMap = (type: string, optional: boolean): string => { const keyValTypes = type .substring(firstOpenBracketIdx + 1, lastCloseBracketIdx) - .split(",") - .map((x) => x.trim()); + .split(","); - if (keyValTypes.length !== 2 || !keyValTypes[0] || !keyValTypes[1]) { + if (keyValTypes.length < 2) { throw new Error(`Invalid Map: ${type}`); } - const keyType = toWasm()(keyValTypes[0], (str) => str); - const valType = toWasm()(keyValTypes[1], (str) => str); + const keyType = toWasm()(keyValTypes[0].trim(), (str) => str); + const valType = toWasm()(keyValTypes.slice(1).join(",").trim(), (str) => str); return applyOptional(`map[${keyType}]${valType}`, optional, false); }; From ba2335df7921213f98ee64b97579ade930a465a1 Mon Sep 17 00:00:00 2001 From: Cesar Date: Mon, 24 Apr 2023 08:00:09 +0200 Subject: [PATCH 29/65] chore: first iteration of build strategies with golang + add tood --- .../strategies/DockerVMStrategy.ts | 5 ++ .../build-images/wasm/golang/index.ts | 60 ---------------- .../wasm/go/manifest.ext.json | 0 .../wasm/go/polywrap.build.yaml | 3 - .../wasm/golang/default.build.yaml | 4 ++ .../wasm/golang/image}/Dockerfile.mustache | 2 +- .../wasm/golang/manifest.ext.json | 22 ++++++ .../golang/wasm/templates/main-go.mustache | 2 +- .../module/%type%Serialization-go.mustache | 4 +- .../module/%type%Wrapped-go.mustache | 2 +- .../module-type/types/%type%Args-go.mustache | 2 +- todo | 7 ++ yarn.lock | 71 ++++++++++--------- 13 files changed, 83 insertions(+), 101 deletions(-) delete mode 100644 packages/cli/src/lib/defaults/build-images/wasm/golang/index.ts delete mode 100644 packages/cli/src/lib/defaults/build-strategies/wasm/go/manifest.ext.json delete mode 100644 packages/cli/src/lib/defaults/build-strategies/wasm/go/polywrap.build.yaml create mode 100644 packages/cli/src/lib/defaults/build-strategies/wasm/golang/default.build.yaml rename packages/cli/src/lib/defaults/{build-images/wasm/golang => build-strategies/wasm/golang/image}/Dockerfile.mustache (76%) create mode 100644 packages/cli/src/lib/defaults/build-strategies/wasm/golang/manifest.ext.json create mode 100644 todo diff --git a/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts b/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts index 1cac9c1e9f..815e94dbcf 100644 --- a/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts +++ b/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts @@ -43,6 +43,11 @@ const CONFIGS: Record = { baseImage: "polywrap/vm-base-as", version: "0.2.0", }, + "wasm/golang": { + defaultIncludes: ["go.mod", "go.sum"], + baseImage: "consideritdone/polywrap-base-go", + version: "0.1.0" + } }; export class DockerVMBuildStrategy extends BuildStrategy { diff --git a/packages/cli/src/lib/defaults/build-images/wasm/golang/index.ts b/packages/cli/src/lib/defaults/build-images/wasm/golang/index.ts deleted file mode 100644 index 365b99b78e..0000000000 --- a/packages/cli/src/lib/defaults/build-images/wasm/golang/index.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { CompilerOverrides } from "../../../../Compiler"; -import { intlMsg } from "../../../../intl"; -import { resolvePathIfExists } from "../../../../system"; - -import { PolywrapManifest } from "@polywrap/polywrap-manifest-types-js"; -import fs from "fs"; - -/** go.mod - * module bla-bla - */ -export function getCompilerOverrides(): CompilerOverrides { - let golangModuleName = ""; - return { - validateManifest: (manifest: PolywrapManifest) => { - const module = manifest.source.module; - - if (!module || module.indexOf("go.mod") === -1) { - throw Error( - intlMsg.lib_wasm_golang_invalidModule({ path: module as string }) - ); - } - const goModPaths = [`../${module}`, module as string]; - const goModFile = resolvePathIfExists(goModPaths); - if (!goModFile) { - throw Error( - intlMsg.commands_build_error_goModNotFound({ - paths: module as string, - }) - ); - } - - golangModuleName = loadGoModeFile(goModFile); - }, - getCompilerOptions: (): Record => { - return { - golangModuleName, - }; - }, - generationSubPath: "wrap", - }; -} - -function loadGoModeFile(filePath: string): string { - const goMod = fs.readFileSync(filePath, "utf-8"); - - if (!goMod) { - const noLoadMessage = intlMsg.lib_helpers_gomod_unableToLoad({ - path: filePath, - }); - throw Error(noLoadMessage); - } - - const regex = /module (.+)/m; - const module = goMod.match(regex); - if (!module || module.length != 2) { - throw Error(intlMsg.lib_helpers_gomod_invalid({ path: filePath })); - } - - return module[1]; -} diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/go/manifest.ext.json b/packages/cli/src/lib/defaults/build-strategies/wasm/go/manifest.ext.json deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/go/polywrap.build.yaml b/packages/cli/src/lib/defaults/build-strategies/wasm/go/polywrap.build.yaml deleted file mode 100644 index 9df4ff713b..0000000000 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/go/polywrap.build.yaml +++ /dev/null @@ -1,3 +0,0 @@ -format: 0.1.0 -docker: - dockerfile: ./Dockerfile.mustache diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/default.build.yaml b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/default.build.yaml new file mode 100644 index 0000000000..2d69edd896 --- /dev/null +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/default.build.yaml @@ -0,0 +1,4 @@ +format: 0.2.0 +strategies: + image: + dockerfile: ./Dockerfile.mustache diff --git a/packages/cli/src/lib/defaults/build-images/wasm/golang/Dockerfile.mustache b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/image/Dockerfile.mustache similarity index 76% rename from packages/cli/src/lib/defaults/build-images/wasm/golang/Dockerfile.mustache rename to packages/cli/src/lib/defaults/build-strategies/wasm/golang/image/Dockerfile.mustache index 695273b82d..9fcdde2e40 100644 --- a/packages/cli/src/lib/defaults/build-images/wasm/golang/Dockerfile.mustache +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/image/Dockerfile.mustache @@ -4,7 +4,7 @@ WORKDIR /project COPY . . -RUN tinygo build -o main.wasm -target wasm-memory wrap/main.go +RUN tinygo build -o main.wasm -target wasm-memory src/wrap/main.go # Make the build directory RUN rm -rf ./build diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/manifest.ext.json b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/manifest.ext.json new file mode 100644 index 0000000000..6894091f3d --- /dev/null +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/manifest.ext.json @@ -0,0 +1,22 @@ +{ + "properties": { + "strategies": { + "properties": { + "image": { + "type": "object", + "properties": { + "include": { + "description": "Files to include in docker image.", + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + }, + "local": { }, + "vm": { } + } +} \ No newline at end of file diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/main-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/main-go.mustache index 6a3450710c..81d81a97d3 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/main-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/main-go.mustache @@ -1,7 +1,7 @@ package main import ( - "{{goImport}}/wrap/module" + "{{goImport}}/src/wrap/module" "github.com/consideritdone/polywrap-go/polywrap" ) diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Serialization-go.mustache index 2cc45f280f..2fbb08052a 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Serialization-go.mustache @@ -1,9 +1,9 @@ package module {{#makeImports}} github.com/consideritdone/polywrap-go/polywrap/msgpack, - . {{goImport}}/wrap/types, + . {{goImport}}/src/wrap/types, {{#importedTypes}} - . {{goImport}}/wrap/imported/{{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}}, + . {{goImport}}/src/wrap/imported/{{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}}, {{/importedTypes}} {{#methods}} {{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}, diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Wrapped-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Wrapped-go.mustache index 65dd8ec082..7b20b03c06 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Wrapped-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Wrapped-go.mustache @@ -1,6 +1,6 @@ package module {{#makeImports}} - {{#methods}}{{#env}}github.com/consideritdone/polywrap-go/polywrap,. {{goImport}}/wrap/types,{{/env}}{{/methods}} + {{#methods}}{{#env}}github.com/consideritdone/polywrap-go/polywrap,. {{goImport}}/src/wrap/types,{{/env}}{{/methods}} {{goImport}}/module as methods, {{/makeImports}} {{#methods}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache index cfcdeba108..424f8ed842 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache @@ -1,7 +1,7 @@ package types {{#makeImports}} {{#importedTypes}} - . {{goImport}}/wrap/imported/{{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}}, + . {{goImport}}/src/wrap/imported/{{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}}, {{/importedTypes}} {{#methods}} {{#arguments}} diff --git a/todo b/todo new file mode 100644 index 0000000000..a82ed17f37 --- /dev/null +++ b/todo @@ -0,0 +1,7 @@ +jordan notes: +- file names w/ '%'? +- objectelse -> object_else.go? Same with enumwhile.go +- create a template project +- missing test-cases? (bignumber, large-types, reserved-words, env-types) +- finish the go-ci workflow +- - setup submodule for wasm/go runtime \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index be8b9082a6..f784328a6e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2431,9 +2431,9 @@ "@types/json-schema" "*" "@types/estree@*": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" - integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.1.tgz#aa22750962f3bf0e79d753d3cc067f010c95f194" + integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA== "@types/fs-extra@9.0.12": version "9.0.12" @@ -2516,9 +2516,9 @@ integrity sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw== "@types/lodash@^4.14.182": - version "4.14.192" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.192.tgz#5790406361a2852d332d41635d927f1600811285" - integrity sha512-km+Vyn3BYm5ytMO13k9KTp27O75rbQ0NFw+U//g+PX7VZyjCioXaRFisqSIJRECljcTv73G3i6BpglNGHgUQ5A== + version "4.14.194" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.194.tgz#b71eb6f7a0ff11bff59fc987134a093029258a76" + integrity sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g== "@types/minimatch@*", "@types/minimatch@^5.1.2": version "5.1.2" @@ -2541,9 +2541,9 @@ integrity sha512-wH6Tu9mbiOt0n5EvdoWy0VGQaJMHfLIxY/6wS0xLC7CV1taM6gESEzcYy0ZlWvxxiiljYvfDIvz4hHbUUDRlhw== "@types/node@*", "@types/node@^18.14.6": - version "18.15.11" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.11.tgz#b3b790f09cb1696cffcec605de025b088fa4225f" - integrity sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q== + version "18.15.12" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.12.tgz#833756634e78c829e1254db006468dadbb0c696b" + integrity sha512-Wha1UwsB3CYdqUm2PPzh/1gujGCNtWVUYF0mB00fJFoR4gTyWTDPjSm+zBF787Ahw8vSGgBja90MkgFwvB86Dg== "@types/normalize-package-data@^2.4.0": version "2.4.1" @@ -3536,9 +3536,9 @@ camelcase@^6.0.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001449: - version "1.0.30001478" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001478.tgz#0ef8a1cf8b16be47a0f9fc4ecfc952232724b32a" - integrity sha512-gMhDyXGItTHipJj2ApIvR+iVB5hd0KP3svMWWXDvZOmjzJJassGLMfxRkQCSYgGd2gtdL/ReeiyvMSFD1Ss6Mw== + version "1.0.30001480" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001480.tgz#9bbd35ee44c2480a1e3a3b9f4496f5066817164a" + integrity sha512-q7cpoPPvZYgtyC4VaBSN0Bt+PJ4c4EYRf0DrduInOz2SkFpHD5p3LnvEpqBp7UnJn+8x1Ogl1s38saUxe+ihQQ== capture-exit@^2.0.0: version "2.0.0" @@ -4153,7 +4153,7 @@ defaults@^1.0.3: dependencies: clone "^1.0.2" -define-properties@^1.1.3, define-properties@^1.1.4: +define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== @@ -4357,9 +4357,9 @@ electron-fetch@^1.7.2: encoding "^0.1.13" electron-to-chromium@^1.4.284: - version "1.4.362" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.362.tgz#1dfd7a076fc4785a16941f06410d0668e1a7a1aa" - integrity sha512-PYzAoScDfUcAwZfJQvr6hK2xXzLsMocj/Wuz6LpW6TZQNVv9TflBSB+UoEPuFujc478BgAxCoCFarcVPmjzsog== + version "1.4.368" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.368.tgz#75901f97d3e23da2e66feb1e61fbb8e70ac96430" + integrity sha512-e2aeCAixCj9M7nJxdB/wDjO6mbYX+lJJxSJCXDzlr5YPGYVofuJwGN9nKg2o6wWInjX6XmxRinn3AeJMK81ltw== elliptic@6.5.4: version "6.5.4" @@ -4606,9 +4606,9 @@ eslint-import-resolver-node@^0.3.4: resolve "^1.22.1" eslint-module-utils@^2.6.0: - version "2.7.4" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz#4f3e41116aaf13a20792261e61d3a2e7e0583974" - integrity sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA== + version "2.8.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz#e439fee65fc33f6bba630ff621efc38ec0375c49" + integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== dependencies: debug "^3.2.7" @@ -5219,7 +5219,7 @@ functional-red-black-tree@^1.0.1: resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== -functions-have-names@^1.2.2: +functions-have-names@^1.2.2, functions-have-names@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== @@ -7286,9 +7286,9 @@ long@^4.0.0: integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== long@^5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/long/-/long-5.2.1.tgz#e27595d0083d103d2fa2c20c7699f8e0c92b897f" - integrity sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A== + version "5.2.3" + resolved "https://registry.yarnpkg.com/long/-/long-5.2.3.tgz#a3ba97f3877cf1d778eccbcb048525ebb77499e1" + integrity sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q== lru-cache@^5.1.1: version "5.1.1" @@ -9062,13 +9062,13 @@ regex-parser@2.2.11: integrity sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q== regexp.prototype.flags@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" - integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== + version "1.5.0" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" + integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - functions-have-names "^1.2.2" + define-properties "^1.2.0" + functions-have-names "^1.2.3" regexpp@^3.0.0, regexpp@^3.1.0: version "3.2.0" @@ -9315,13 +9315,20 @@ semver@7.3.8: dependencies: lru-cache "^6.0.0" -semver@7.4.0, semver@7.x, semver@^7.1.1, semver@^7.1.3, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: +semver@7.4.0: version "7.4.0" resolved "https://registry.yarnpkg.com/semver/-/semver-7.4.0.tgz#8481c92feffc531ab1e012a8ffc15bdd3a0f4318" integrity sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw== dependencies: lru-cache "^6.0.0" +semver@7.x, semver@^7.1.1, semver@^7.1.3, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: + version "7.5.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.0.tgz#ed8c5dc8efb6c629c88b23d41dc9bf40c1d96cd0" + integrity sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA== + dependencies: + lru-cache "^6.0.0" + semver@^6.0.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" @@ -10343,9 +10350,9 @@ upath@^2.0.1: integrity sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w== update-browserslist-db@^1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" - integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== + version "1.0.11" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940" + integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== dependencies: escalade "^3.1.1" picocolors "^1.0.0" From 7f52987cfdfb2611e5b7667fa37588fcff4db902 Mon Sep 17 00:00:00 2001 From: Niraj Kamdar Date: Wed, 5 Jul 2023 12:02:06 +0800 Subject: [PATCH 30/65] fix: issues --- packages/test-cases/yarn.lock | 338 ---------------------------------- yarn.lock | 173 +++++++---------- 2 files changed, 70 insertions(+), 441 deletions(-) delete mode 100644 packages/test-cases/yarn.lock diff --git a/packages/test-cases/yarn.lock b/packages/test-cases/yarn.lock deleted file mode 100644 index 3a95d739de..0000000000 --- a/packages/test-cases/yarn.lock +++ /dev/null @@ -1,338 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@cspotcode/source-map-support@^0.8.0": - version "0.8.1" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" - integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== - dependencies: - "@jridgewell/trace-mapping" "0.3.9" - -"@jridgewell/resolve-uri@^3.0.3": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" - integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== - -"@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== - -"@jridgewell/trace-mapping@0.3.9": - version "0.3.9" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" - integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@polywrap/os-js@0.10.5": - version "0.10.5" - resolved "https://registry.yarnpkg.com/@polywrap/os-js/-/os-js-0.10.5.tgz#b9ecae978f69edc341aedec1867161d1e609eb3a" - integrity sha512-Xh7KqCQy2aEoHDGQE5eV2ykCDjhCRzUVryiF+P/HbfxG//bW6Wte4e97H4tcuD8RkApYVaGjmUTAlvX+g+26AQ== - -"@tsconfig/node10@^1.0.7": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" - integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== - -"@tsconfig/node12@^1.0.7": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" - integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== - -"@tsconfig/node14@^1.0.0": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" - integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== - -"@tsconfig/node16@^1.0.2": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" - integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== - -"@types/adm-zip@0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@types/adm-zip/-/adm-zip-0.5.0.tgz#94c90a837ce02e256c7c665a6a1eb295906333c1" - integrity sha512-FCJBJq9ODsQZUNURo5ILAQueuA8WJhRvuihS3ke2iI25mJlfV2LK8jG2Qj2z2AWg8U0FtWWqBHVRetceLskSaw== - dependencies: - "@types/node" "*" - -"@types/glob@*": - version "8.1.0" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-8.1.0.tgz#b63e70155391b0584dce44e7ea25190bbc38f2fc" - integrity sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w== - dependencies: - "@types/minimatch" "^5.1.2" - "@types/node" "*" - -"@types/minimatch@^5.1.2": - version "5.1.2" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" - integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== - -"@types/node@*": - version "20.3.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.3.2.tgz#fa6a90f2600e052a03c18b8cb3fd83dd4e599898" - integrity sha512-vOBLVQeCQfIcF/2Y7eKFTqrMnizK5lRNQ7ykML/5RuwVXVWxYkgwS7xbt4B6fKCUPgbSL5FSsjHQpaGQP/dQmw== - -"@types/shelljs@0.8.9": - version "0.8.9" - resolved "https://registry.yarnpkg.com/@types/shelljs/-/shelljs-0.8.9.tgz#45dd8501aa9882976ca3610517dac3831c2fbbf4" - integrity sha512-flVe1dvlrCyQJN/SGrnBxqHG+RzXrVKsmjD8WS/qYHpq5UPjfq7UWFBENP0ZuOl0g6OpAlL6iBoLSvKYUUmyQw== - dependencies: - "@types/glob" "*" - "@types/node" "*" - -acorn-walk@^8.1.1: - version "8.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" - integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== - -acorn@^8.4.1: - version "8.9.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.9.0.tgz#78a16e3b2bcc198c10822786fa6679e245db5b59" - integrity sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ== - -adm-zip@0.5.10: - version "0.5.10" - resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.5.10.tgz#4a51d5ab544b1f5ce51e1b9043139b639afff45b" - integrity sha512-x0HvcHqVJNTPk/Bw8JbLWlWoo6Wwnsug0fnYYro1HBrjxZ3G7/AZk7Ahv8JwDe1uIcz8eBqvu86FuF1POiG7vQ== - -arg@^4.1.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" - integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== - -axios@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.2.2.tgz#72681724c6e6a43a9fea860fc558127dbe32f9f1" - integrity sha512-bz/J4gS2S3I7mpN/YZfGFTqhXTYzRho8Ay38w2otuuDR322KzFIWm/4W2K6gIwvWaws5n+mnb7D1lN9uD+QH6Q== - dependencies: - follow-redirects "^1.15.0" - form-data "^4.0.0" - proxy-from-env "^1.1.0" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -create-require@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" - integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== - -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - -follow-redirects@^1.15.0: - version "1.15.2" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" - integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== - -form-data@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" - integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -glob@^7.0.0: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -interpret@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" - integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== - -is-core-module@^2.11.0: - version "2.12.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd" - integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== - dependencies: - has "^1.0.3" - -make-error@^1.1.1: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.12: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -minimatch@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -proxy-from-env@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" - integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== - -rechoir@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" - integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== - dependencies: - resolve "^1.1.6" - -resolve@^1.1.6: - version "1.22.2" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" - integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== - dependencies: - is-core-module "^2.11.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -shelljs@0.8.5: - version "0.8.5" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" - integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== - dependencies: - glob "^7.0.0" - interpret "^1.0.0" - rechoir "^0.6.2" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -ts-node@10.9.1: - version "10.9.1" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" - integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== - dependencies: - "@cspotcode/source-map-support" "^0.8.0" - "@tsconfig/node10" "^1.0.7" - "@tsconfig/node12" "^1.0.7" - "@tsconfig/node14" "^1.0.0" - "@tsconfig/node16" "^1.0.2" - acorn "^8.4.1" - acorn-walk "^8.1.1" - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" - v8-compile-cache-lib "^3.0.1" - yn "3.1.1" - -v8-compile-cache-lib@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" - integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -yn@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== diff --git a/yarn.lock b/yarn.lock index 8c54b48b48..6f02a84c0c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -113,31 +113,31 @@ dependencies: "@babel/highlight" "^7.22.5" -"@babel/compat-data@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.5.tgz#b1f6c86a02d85d2dd3368a2b67c09add8cd0c255" - integrity sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA== +"@babel/compat-data@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.6.tgz#15606a20341de59ba02cd2fcc5086fcbe73bf544" + integrity sha512-29tfsWTq2Ftu7MXmimyC0C5FDZv5DYxOZkh3XD3+QW4V/BYuv/LyEsjj3c0hqedEaDt6DBfDvexMKU8YevdqFg== "@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.7.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.5.tgz#d67d9747ecf26ee7ecd3ebae1ee22225fe902a89" - integrity sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg== + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.6.tgz#aafafbe86e9a1679d876b99dc46382964ef72494" + integrity sha512-HPIyDa6n+HKw5dEuway3vVAhBboYCtREBMp+IWeseZy6TFtzn6MHkCH2KKYUOC/vKKwgSMHQW4htBOrmuRPXfw== dependencies: "@ampproject/remapping" "^2.2.0" "@babel/code-frame" "^7.22.5" "@babel/generator" "^7.22.5" - "@babel/helper-compilation-targets" "^7.22.5" + "@babel/helper-compilation-targets" "^7.22.6" "@babel/helper-module-transforms" "^7.22.5" - "@babel/helpers" "^7.22.5" - "@babel/parser" "^7.22.5" + "@babel/helpers" "^7.22.6" + "@babel/parser" "^7.22.6" "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.5" + "@babel/traverse" "^7.22.6" "@babel/types" "^7.22.5" + "@nicolo-ribaudo/semver-v6" "^6.3.3" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.2" - semver "^6.3.0" "@babel/generator@^7.22.5": version "7.22.5" @@ -149,16 +149,16 @@ "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" -"@babel/helper-compilation-targets@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.5.tgz#fc7319fc54c5e2fa14b2909cf3c5fd3046813e02" - integrity sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw== +"@babel/helper-compilation-targets@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.6.tgz#e30d61abe9480aa5a83232eb31c111be922d2e52" + integrity sha512-534sYEqWD9VfUm3IPn2SLcH4Q3P86XL+QvqdC7ZsFrzyyPF3T4XGiVghF6PTYNdWg6pXuoqXxNQAhbYeEInTzA== dependencies: - "@babel/compat-data" "^7.22.5" + "@babel/compat-data" "^7.22.6" "@babel/helper-validator-option" "^7.22.5" - browserslist "^4.21.3" + "@nicolo-ribaudo/semver-v6" "^6.3.3" + browserslist "^4.21.9" lru-cache "^5.1.1" - semver "^6.3.0" "@babel/helper-environment-visitor@^7.22.5": version "7.22.5" @@ -213,10 +213,10 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-split-export-declaration@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz#88cf11050edb95ed08d596f7a044462189127a08" - integrity sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ== +"@babel/helper-split-export-declaration@^7.22.5", "@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== dependencies: "@babel/types" "^7.22.5" @@ -235,13 +235,13 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz#de52000a15a177413c8234fa3a8af4ee8102d0ac" integrity sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw== -"@babel/helpers@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.5.tgz#74bb4373eb390d1ceed74a15ef97767e63120820" - integrity sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q== +"@babel/helpers@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.6.tgz#8e61d3395a4f0c5a8060f309fb008200969b5ecd" + integrity sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA== dependencies: "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.5" + "@babel/traverse" "^7.22.6" "@babel/types" "^7.22.5" "@babel/highlight@^7.22.5": @@ -253,10 +253,10 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.5.tgz#721fd042f3ce1896238cf1b341c77eb7dee7dbea" - integrity sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.5", "@babel/parser@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.6.tgz#201f8b47be20c76c7c5743b9c16129760bf9a975" + integrity sha512-EIQu22vNkceq3LbjAq7knDf/UmtI2qbcNI8GRBlijez6TpQLvSodJPYfydQmNA5buwkxxxa/PVI44jjYZ+/cLw== "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -351,18 +351,18 @@ "@babel/parser" "^7.22.5" "@babel/types" "^7.22.5" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.5.tgz#44bd276690db6f4940fdb84e1cb4abd2f729ccd1" - integrity sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ== +"@babel/traverse@^7.1.0", "@babel/traverse@^7.22.5", "@babel/traverse@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.6.tgz#8f2f83a5c588251584914debeee38f35f661a300" + integrity sha512-53CijMvKlLIDlOTrdWiHileRddlIiwUIyCKqYa7lYnnPldXCG5dUSN38uT0cA6i7rHWNKJLH0VU/Kxdr1GzB3w== dependencies: "@babel/code-frame" "^7.22.5" "@babel/generator" "^7.22.5" "@babel/helper-environment-visitor" "^7.22.5" "@babel/helper-function-name" "^7.22.5" "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.5" - "@babel/parser" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.22.6" "@babel/types" "^7.22.5" debug "^4.1.0" globals "^11.1.0" @@ -1863,6 +1863,11 @@ resolved "https://registry.yarnpkg.com/@multiformats/base-x/-/base-x-4.0.1.tgz#95ff0fa58711789d53aefb2590a8b7a4e715d121" integrity sha512-eMk0b9ReBbV23xXU693TAIrLyeO5iTgBZGSJfpqriG8UkYvr/hC9u9pyMlAakDNHWmbhMZCDs6KQO0jzKD8OTw== +"@nicolo-ribaudo/semver-v6@^6.3.3": + version "6.3.3" + resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz#ea6d23ade78a325f7a52750aab1526b02b628c29" + integrity sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg== + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -2765,14 +2770,14 @@ integrity sha512-wH6Tu9mbiOt0n5EvdoWy0VGQaJMHfLIxY/6wS0xLC7CV1taM6gESEzcYy0ZlWvxxiiljYvfDIvz4hHbUUDRlhw== "@types/node@*": - version "20.3.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.3.2.tgz#fa6a90f2600e052a03c18b8cb3fd83dd4e599898" - integrity sha512-vOBLVQeCQfIcF/2Y7eKFTqrMnizK5lRNQ7ykML/5RuwVXVWxYkgwS7xbt4B6fKCUPgbSL5FSsjHQpaGQP/dQmw== + version "20.3.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.3.3.tgz#329842940042d2b280897150e023e604d11657d6" + integrity sha512-wheIYdr4NYML61AjC8MKj/2jrR/kDQri/CIpVoZwldwhnIrD/j9jIU5bJ8yBKuB2VhpFV7Ab6G2XkBjv9r9Zzw== "@types/node@^18.14.6": - version "18.16.18" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.16.18.tgz#85da09bafb66d4bc14f7c899185336d0c1736390" - integrity sha512-/aNaQZD0+iSBAGnvvN2Cx92HqE5sZCPZtx2TsK+4nvV23fFe09jVDvpArXr2j9DnYlzuU9WuoykDDc6wqvpNcw== + version "18.16.19" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.16.19.tgz#cb03fca8910fdeb7595b755126a8a78144714eea" + integrity sha512-IXl7o+R9iti9eBW4Wg2hx1xQDig183jj7YLn8F7udNceyfkbn1ZxmzZXuak20gR40D7pIkIY1kYGx5VIGbaHKA== "@types/normalize-package-data@^2.4.0": version "2.4.1" @@ -3603,7 +3608,7 @@ browser-readablestream-to-it@^1.0.1, browser-readablestream-to-it@^1.0.3: resolved "https://registry.yarnpkg.com/browser-readablestream-to-it/-/browser-readablestream-to-it-1.0.3.tgz#ac3e406c7ee6cdf0a502dd55db33bab97f7fba76" integrity sha512-+12sHB+Br8HIh6VAMVEG5r3UXCyESIgDW7kzk3BjIXa43DVqVwL7GC5TW3jeh+72dtcH99pPVpw0X8i0jt+/kw== -browserslist@^4.21.3: +browserslist@^4.21.9: version "4.21.9" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.9.tgz#e11bdd3c313d7e2a9e87e8b4b0c7872b13897635" integrity sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg== @@ -3750,9 +3755,9 @@ camelcase@^6.0.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001503: - version "1.0.30001509" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001509.tgz#2b7ad5265392d6d2de25cd8776d1ab3899570d14" - integrity sha512-2uDDk+TRiTX5hMcUYT/7CSyzMZxjfGu0vAUjS2g0LSD8UoXOv0LtpH4LxGMemsiPq6LCVIUjNwVM0erkOkGCDA== + version "1.0.30001512" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001512.tgz#7450843fb581c39f290305a83523c7a9ef0d4cb4" + integrity sha512-2S9nK0G/mE+jasCUsMPlARhRCts1ebcp2Ji8Y8PWi4NDE1iRdLCnEPHkEfeBrGC45L4isBx5ur3IQ6yTE2mRZw== capture-exit@^2.0.0: version "2.0.0" @@ -4345,7 +4350,7 @@ dedent@^0.7.0: resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== -deep-is@^0.1.3, deep-is@~0.1.3: +deep-is@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== @@ -4558,9 +4563,9 @@ electron-fetch@^1.7.2: encoding "^0.1.13" electron-to-chromium@^1.4.431: - version "1.4.445" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.445.tgz#058d2c5f3a2981ab1a37440f5a5e42d15672aa6d" - integrity sha512-++DB+9VK8SBJwC+X1zlMfJ1tMA3F0ipi39GdEp+x3cV2TyBihqAgad8cNMWtLDEkbH39nlDQP7PfGrDr3Dr7HA== + version "1.4.450" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.450.tgz#df232c961ee9bf4e8980f86e96a6e9f291720138" + integrity sha512-BLG5HxSELlrMx7dJ2s+8SFlsCtJp37Zpk2VAxyC6CZtbc+9AJeZHfYHbrlSgdXp6saQ8StMqOTEDaBKgA7u1sw== elliptic@6.5.4: version "6.5.4" @@ -4760,14 +4765,13 @@ escape-string-regexp@^2.0.0: integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== escodegen@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" - integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== + version "2.1.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" + integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== dependencies: esprima "^4.0.1" estraverse "^5.2.0" esutils "^2.0.2" - optionator "^0.8.1" optionalDependencies: source-map "~0.6.1" @@ -5169,9 +5173,9 @@ fast-fifo@^1.0.0: integrity sha512-IgfweLvEpwyA4WgiQe9Nx6VV2QkML2NkvZnk1oKnIzXgXdWxuhF7zw4DvLTPZJn6PIUneiAXPF24QmoEqHTjyw== fast-glob@^3.2.5, fast-glob@^3.2.9: - version "3.2.12" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" - integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== + version "3.3.0" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.0.tgz#7c40cb491e1e2ed5664749e87bfb516dbe8727c0" + integrity sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -5184,7 +5188,7 @@ fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: +fast-levenshtein@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== @@ -7314,14 +7318,6 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" -levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - libnpmaccess@^4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/libnpmaccess/-/libnpmaccess-4.0.3.tgz#dfb0e5b0a53c315a2610d300e46b4ddeb66e7eec" @@ -8100,9 +8096,9 @@ nice-try@^1.0.4: integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== node-fetch@^2.6.0, node-fetch@^2.6.1, node-fetch@^2.6.7: - version "2.6.11" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.11.tgz#cde7fc71deef3131ef80a738919f999e6edfff25" - integrity sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w== + version "2.6.12" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.12.tgz#02eb8e22074018e3d5a83016649d04df0e348fba" + integrity sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g== dependencies: whatwg-url "^5.0.0" @@ -8339,9 +8335,9 @@ number-is-nan@^1.0.0: integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== nwsapi@^2.2.0: - version "2.2.5" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.5.tgz#a52744c61b3889dd44b0a158687add39b8d935e2" - integrity sha512-6xpotnECFy/og7tKSBVmUNft7J3jyXAka4XvG6AUhFWRz+Q/Ljus7znJAA3bxColfQLdS+XsjoodtJfCgeTEFQ== + version "2.2.6" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.6.tgz#f876bd7ae9509cac72c640826355abf63d3c326a" + integrity sha512-vSZ4miHQ4FojLjmz2+ux4B0/XA16jfwt/LBzIUftDpRd8tujHFkXjMyLwjS08fIZCzesj2z7gJukOKJwqebJAQ== oauth-sign@~0.9.0: version "0.9.0" @@ -8430,18 +8426,6 @@ onetime@^5.1.0, onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" -optionator@^0.8.1: - version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" - integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.6" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - word-wrap "~1.2.3" - optionator@^0.9.1: version "0.9.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" @@ -8799,11 +8783,6 @@ prelude-ls@^1.2.1: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== - prettier-linter-helpers@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" @@ -10310,13 +10289,6 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== - dependencies: - prelude-ls "~1.1.2" - type-detect@4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" @@ -10785,11 +10757,6 @@ wide-align@^1.1.0: dependencies: string-width "^1.0.2 || 2 || 3 || 4" -word-wrap@~1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== - wordwrap@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" From 208054b695e070d2b2bd248e5e329782fadeb7c7 Mon Sep 17 00:00:00 2001 From: Niraj Kamdar Date: Thu, 6 Jul 2023 03:20:40 +0800 Subject: [PATCH 31/65] fix: issues --- .../build-strategies/strategies/DockerVMStrategy.ts | 11 +++++++++-- .../build-strategies/wasm/golang/vm/Dockerfile | 2 ++ .../lib/defaults/build-strategies/wasm/golang/vm/NAME | 1 + .../defaults/build-strategies/wasm/golang/vm/VERSION | 1 + .../wasm/golang/vm/vm-script.mustache | 9 +++++++++ ...ize_array.mustache => $deserialize_array.mustache} | 0 ...alize_enum.mustache => $deserialize_enum.mustache} | 0 ...rialize_map.mustache => $deserialize_map.mustache} | 0 ...e_object.mustache => $deserialize_object.mustache} | 0 ...e_scalar.mustache => $deserialize_scalar.mustache} | 0 ...alize_array.mustache => $serialize_array.mustache} | 0 ...rialize_enum.mustache => $serialize_enum.mustache} | 0 ...serialize_map.mustache => $serialize_map.mustache} | 0 ...ize_object.mustache => $serialize_object.mustache} | 0 ...ize_scalar.mustache => $serialize_scalar.mustache} | 0 ...ray.mustache => $value_deserialize_array.mustache} | 0 ...enum.mustache => $value_deserialize_enum.mustache} | 0 ...e_map.mustache => $value_deserialize_map.mustache} | 0 ...ct.mustache => $value_deserialize_object.mustache} | 0 ...ar.mustache => $value_deserialize_scalar.mustache} | 0 ...array.mustache => $value_serialize_array.mustache} | 0 ...e_enum.mustache => $value_serialize_enum.mustache} | 0 ...ize_map.mustache => $value_serialize_map.mustache} | 0 ...ject.mustache => $value_serialize_object.mustache} | 0 ...alar.mustache => $value_serialize_scalar.mustache} | 0 25 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile create mode 100644 packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/NAME create mode 100644 packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/VERSION create mode 100644 packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/vm-script.mustache rename packages/schema/bind/src/bindings/golang/wasm/templates/{deserialize_array.mustache => $deserialize_array.mustache} (100%) rename packages/schema/bind/src/bindings/golang/wasm/templates/{deserialize_enum.mustache => $deserialize_enum.mustache} (100%) rename packages/schema/bind/src/bindings/golang/wasm/templates/{deserialize_map.mustache => $deserialize_map.mustache} (100%) rename packages/schema/bind/src/bindings/golang/wasm/templates/{deserialize_object.mustache => $deserialize_object.mustache} (100%) rename packages/schema/bind/src/bindings/golang/wasm/templates/{deserialize_scalar.mustache => $deserialize_scalar.mustache} (100%) rename packages/schema/bind/src/bindings/golang/wasm/templates/{serialize_array.mustache => $serialize_array.mustache} (100%) rename packages/schema/bind/src/bindings/golang/wasm/templates/{serialize_enum.mustache => $serialize_enum.mustache} (100%) rename packages/schema/bind/src/bindings/golang/wasm/templates/{serialize_map.mustache => $serialize_map.mustache} (100%) rename packages/schema/bind/src/bindings/golang/wasm/templates/{serialize_object.mustache => $serialize_object.mustache} (100%) rename packages/schema/bind/src/bindings/golang/wasm/templates/{serialize_scalar.mustache => $serialize_scalar.mustache} (100%) rename packages/schema/bind/src/bindings/golang/wasm/templates/{value_deserialize_array.mustache => $value_deserialize_array.mustache} (100%) rename packages/schema/bind/src/bindings/golang/wasm/templates/{value_deserialize_enum.mustache => $value_deserialize_enum.mustache} (100%) rename packages/schema/bind/src/bindings/golang/wasm/templates/{value_deserialize_map.mustache => $value_deserialize_map.mustache} (100%) rename packages/schema/bind/src/bindings/golang/wasm/templates/{value_deserialize_object.mustache => $value_deserialize_object.mustache} (100%) rename packages/schema/bind/src/bindings/golang/wasm/templates/{value_deserialize_scalar.mustache => $value_deserialize_scalar.mustache} (100%) rename packages/schema/bind/src/bindings/golang/wasm/templates/{value_serialize_array.mustache => $value_serialize_array.mustache} (100%) rename packages/schema/bind/src/bindings/golang/wasm/templates/{value_serialize_enum.mustache => $value_serialize_enum.mustache} (100%) rename packages/schema/bind/src/bindings/golang/wasm/templates/{value_serialize_map.mustache => $value_serialize_map.mustache} (100%) rename packages/schema/bind/src/bindings/golang/wasm/templates/{value_serialize_object.mustache => $value_serialize_object.mustache} (100%) rename packages/schema/bind/src/bindings/golang/wasm/templates/{value_serialize_scalar.mustache => $value_serialize_scalar.mustache} (100%) diff --git a/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts b/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts index dfd46b787e..c3ed56d638 100644 --- a/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts +++ b/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts @@ -46,8 +46,8 @@ const CONFIGS: Record = { "wasm/golang": { defaultIncludes: ["go.mod", "go.sum"], baseImage: "consideritdone/polywrap-base-go", - version: "0.1.0" - } + version: "0.1.0", + }, }; export class DockerVMBuildStrategy extends BuildStrategy { @@ -77,10 +77,13 @@ export class DockerVMBuildStrategy extends BuildStrategy { } public async buildSources(): Promise { + console.log("Docker checking...") await ensureDockerDaemonRunning(this.project.logger); + console.log("Building sources...") await this._buildSources(); + console.log("Copying build output...") await this._copyBuildOutput(); } @@ -90,13 +93,17 @@ export class DockerVMBuildStrategy extends BuildStrategy { const buildManifest = await this.project.getBuildManifest(); const buildManifestConfig = buildManifest.config as BuildManifestConfig; + console.log("Copy manifests...") // Copy manifests buildManifestConfig.polywrap_manifests.forEach((manifestPath) => { + console.log(path.join(manifestDir, manifestPath)); + console.log(path.join(this._volumePaths.project, manifestPath)); fse.copySync( path.join(manifestDir, manifestPath), path.join(this._volumePaths.project, manifestPath) ); }); + console.log("Copying manifests done...") const language = (await this.project.getManifestLanguage()) as BuildableLanguage; diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile new file mode 100644 index 0000000000..b4182dac01 --- /dev/null +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile @@ -0,0 +1,2 @@ +FROM consideritdone/polywrap-base-go:0.1.0 +WORKDIR /project diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/NAME b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/NAME new file mode 100644 index 0000000000..97d7c2778e --- /dev/null +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/NAME @@ -0,0 +1 @@ +polywrap/vm-base-go \ No newline at end of file diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/VERSION b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/VERSION new file mode 100644 index 0000000000..6c6aa7cb09 --- /dev/null +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/VERSION @@ -0,0 +1 @@ +0.1.0 \ No newline at end of file diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/vm-script.mustache b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/vm-script.mustache new file mode 100644 index 0000000000..74782a6e6e --- /dev/null +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/vm-script.mustache @@ -0,0 +1,9 @@ +set -e + +tinygo build -o main.wasm -target wasm-memory src/wrap/main.go + +# Make the build directory +rm -rf ./build +mkdir ./build + +wasm-snip -o ./build/wrap.wasm main.wasm -p syscall runtime.ticks fd_write diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/deserialize_array.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/$deserialize_array.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm/templates/deserialize_array.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/$deserialize_array.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/deserialize_enum.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/$deserialize_enum.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm/templates/deserialize_enum.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/$deserialize_enum.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/deserialize_map.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/$deserialize_map.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm/templates/deserialize_map.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/$deserialize_map.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/deserialize_object.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/$deserialize_object.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm/templates/deserialize_object.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/$deserialize_object.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/deserialize_scalar.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/$deserialize_scalar.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm/templates/deserialize_scalar.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/$deserialize_scalar.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/serialize_array.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/$serialize_array.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm/templates/serialize_array.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/$serialize_array.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/serialize_enum.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/$serialize_enum.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm/templates/serialize_enum.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/$serialize_enum.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/serialize_map.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/$serialize_map.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm/templates/serialize_map.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/$serialize_map.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/serialize_object.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/$serialize_object.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm/templates/serialize_object.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/$serialize_object.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/serialize_scalar.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/$serialize_scalar.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm/templates/serialize_scalar.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/$serialize_scalar.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/value_deserialize_array.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/$value_deserialize_array.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm/templates/value_deserialize_array.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/$value_deserialize_array.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/value_deserialize_enum.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/$value_deserialize_enum.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm/templates/value_deserialize_enum.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/$value_deserialize_enum.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/value_deserialize_map.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/$value_deserialize_map.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm/templates/value_deserialize_map.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/$value_deserialize_map.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/value_deserialize_object.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/$value_deserialize_object.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm/templates/value_deserialize_object.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/$value_deserialize_object.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/value_deserialize_scalar.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/$value_deserialize_scalar.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm/templates/value_deserialize_scalar.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/$value_deserialize_scalar.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/value_serialize_array.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/$value_serialize_array.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm/templates/value_serialize_array.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/$value_serialize_array.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/value_serialize_enum.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/$value_serialize_enum.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm/templates/value_serialize_enum.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/$value_serialize_enum.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/value_serialize_map.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/$value_serialize_map.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm/templates/value_serialize_map.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/$value_serialize_map.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/value_serialize_object.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/$value_serialize_object.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm/templates/value_serialize_object.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/$value_serialize_object.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/value_serialize_scalar.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/$value_serialize_scalar.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm/templates/value_serialize_scalar.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/$value_serialize_scalar.mustache From 12e39256575a83c0fd349e75ecca1109ec11ec5a Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Wed, 5 Jul 2023 22:49:07 +0200 Subject: [PATCH 32/65] chore: lint fix --- .../build-strategies/strategies/DockerVMStrategy.ts | 10 +++++----- yarn.lock | 12 ++++++------ 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts b/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts index c3ed56d638..cbf143803b 100644 --- a/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts +++ b/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts @@ -77,13 +77,13 @@ export class DockerVMBuildStrategy extends BuildStrategy { } public async buildSources(): Promise { - console.log("Docker checking...") + console.log("Docker checking..."); await ensureDockerDaemonRunning(this.project.logger); - console.log("Building sources...") + console.log("Building sources..."); await this._buildSources(); - console.log("Copying build output...") + console.log("Copying build output..."); await this._copyBuildOutput(); } @@ -93,7 +93,7 @@ export class DockerVMBuildStrategy extends BuildStrategy { const buildManifest = await this.project.getBuildManifest(); const buildManifestConfig = buildManifest.config as BuildManifestConfig; - console.log("Copy manifests...") + console.log("Copy manifests..."); // Copy manifests buildManifestConfig.polywrap_manifests.forEach((manifestPath) => { console.log(path.join(manifestDir, manifestPath)); @@ -103,7 +103,7 @@ export class DockerVMBuildStrategy extends BuildStrategy { path.join(this._volumePaths.project, manifestPath) ); }); - console.log("Copying manifests done...") + console.log("Copying manifests done..."); const language = (await this.project.getManifestLanguage()) as BuildableLanguage; diff --git a/yarn.lock b/yarn.lock index 6f02a84c0c..701a6d61ae 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3024,9 +3024,9 @@ acorn@^7.1.1, acorn@^7.4.0: integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== acorn@^8.2.4, acorn@^8.4.1: - version "8.9.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.9.0.tgz#78a16e3b2bcc198c10822786fa6679e245db5b59" - integrity sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ== + version "8.10.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" + integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== add-stream@^1.0.0: version "1.0.0" @@ -3968,9 +3968,9 @@ code-point-at@^1.0.0: integrity sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA== collect-v8-coverage@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" - integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== + version "1.0.2" + resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" + integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== collection-visit@^1.0.0: version "1.0.0" From f04db97a25d85094816e82ecdf0f9cc264e5b87b Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Wed, 5 Jul 2023 22:53:42 +0200 Subject: [PATCH 33/65] chore: fix schema-bind test-case.spec.ts --- packages/schema/bind/src/__tests__/test-cases.spec.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/schema/bind/src/__tests__/test-cases.spec.ts b/packages/schema/bind/src/__tests__/test-cases.spec.ts index a60590c970..d9a29f9024 100644 --- a/packages/schema/bind/src/__tests__/test-cases.spec.ts +++ b/packages/schema/bind/src/__tests__/test-cases.spec.ts @@ -2,7 +2,8 @@ import { fetchTestCases } from "./index"; import { bindSchema, BindLanguage, - BindOutput, BindOptions + BindOutput, + BindOptions } from "../"; import { @@ -39,11 +40,11 @@ describe("Polywrap Binding Test Suite", () => { outputDirAbs: testCase.input.outputDirAbs, }; - const output = bindSchema({ + const bindOptions: BindOptions = { ...deepCopy(testCase.input), - bindLanguage: language as BindLanguage, + bindLanguage: language as BindLanguage }; - + if (language == "wasm-go") { if (!bindOptions.config) { bindOptions.config = {}; From 9866405a287707b0cecb845aca1871b2d4af0d64 Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Wed, 5 Jul 2023 22:57:26 +0200 Subject: [PATCH 34/65] chore: migrate from consideritdone/polywrap-go to polywrap/go-wrap --- packages/schema/bind/src/bindings/golang/functions.ts | 2 +- .../golang/wasm/templates/env-type/Env%type%-go.mustache | 2 +- .../templates/env-type/Env%type%Serialization-go.mustache | 2 +- .../wasm/templates/imported/env-type/Env%type%-go.mustache | 2 +- .../imported/env-type/Env%type%Serialization-go.mustache | 2 +- .../wasm/templates/imported/interface-type/%type%-go.mustache | 2 +- .../imported/module-type/%type%Serialization-go.mustache | 2 +- .../templates/imported/module-type/%type%Wrapped-go.mustache | 2 +- .../templates/imported/object-type/Object%type%-go.mustache | 2 +- .../object-type/Object%type%Serialization-go.mustache | 2 +- .../golang/wasm/templates/interface-type/%type%-go.mustache | 2 +- .../bind/src/bindings/golang/wasm/templates/main-go.mustache | 2 +- .../module-type/module/%type%Serialization-go.mustache | 2 +- .../templates/module-type/module/%type%Wrapped-go.mustache | 2 +- .../wasm/templates/object-type/Object%type%-go.mustache | 2 +- .../object-type/Object%type%Serialization-go.mustache | 2 +- .../wasm-go/imported/test_import/env_test_import__env.go | 2 +- .../test_import/env_test_import__env_serialization.go | 2 +- .../test_import/object_test_import__another_object.go | 2 +- .../object_test_import__another_object_serialization.go | 2 +- .../imported/test_import/object_test_import__object.go | 2 +- .../test_import/object_test_import__object_serialization.go | 2 +- .../imported/test_import/test_import__module_serialization.go | 2 +- .../imported/test_import/test_import__module_wrapped.go | 2 +- .../bind/sanity/output/wasm-go/interfaces/test_import.go | 2 +- packages/test-cases/cases/bind/sanity/output/wasm-go/main.go | 2 +- .../bind/sanity/output/wasm-go/module/module_serialization.go | 2 +- .../cases/bind/sanity/output/wasm-go/module/module_wrapped.go | 2 +- .../bind/sanity/output/wasm-go/types/object_another_type.go | 2 +- .../output/wasm-go/types/object_another_type_serialization.go | 2 +- .../sanity/output/wasm-go/types/object_custom_map_value.go | 2 +- .../wasm-go/types/object_custom_map_value_serialization.go | 2 +- .../bind/sanity/output/wasm-go/types/object_custom_type.go | 4 ++-- .../output/wasm-go/types/object_custom_type_serialization.go | 4 ++-- .../cases/bind/sanity/output/wasm-go/types/object_env.go | 2 +- .../sanity/output/wasm-go/types/object_env_serialization.go | 2 +- .../cases/bind/sanity/output/wasm-go/types/objectelse.go | 2 +- .../sanity/output/wasm-go/types/objectelse_serialization.go | 2 +- 38 files changed, 40 insertions(+), 40 deletions(-) diff --git a/packages/schema/bind/src/bindings/golang/functions.ts b/packages/schema/bind/src/bindings/golang/functions.ts index 008da8bf54..25fab09a04 100644 --- a/packages/schema/bind/src/bindings/golang/functions.ts +++ b/packages/schema/bind/src/bindings/golang/functions.ts @@ -103,7 +103,7 @@ export const makeImports: MustacheFn = () => { t = t.trim(); if (t.endsWith("big.Int")) { exist[ - "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" + "github.com/polywrap/go-wrap/polywrap/msgpack/big" ] = true; } else if (t.endsWith("fastjson.Value")) { exist["github.com/valyala/fastjson"] = true; diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%-go.mustache index 5f8f4bb605..2fbba933cb 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%-go.mustache @@ -1,6 +1,6 @@ package types -{{#makeImports}}github.com/consideritdone/polywrap-go/polywrap/msgpack,{{#properties}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/properties}}{{/makeImports}} +{{#makeImports}}github.com/polywrap/go-wrap/polywrap/msgpack,{{#properties}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/properties}}{{/makeImports}} type {{#toUpper}}{{type}}{{/toUpper}} struct { {{#stuctProps}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%Serialization-go.mustache index e5f6038776..a959eaf7f2 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%Serialization-go.mustache @@ -1,6 +1,6 @@ package types -{{#makeImports}}github.com/consideritdone/polywrap-go/polywrap/msgpack,{{#properties}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/properties}}{{/makeImports}} +{{#makeImports}}github.com/polywrap/go-wrap/polywrap/msgpack,{{#properties}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/properties}}{{/makeImports}} func serialize{{#toUpper}}{{type}}{{/toUpper}}(value *{{#toUpper}}{{type}}{{/toUpper}}) []byte { ctx := msgpack.NewContext("Serializing (encoding) env-type: {{#toUpper}}{{type}}{{/toUpper}}") diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%-go.mustache index b650c91755..9901f3f3a7 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%-go.mustache @@ -1,6 +1,6 @@ package {{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}} {{#makeImports}} - github.com/consideritdone/polywrap-go/polywrap/msgpack, + github.com/polywrap/go-wrap/polywrap/msgpack, {{#properties}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}} {{/properties}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%Serialization-go.mustache index af9a965b12..a715b7bd59 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%Serialization-go.mustache @@ -1,6 +1,6 @@ package {{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}} {{#makeImports}} - github.com/consideritdone/polywrap-go/polywrap/msgpack, + github.com/polywrap/go-wrap/polywrap/msgpack, {{#properties}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}} {{/properties}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/interface-type/%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/interface-type/%type%-go.mustache index c433d42468..48534a0418 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/interface-type/%type%-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/interface-type/%type%-go.mustache @@ -3,7 +3,7 @@ package {{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}} {{#capabilities}} {{#getImplementations}} {{#enabled}} -import "github.com/consideritdone/polywrap-go/polywrap" +import "github.com/polywrap/go-wrap/polywrap" {{/enabled}} {{/getImplementations}} {{/capabilities}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Serialization-go.mustache index c30f7d21ec..039023a802 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Serialization-go.mustache @@ -1,6 +1,6 @@ package {{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}} {{#makeImports}} - github.com/consideritdone/polywrap-go/polywrap/msgpack, + github.com/polywrap/go-wrap/polywrap/msgpack, {{#arguments}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}} {{/arguments}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Wrapped-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Wrapped-go.mustache index 3f4fe38bd8..6354293f91 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Wrapped-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Wrapped-go.mustache @@ -2,7 +2,7 @@ package {{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}} {{#methods.length}} import ( - "github.com/consideritdone/polywrap-go/polywrap" + "github.com/polywrap/go-wrap/polywrap" ) {{/methods.length}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%-go.mustache index b650c91755..9901f3f3a7 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%-go.mustache @@ -1,6 +1,6 @@ package {{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}} {{#makeImports}} - github.com/consideritdone/polywrap-go/polywrap/msgpack, + github.com/polywrap/go-wrap/polywrap/msgpack, {{#properties}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}} {{/properties}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%Serialization-go.mustache index 8623350c71..11f4aa2f0a 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%Serialization-go.mustache @@ -1,6 +1,6 @@ package {{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}} {{#makeImports}} - github.com/consideritdone/polywrap-go/polywrap/msgpack, + github.com/polywrap/go-wrap/polywrap/msgpack, {{#properties}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}} {{/properties}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/interface-type/%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/interface-type/%type%-go.mustache index 861f5555e7..4e32c4aeea 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/interface-type/%type%-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/interface-type/%type%-go.mustache @@ -3,7 +3,7 @@ package interfaces {{#capabilities}} {{#getImplementations}} {{#enabled}} -import "github.com/consideritdone/polywrap-go/polywrap" +import "github.com/polywrap/go-wrap/polywrap" {{/enabled}} {{/getImplementations}} {{/capabilities}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/main-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/main-go.mustache index 81d81a97d3..314c61d9ab 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/main-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/main-go.mustache @@ -2,7 +2,7 @@ package main import ( "{{goImport}}/src/wrap/module" - "github.com/consideritdone/polywrap-go/polywrap" + "github.com/polywrap/go-wrap/polywrap" ) //export _wrap_invoke diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Serialization-go.mustache index 2fbb08052a..330361cbf3 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Serialization-go.mustache @@ -1,6 +1,6 @@ package module {{#makeImports}} - github.com/consideritdone/polywrap-go/polywrap/msgpack, + github.com/polywrap/go-wrap/polywrap/msgpack, . {{goImport}}/src/wrap/types, {{#importedTypes}} . {{goImport}}/src/wrap/imported/{{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}}, diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Wrapped-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Wrapped-go.mustache index 7b20b03c06..ca99702f61 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Wrapped-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Wrapped-go.mustache @@ -1,6 +1,6 @@ package module {{#makeImports}} - {{#methods}}{{#env}}github.com/consideritdone/polywrap-go/polywrap,. {{goImport}}/src/wrap/types,{{/env}}{{/methods}} + {{#methods}}{{#env}}github.com/polywrap/go-wrap/polywrap,. {{goImport}}/src/wrap/types,{{/env}}{{/methods}} {{goImport}}/module as methods, {{/makeImports}} {{#methods}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%-go.mustache index ad2d15cd14..6485d72865 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%-go.mustache @@ -1,6 +1,6 @@ package types {{#makeImports}} - github.com/consideritdone/polywrap-go/polywrap/msgpack, + github.com/polywrap/go-wrap/polywrap/msgpack, {{#properties}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}} {{/properties}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%Serialization-go.mustache index f5964d5008..249c10f617 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%Serialization-go.mustache @@ -1,6 +1,6 @@ package types {{#makeImports}} - github.com/consideritdone/polywrap-go/polywrap/msgpack, + github.com/polywrap/go-wrap/polywrap/msgpack, {{#properties}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}} {{/properties}} diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env.go index a82fa76d57..a924f65eb8 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env.go @@ -1,7 +1,7 @@ package test_import import ( - "github.com/consideritdone/polywrap-go/polywrap/msgpack" + "github.com/polywrap/go-wrap/polywrap/msgpack" ) type TestImport_Env struct { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env_serialization.go index f0bca14901..837a93f923 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env_serialization.go @@ -1,7 +1,7 @@ package test_import import ( - "github.com/consideritdone/polywrap-go/polywrap/msgpack" + "github.com/polywrap/go-wrap/polywrap/msgpack" ) func serializeTestImport_Env(value *TestImport_Env) []byte { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object.go index 8e38e568f2..027a991bc5 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object.go @@ -1,7 +1,7 @@ package test_import import ( - "github.com/consideritdone/polywrap-go/polywrap/msgpack" + "github.com/polywrap/go-wrap/polywrap/msgpack" ) type TestImport_AnotherObject struct { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object_serialization.go index 8fd5893842..36168acfb1 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object_serialization.go @@ -1,7 +1,7 @@ package test_import import ( - "github.com/consideritdone/polywrap-go/polywrap/msgpack" + "github.com/polywrap/go-wrap/polywrap/msgpack" ) func serializeTestImport_AnotherObject(value *TestImport_AnotherObject) []byte { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object.go index 6b60414f31..c4c6cafbc6 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object.go @@ -1,7 +1,7 @@ package test_import import ( - "github.com/consideritdone/polywrap-go/polywrap/msgpack" + "github.com/polywrap/go-wrap/polywrap/msgpack" ) type TestImport_Object struct { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object_serialization.go index e9e87399a2..d3c17cc26d 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object_serialization.go @@ -1,7 +1,7 @@ package test_import import ( - "github.com/consideritdone/polywrap-go/polywrap/msgpack" + "github.com/polywrap/go-wrap/polywrap/msgpack" ) func serializeTestImport_Object(value *TestImport_Object) []byte { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_serialization.go index 3189323eff..c9e912ee41 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_serialization.go @@ -1,7 +1,7 @@ package test_import import ( - "github.com/consideritdone/polywrap-go/polywrap/msgpack" + "github.com/polywrap/go-wrap/polywrap/msgpack" ) type ArgsImportedMethod struct { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_wrapped.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_wrapped.go index 4a46374cc5..3b4014acad 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_wrapped.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_wrapped.go @@ -1,7 +1,7 @@ package test_import import ( - "github.com/consideritdone/polywrap-go/polywrap" + "github.com/polywrap/go-wrap/polywrap" ) func MethodImportedMethod(uri string, args *ArgsImportedMethod) (*TestImport_Object, error) { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/interfaces/test_import.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/interfaces/test_import.go index c82ec76871..405f79c9a7 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/interfaces/test_import.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/interfaces/test_import.go @@ -1,6 +1,6 @@ package interfaces -import "github.com/consideritdone/polywrap-go/polywrap" +import "github.com/polywrap/go-wrap/polywrap" func TestImportImplementations() []string { return polywrap.WrapGetImplementations("testimport.uri.eth") diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go index 605398790b..8c1f02b09d 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go @@ -2,7 +2,7 @@ package main import ( "github.com/testorg/testrepo/wrap/module" - "github.com/consideritdone/polywrap-go/polywrap" + "github.com/polywrap/go-wrap/polywrap" ) //export _wrap_invoke diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_serialization.go index 2bc6f24e14..0e3f6bc9e3 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_serialization.go @@ -2,7 +2,7 @@ package module import ( . "github.com/testorg/testrepo/wrap/types" - "github.com/consideritdone/polywrap-go/polywrap/msgpack" + "github.com/polywrap/go-wrap/polywrap/msgpack" ) func DeserializeModuleMethodArgs(argsBuf []byte) *MethodArgsModuleMethod { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_wrapped.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_wrapped.go index 286449f746..9aa00c68b4 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_wrapped.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_wrapped.go @@ -2,7 +2,7 @@ package module import ( . "github.com/testorg/testrepo/wrap/types" - "github.com/consideritdone/polywrap-go/polywrap" + "github.com/polywrap/go-wrap/polywrap" methods "github.com/testorg/testrepo/module" ) diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_another_type.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_another_type.go index c66983302c..7b41639530 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_another_type.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_another_type.go @@ -1,7 +1,7 @@ package types import ( - "github.com/consideritdone/polywrap-go/polywrap/msgpack" + "github.com/polywrap/go-wrap/polywrap/msgpack" ) type AnotherType struct { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_another_type_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_another_type_serialization.go index 3bb5d8f434..dc10397874 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_another_type_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_another_type_serialization.go @@ -1,7 +1,7 @@ package types import ( - "github.com/consideritdone/polywrap-go/polywrap/msgpack" + "github.com/polywrap/go-wrap/polywrap/msgpack" ) func serializeAnotherType(value *AnotherType) []byte { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value.go index 155d3c7d21..881760040a 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value.go @@ -1,7 +1,7 @@ package types import ( - "github.com/consideritdone/polywrap-go/polywrap/msgpack" + "github.com/polywrap/go-wrap/polywrap/msgpack" ) type CustomMapValue struct { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value_serialization.go index 2e0ee49210..11ca1da95e 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value_serialization.go @@ -1,7 +1,7 @@ package types import ( - "github.com/consideritdone/polywrap-go/polywrap/msgpack" + "github.com/polywrap/go-wrap/polywrap/msgpack" ) func serializeCustomMapValue(value *CustomMapValue) []byte { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type.go index ae268082e8..123a0997e1 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type.go @@ -1,8 +1,8 @@ package types import ( - "github.com/consideritdone/polywrap-go/polywrap/msgpack" - "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" + "github.com/polywrap/go-wrap/polywrap/msgpack" + "github.com/polywrap/go-wrap/polywrap/msgpack/big" "github.com/valyala/fastjson" ) diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go index 67a836ae91..b3ebfa9d1a 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go @@ -1,8 +1,8 @@ package types import ( - "github.com/consideritdone/polywrap-go/polywrap/msgpack" - "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" + "github.com/polywrap/go-wrap/polywrap/msgpack" + "github.com/polywrap/go-wrap/polywrap/msgpack/big" "github.com/valyala/fastjson" ) diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_env.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_env.go index 3ee18a765c..469e63df31 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_env.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_env.go @@ -1,7 +1,7 @@ package types import ( - "github.com/consideritdone/polywrap-go/polywrap/msgpack" + "github.com/polywrap/go-wrap/polywrap/msgpack" ) type Env struct { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_env_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_env_serialization.go index 802539ef32..bac49ecae9 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_env_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_env_serialization.go @@ -1,7 +1,7 @@ package types import ( - "github.com/consideritdone/polywrap-go/polywrap/msgpack" + "github.com/polywrap/go-wrap/polywrap/msgpack" ) func serializeEnv(value *Env) []byte { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse.go index 3a1d9679c3..1bfac78946 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse.go @@ -1,7 +1,7 @@ package types import ( - "github.com/consideritdone/polywrap-go/polywrap/msgpack" + "github.com/polywrap/go-wrap/polywrap/msgpack" ) type Else struct { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse_serialization.go index 5aa212aca2..925f93a1ea 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse_serialization.go @@ -1,7 +1,7 @@ package types import ( - "github.com/consideritdone/polywrap-go/polywrap/msgpack" + "github.com/polywrap/go-wrap/polywrap/msgpack" ) func serializeElse(value *Else) []byte { From 1a3d102503565ec266c6a777ce8d11b64f1b97c6 Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Wed, 5 Jul 2023 23:26:55 +0200 Subject: [PATCH 35/65] chore: schema-bind tests pass --- .../enum_test_import__enum__return.go | 38 +++ .../test_import/env_test_import__env.go | 9 +- .../env_test_import__env_serialization.go | 224 ++++++++++++++++-- .../test_import__module_serialization.go | 45 ++++ .../test_import__module_wrapped.go | 14 ++ .../cases/bind/sanity/output/wasm-go/main.go | 2 +- .../wasm-go/module/module_serialization.go | 31 ++- .../output/wasm-go/module/module_wrapped.go | 2 +- .../output/wasm-go/types/module_args.go | 1 + .../wasm-go/types/object_custom_type.go | 6 +- .../types/object_custom_type_serialization.go | 80 +++---- 11 files changed, 391 insertions(+), 61 deletions(-) create mode 100644 packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/enum_test_import__enum__return.go diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/enum_test_import__enum__return.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/enum_test_import__enum__return.go new file mode 100644 index 0000000000..893faccee3 --- /dev/null +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/enum_test_import__enum__return.go @@ -0,0 +1,38 @@ +package test_import + +type TestImport_Enum_Return int32 + +const ( + TestImport_Enum_ReturnSTRING = iota + TestImport_Enum_ReturnBYTES = iota + testImport_Enum_ReturnMax = iota +) + +func SanitizeTestImport_Enum_ReturnValue(value int32) { + if !(value >= 0 && value < int32(testImport_Enum_ReturnMax)) { + panic("Invalid value for enum 'TestImport_Enum_Return'") + } +} + +func GetTestImport_Enum_ReturnValue(key string) TestImport_Enum_Return { + switch key { + case "STRING": + return TestImport_Enum_ReturnSTRING + case "BYTES": + return TestImport_Enum_ReturnBYTES + default: + panic("Invalid key for enum 'TestImport_Enum_Return'") + } +} + +func GetTestImport_Enum_ReturnKey(value TestImport_Enum_Return) string { + SanitizeTestImport_Enum_ReturnValue(int32(value)) + switch value { + case TestImport_Enum_ReturnSTRING: + return "STRING" + case TestImport_Enum_ReturnBYTES: + return "BYTES" + default: + panic("Invalid value for enum 'TestImport_Enum_Return'") + } +} diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env.go index a924f65eb8..fea45b5c0f 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env.go @@ -5,7 +5,14 @@ import ( ) type TestImport_Env struct { - EnviroProp string + Object TestImport_AnotherObject + OptObject *TestImport_AnotherObject + ObjectArray []TestImport_AnotherObject + OptObjectArray []*TestImport_AnotherObject + En TestImport_Enum + OptEnum *TestImport_Enum + EnumArray []TestImport_Enum + OptEnumArray []*TestImport_Enum } func TestImport_EnvToBuffer(value *TestImport_Env) []byte { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env_serialization.go index 837a93f923..592d639a05 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env_serialization.go @@ -12,12 +12,101 @@ func serializeTestImport_Env(value *TestImport_Env) []byte { } func writeTestImport_Env(writer msgpack.Write, value *TestImport_Env) { - writer.WriteMapLength(1) - writer.Context().Push("EnviroProp", "string", "writing property") - writer.WriteString("EnviroProp") + writer.WriteMapLength(8) + writer.Context().Push("Object", "TestImport_AnotherObject", "writing property") + writer.WriteString("Object") { - v := value.EnviroProp - writer.WriteString(v) + v := value.Object + TestImport_AnotherObjectWrite(writer, &v) + } + writer.Context().Pop() + writer.Context().Push("OptObject", "*TestImport_AnotherObject", "writing property") + writer.WriteString("OptObject") + { + v := value.OptObject + TestImport_AnotherObjectWrite(writer, v) + } + writer.Context().Pop() + writer.Context().Push("ObjectArray", "[]TestImport_AnotherObject", "writing property") + writer.WriteString("ObjectArray") + if value.ObjectArray == nil { + writer.WriteNil() + } else if len(value.ObjectArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.ObjectArray { + { + v := value.ObjectArray[i0] + TestImport_AnotherObjectWrite(writer, &v) + } + } + } + writer.Context().Pop() + writer.Context().Push("OptObjectArray", "[]*TestImport_AnotherObject", "writing property") + writer.WriteString("OptObjectArray") + if value.OptObjectArray == nil { + writer.WriteNil() + } else if len(value.OptObjectArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.OptObjectArray { + { + v := value.OptObjectArray[i0] + TestImport_AnotherObjectWrite(writer, v) + } + } + } + writer.Context().Pop() + writer.Context().Push("En", "TestImport_Enum", "writing property") + writer.WriteString("En") + { + v := value.En + writer.WriteI32(int32(v)) + } + writer.Context().Pop() + writer.Context().Push("OptEnum", "*TestImport_Enum", "writing property") + writer.WriteString("OptEnum") + { + v := value.OptEnum + if v == nil { + writer.WriteNil() + } else { + writer.WriteI32(int32(*v)) + } + } + writer.Context().Pop() + writer.Context().Push("EnumArray", "[]TestImport_Enum", "writing property") + writer.WriteString("EnumArray") + if value.EnumArray == nil { + writer.WriteNil() + } else if len(value.EnumArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.EnumArray { + { + v := value.EnumArray[i0] + writer.WriteI32(int32(v)) + } + } + } + writer.Context().Pop() + writer.Context().Push("OptEnumArray", "[]*TestImport_Enum", "writing property") + writer.WriteString("OptEnumArray") + if value.OptEnumArray == nil { + writer.WriteNil() + } else if len(value.OptEnumArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.OptEnumArray { + { + v := value.OptEnumArray[i0] + if v == nil { + writer.WriteNil() + } else { + writer.WriteI32(int32(*v)) + } + } + } } writer.Context().Pop() } @@ -30,28 +119,135 @@ func deserializeTestImport_Env(data []byte) *TestImport_Env { func readTestImport_Env(reader msgpack.Read) *TestImport_Env { var ( - _enviroProp string - _enviroPropSet bool + _object TestImport_AnotherObject + _objectSet bool + _optObject *TestImport_AnotherObject + _objectArray []TestImport_AnotherObject + _objectArraySet bool + _optObjectArray []*TestImport_AnotherObject + _en TestImport_Enum + _enSet bool + _optEnum *TestImport_Enum + _enumArray []TestImport_Enum + _enumArraySet bool + _optEnumArray []*TestImport_Enum ) for i := int32(reader.ReadMapLength()); i > 0; i-- { field := reader.ReadString() reader.Context().Push(field, "unknown", "searching for property type") switch field { - case "EnviroProp": - reader.Context().Push(field, "string", "type found, reading property") - _enviroProp = reader.ReadString() - _enviroPropSet = true + case "Object": + reader.Context().Push(field, "TestImport_AnotherObject", "type found, reading property") + if v := TestImport_AnotherObjectRead(reader); v != nil { + _object = *v + } + _objectSet = true + reader.Context().Pop() + case "OptObject": + reader.Context().Push(field, "*TestImport_AnotherObject", "type found, reading property") + if v := TestImport_AnotherObjectRead(reader); v != nil { + _optObject = v + } + reader.Context().Pop() + case "ObjectArray": + reader.Context().Push(field, "[]TestImport_AnotherObject", "type found, reading property") + if reader.IsNil() { + _objectArray = nil + } else { + ln0 := reader.ReadArrayLength() + _objectArray = make([]TestImport_AnotherObject, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + if v := TestImport_AnotherObjectRead(reader); v != nil { + _objectArray[i0] = *v + } + } + } + _objectArraySet = true + reader.Context().Pop() + case "OptObjectArray": + reader.Context().Push(field, "[]*TestImport_AnotherObject", "type found, reading property") + if reader.IsNil() { + _optObjectArray = nil + } else { + ln0 := reader.ReadArrayLength() + _optObjectArray = make([]*TestImport_AnotherObject, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + if v := TestImport_AnotherObjectRead(reader); v != nil { + _optObjectArray[i0] = v + } + } + } + reader.Context().Pop() + case "En": + reader.Context().Push(field, "TestImport_Enum", "type found, reading property") + _en = TestImport_Enum(reader.ReadI32()) + SanitizeTestImport_EnumValue(int32(_en)) + _enSet = true + reader.Context().Pop() + case "OptEnum": + reader.Context().Push(field, "*TestImport_Enum", "type found, reading property") + if !reader.IsNil() { + v := TestImport_Enum(reader.ReadI32()) + SanitizeTestImport_EnumValue(int32(v)) + _optEnum = &v + } + reader.Context().Pop() + case "EnumArray": + reader.Context().Push(field, "[]TestImport_Enum", "type found, reading property") + if reader.IsNil() { + _enumArray = nil + } else { + ln0 := reader.ReadArrayLength() + _enumArray = make([]TestImport_Enum, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + _enumArray[i0] = TestImport_Enum(reader.ReadI32()) + SanitizeTestImport_EnumValue(int32(_enumArray[i0])) + } + } + _enumArraySet = true + reader.Context().Pop() + case "OptEnumArray": + reader.Context().Push(field, "[]*TestImport_Enum", "type found, reading property") + if reader.IsNil() { + _optEnumArray = nil + } else { + ln0 := reader.ReadArrayLength() + _optEnumArray = make([]*TestImport_Enum, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + if !reader.IsNil() { + v := TestImport_Enum(reader.ReadI32()) + SanitizeTestImport_EnumValue(int32(v)) + _optEnumArray[i0] = &v + } + } + } reader.Context().Pop() } reader.Context().Pop() } - if !_enviroPropSet { - panic(reader.Context().PrintWithContext("Missing required property: 'enviroProp: String'")) + if !_objectSet { + panic(reader.Context().PrintWithContext("Missing required property: 'object: TestImport_AnotherObject'")) + } + if !_objectArraySet { + panic(reader.Context().PrintWithContext("Missing required property: 'objectArray: [TestImport_AnotherObject]'")) + } + if !_enSet { + panic(reader.Context().PrintWithContext("Missing required property: 'en: TestImport_Enum'")) + } + if !_enumArraySet { + panic(reader.Context().PrintWithContext("Missing required property: 'enumArray: [TestImport_Enum]'")) } return &TestImport_Env{ - EnviroProp: _enviroProp, + Object: _object, + OptObject: _optObject, + ObjectArray: _objectArray, + OptObjectArray: _optObjectArray, + En: _en, + OptEnum: _optEnum, + EnumArray: _enumArray, + OptEnumArray: _optEnumArray, } } diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_serialization.go index c9e912ee41..032f87aa14 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_serialization.go @@ -243,3 +243,48 @@ func DeserializeAnotherMethodResult(argsBuf []byte) int32 { reader.Context().Pop() return value } + +type ArgsReturnsArrayOfEnums struct { + Arg string +} + +func SerializeReturnsArrayOfEnumsArgs(value *ArgsReturnsArrayOfEnums) []byte { + ctx := msgpack.NewContext("Serializing module-type: ReturnsArrayOfEnums") + encoder := msgpack.NewWriteEncoder(ctx) + WriteReturnsArrayOfEnumsArgs(encoder, value) + return encoder.Buffer() +} + +func WriteReturnsArrayOfEnumsArgs(writer msgpack.Write, value *ArgsReturnsArrayOfEnums) { + writer.WriteMapLength(1) + writer.Context().Push("arg", "string", "writing property") + writer.WriteString("arg") + { + v := value.Arg + writer.WriteString(v) + } + writer.Context().Pop() +} + +func DeserializeReturnsArrayOfEnumsResult(argsBuf []byte) []*TestImport_Enum_Return { + ctx := msgpack.NewContext("Deserializing module-type: ReturnsArrayOfEnums") + reader := msgpack.NewReadDecoder(ctx, argsBuf) + + reader.Context().Push("returnsArrayOfEnums", "[]*TestImport_Enum_Return", "reading function output") + var value []*TestImport_Enum_Return + if reader.IsNil() { + value = nil + } else { + ln0 := reader.ReadArrayLength() + value = make([]*TestImport_Enum_Return, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + if !reader.IsNil() { + v := TestImport_Enum_Return(reader.ReadI32()) + SanitizeTestImport_Enum_ReturnValue(int32(v)) + _returnsArrayOfEnums[i0] = &v + } + } + } + reader.Context().Pop() + return value +} diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_wrapped.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_wrapped.go index 3b4014acad..bb1cefafe8 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_wrapped.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_wrapped.go @@ -31,3 +31,17 @@ func MethodAnotherMethod(uri string, args *ArgsAnotherMethod) (int32, error) { } return data, err } + +func MethodReturnsArrayOfEnums(uri string, args *ArgsReturnsArrayOfEnums) ([]*TestImport_Enum_Return, error) { + argsBuf := SerializeReturnsArrayOfEnumsArgs(args) + var ( + err error + raw []byte + data []*TestImport_Enum_Return + ) + raw, err = polywrap.WrapSubinvokeImplementation("testimport.uri.eth", uri, "returnsArrayOfEnums", argsBuf) + if err == nil { + data = DeserializeReturnsArrayOfEnumsResult(raw) + } + return data, err +} diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go index 8c1f02b09d..5a4fb1b074 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go @@ -1,7 +1,7 @@ package main import ( - "github.com/testorg/testrepo/wrap/module" + "github.com/testorg/testrepo/src/wrap/module" "github.com/polywrap/go-wrap/polywrap" ) diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_serialization.go index 0e3f6bc9e3..980351923c 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_serialization.go @@ -1,7 +1,7 @@ package module import ( - . "github.com/testorg/testrepo/wrap/types" + . "github.com/testorg/testrepo/src/wrap/types" "github.com/polywrap/go-wrap/polywrap/msgpack" ) @@ -23,6 +23,8 @@ func DeserializeModuleMethodArgs(argsBuf []byte) *MethodArgsModuleMethod { _mapSet bool _mapOfArr map[string][]int32 _mapOfArrSet bool + _mapOfMap map[string]map[string]int32 + _mapOfMapSet bool _mapOfObj map[string]AnotherType _mapOfObjSet bool _mapOfArrOfObj map[string][]AnotherType @@ -125,6 +127,29 @@ func DeserializeModuleMethodArgs(argsBuf []byte) *MethodArgsModuleMethod { } _mapOfArrSet = true reader.Context().Pop() + case "mapOfMap": + reader.Context().Push(field, "map[string]map[string]int32", "type found, reading property") + if reader.IsNil() { + _mapOfMap = nil + } else { + ln0 := reader.ReadMapLength() + _mapOfMap = make(map[string]map[string]int32) + for j0 := uint32(0); j0 < ln0; j0++ { + i0 := reader.ReadString() + if reader.IsNil() { + _mapOfMap[i0] = nil + } else { + ln1 := reader.ReadMapLength() + _mapOfMap[i0] = make(map[string]int32) + for j1 := uint32(0); j1 < ln1; j1++ { + i1 := reader.ReadString() + _mapOfMap[i0][i1] = reader.ReadI32() + } + } + } + } + _mapOfMapSet = true + reader.Context().Pop() case "mapOfObj": reader.Context().Push(field, "map[string]AnotherType", "type found, reading property") if reader.IsNil() { @@ -184,6 +209,9 @@ func DeserializeModuleMethodArgs(argsBuf []byte) *MethodArgsModuleMethod { if !_mapOfArrSet { panic(reader.Context().PrintWithContext("Missing required property: 'mapOfArr: Map'")) } + if !_mapOfMapSet { + panic(reader.Context().PrintWithContext("Missing required property: 'mapOfMap: Map>'")) + } if !_mapOfObjSet { panic(reader.Context().PrintWithContext("Missing required property: 'mapOfObj: Map'")) } @@ -200,6 +228,7 @@ func DeserializeModuleMethodArgs(argsBuf []byte) *MethodArgsModuleMethod { OptEnumArray: _optEnumArray, M_map: _map, MapOfArr: _mapOfArr, + MapOfMap: _mapOfMap, MapOfObj: _mapOfObj, MapOfArrOfObj: _mapOfArrOfObj, } diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_wrapped.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_wrapped.go index 9aa00c68b4..e9ff1de025 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_wrapped.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_wrapped.go @@ -1,7 +1,7 @@ package module import ( - . "github.com/testorg/testrepo/wrap/types" + . "github.com/testorg/testrepo/src/wrap/types" "github.com/polywrap/go-wrap/polywrap" methods "github.com/testorg/testrepo/module" ) diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_args.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_args.go index 2ec6424513..118f13d50e 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_args.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_args.go @@ -9,6 +9,7 @@ type MethodArgsModuleMethod struct { OptEnumArray []*CustomEnum M_map map[string]int32 MapOfArr map[string][]int32 + MapOfMap map[string]map[string]int32 MapOfObj map[string]AnotherType MapOfArrOfObj map[string][]AnotherType } diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type.go index 123a0997e1..280ee1c01d 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type.go @@ -28,9 +28,9 @@ type CustomType struct { OptBytes []byte M_boolean bool OptBoolean *bool - UArray []uint32 - UOptArray []uint32 - OptUOptArray []*uint32 + U_array []uint32 + UOpt_array []uint32 + _opt_uOptArray []*uint32 OptStrOptArray []*string UArrayArray [][]uint32 UOptArrayOptArray [][]*uint32 diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go index b3ebfa9d1a..2275a4e94c 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go @@ -190,46 +190,46 @@ func writeCustomType(writer msgpack.Write, value *CustomType) { } } writer.Context().Pop() - writer.Context().Push("UArray", "[]uint32", "writing property") - writer.WriteString("UArray") - if value.UArray == nil { + writer.Context().Push("U_array", "[]uint32", "writing property") + writer.WriteString("U_array") + if value.U_array == nil { writer.WriteNil() - } else if len(value.UArray) == 0 { + } else if len(value.U_array) == 0 { writer.WriteNil() } else { - for i0 := range value.UArray { + for i0 := range value.U_array { { - v := value.UArray[i0] + v := value.U_array[i0] writer.WriteU32(v) } } } writer.Context().Pop() - writer.Context().Push("UOptArray", "[]uint32", "writing property") - writer.WriteString("UOptArray") - if value.UOptArray == nil { + writer.Context().Push("UOpt_array", "[]uint32", "writing property") + writer.WriteString("UOpt_array") + if value.UOpt_array == nil { writer.WriteNil() - } else if len(value.UOptArray) == 0 { + } else if len(value.UOpt_array) == 0 { writer.WriteNil() } else { - for i0 := range value.UOptArray { + for i0 := range value.UOpt_array { { - v := value.UOptArray[i0] + v := value.UOpt_array[i0] writer.WriteU32(v) } } } writer.Context().Pop() - writer.Context().Push("OptUOptArray", "[]*uint32", "writing property") - writer.WriteString("OptUOptArray") - if value.OptUOptArray == nil { + writer.Context().Push("_opt_uOptArray", "[]*uint32", "writing property") + writer.WriteString("_opt_uOptArray") + if value._opt_uOptArray == nil { writer.WriteNil() - } else if len(value.OptUOptArray) == 0 { + } else if len(value._opt_uOptArray) == 0 { writer.WriteNil() } else { - for i0 := range value.OptUOptArray { + for i0 := range value._opt_uOptArray { { - v := value.OptUOptArray[i0] + v := value._opt_uOptArray[i0] if v == nil { writer.WriteNil() } else { @@ -615,10 +615,10 @@ func readCustomType(reader msgpack.Read) *CustomType { _boolean bool _booleanSet bool _optBoolean *bool - _uArray []uint32 - _uArraySet bool - _uOptArray []uint32 - _optUOptArray []*uint32 + _u_array []uint32 + _u_arraySet bool + _uOpt_array []uint32 + __opt_uOptArray []*uint32 _optStrOptArray []*string _uArrayArray [][]uint32 _uArrayArraySet bool @@ -774,42 +774,42 @@ func readCustomType(reader msgpack.Read) *CustomType { _optBoolean = &v } reader.Context().Pop() - case "UArray": + case "U_array": reader.Context().Push(field, "[]uint32", "type found, reading property") if reader.IsNil() { - _uArray = nil + _u_array = nil } else { ln0 := reader.ReadArrayLength() - _uArray = make([]uint32, ln0) + _u_array = make([]uint32, ln0) for i0 := uint32(0); i0 < ln0; i0++ { - _uArray[i0] = reader.ReadU32() + _u_array[i0] = reader.ReadU32() } } - _uArraySet = true + _u_arraySet = true reader.Context().Pop() - case "UOptArray": + case "UOpt_array": reader.Context().Push(field, "[]uint32", "type found, reading property") if reader.IsNil() { - _uOptArray = nil + _uOpt_array = nil } else { ln0 := reader.ReadArrayLength() - _uOptArray = make([]uint32, ln0) + _uOpt_array = make([]uint32, ln0) for i0 := uint32(0); i0 < ln0; i0++ { - _uOptArray[i0] = reader.ReadU32() + _uOpt_array[i0] = reader.ReadU32() } } reader.Context().Pop() - case "OptUOptArray": + case "_opt_uOptArray": reader.Context().Push(field, "[]*uint32", "type found, reading property") if reader.IsNil() { - _optUOptArray = nil + __opt_uOptArray = nil } else { ln0 := reader.ReadArrayLength() - _optUOptArray = make([]*uint32, ln0) + __opt_uOptArray = make([]*uint32, ln0) for i0 := uint32(0); i0 < ln0; i0++ { if !reader.IsNil() { v := reader.ReadU32() - _optUOptArray[i0] = &v + __opt_uOptArray[i0] = &v } } } @@ -1163,8 +1163,8 @@ func readCustomType(reader msgpack.Read) *CustomType { if !_booleanSet { panic(reader.Context().PrintWithContext("Missing required property: 'boolean: Boolean'")) } - if !_uArraySet { - panic(reader.Context().PrintWithContext("Missing required property: 'uArray: [UInt]'")) + if !_u_arraySet { + panic(reader.Context().PrintWithContext("Missing required property: 'u_array: [UInt]'")) } if !_uArrayArraySet { panic(reader.Context().PrintWithContext("Missing required property: 'uArrayArray: [[UInt]]'")) @@ -1224,9 +1224,9 @@ func readCustomType(reader msgpack.Read) *CustomType { OptBytes: _optBytes, M_boolean: _boolean, OptBoolean: _optBoolean, - UArray: _uArray, - UOptArray: _uOptArray, - OptUOptArray: _optUOptArray, + U_array: _u_array, + UOpt_array: _uOpt_array, + _opt_uOptArray: __opt_uOptArray, OptStrOptArray: _optStrOptArray, UArrayArray: _uArrayArray, UOptArrayOptArray: _uOptArrayOptArray, From 5e45c99015d85da86e7b4f4df020941871ff89b8 Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Thu, 6 Jul 2023 04:23:49 +0200 Subject: [PATCH 36/65] chore: add back compiler & codegen overrides --- .../cli/src/__tests__/e2e/build-go.spec.ts | 72 ++++++++++++++++++ .../lib/build-strategies/BuildOverrides.ts | 36 +++++++++ .../src/lib/build-strategies/BuildStrategy.ts | 23 ++++-- .../cli/src/lib/build-strategies/index.ts | 1 + .../strategies/DockerImageStrategy.ts | 6 +- .../strategies/DockerVMStrategy.ts | 13 +--- packages/cli/src/lib/codegen/CodeGenerator.ts | 16 +++- .../cli/src/lib/codegen/CodegenOverrides.ts | 35 +++++++++ packages/cli/src/lib/codegen/index.ts | 1 + .../language-overrides/wasm/golang/index.ts | 73 +++++++++++++++++++ .../language-overrides/wasm/rust/index.ts | 18 +++++ 11 files changed, 272 insertions(+), 22 deletions(-) create mode 100644 packages/cli/src/__tests__/e2e/build-go.spec.ts create mode 100644 packages/cli/src/lib/build-strategies/BuildOverrides.ts create mode 100644 packages/cli/src/lib/codegen/CodegenOverrides.ts create mode 100644 packages/cli/src/lib/defaults/language-overrides/wasm/golang/index.ts create mode 100644 packages/cli/src/lib/defaults/language-overrides/wasm/rust/index.ts diff --git a/packages/cli/src/__tests__/e2e/build-go.spec.ts b/packages/cli/src/__tests__/e2e/build-go.spec.ts new file mode 100644 index 0000000000..138a00f6f4 --- /dev/null +++ b/packages/cli/src/__tests__/e2e/build-go.spec.ts @@ -0,0 +1,72 @@ +import { polywrapCli } from "./utils"; +import { Commands } from "@polywrap/cli-js"; +import { GetPathToCliTestFiles } from "@polywrap/test-cases"; +import fs from "fs"; +import path from "path"; + +jest.setTimeout(1500000); + +describe("e2e tests for build command", () => { + const testCaseRoot = path.join(GetPathToCliTestFiles(), "build-cmd/wasm/go"); + const testCases = fs + .readdirSync(testCaseRoot, { withFileTypes: true }) + .filter((dirent) => dirent.isDirectory()) + .map((dirent) => dirent.name); + + const getTestCaseDir = (index: number) => + path.join(testCaseRoot, testCases[index]); + + describe("Image strategy", () => { + it("Builds for go", async () => { + const { exitCode: code, stdout: output } = await Commands.build({ + strategy: "image", + verbose: true + }, { + cwd: getTestCaseDir(0), + cli: polywrapCli, + }); + const buildDir = `./build`; + + expect(code).toEqual(0); + expect(output).toContain(`Artifacts written to ${buildDir}`); + expect(output).toContain(`WRAP manifest written in ${buildDir}/wrap.info`); + }); + }) + + // NOTE: Skipped because CI needs system prequisites: golang + describe.skip("Local strategy", () => { + it("Builds for rust", async () => { + const { exitCode: code, stdout: output } = await Commands.build({ + strategy: "local", + verbose: true + }, { + cwd: getTestCaseDir(0), + cli: polywrapCli, + }); + + const buildDir = `./build`; + + expect(code).toEqual(0); + expect(output).toContain(`Artifacts written to ${buildDir}`); + expect(output).toContain(`WRAP manifest written in ${buildDir}/wrap.info`); + }); + }) + + describe("VM strategy", () => { + it("Builds for go", async () => { + const { exitCode: code, stdout: output } = await Commands.build({ + strategy: "vm", + verbose: true + }, { + cwd: getTestCaseDir(0), + cli: polywrapCli, + }); + + const buildDir = `./build`; + + expect(code).toEqual(0); + expect(output).toContain(`Artifacts written to ${buildDir}`); + expect(output).toContain(`WRAP manifest written in ${buildDir}/wrap.info`); + }); + }) +}); diff --git a/packages/cli/src/lib/build-strategies/BuildOverrides.ts b/packages/cli/src/lib/build-strategies/BuildOverrides.ts new file mode 100644 index 0000000000..cd1836af2b --- /dev/null +++ b/packages/cli/src/lib/build-strategies/BuildOverrides.ts @@ -0,0 +1,36 @@ +import { PolywrapManifestLanguage } from "../"; + +import { PolywrapManifest } from "@polywrap/polywrap-manifest-types-js"; +import path from "path"; +import fs from "fs"; + +export interface BuildOverrides { + validateManifest: ( + manifest: PolywrapManifest + ) => Promise; +} + +export async function tryGetBuildOverrides( + language: PolywrapManifestLanguage +): Promise { + const modulePath = path.join( + __dirname, + "..", + "defaults", + "language-overrides", + language, + "index.js" + ); + let overrides: BuildOverrides | undefined; + + if (fs.existsSync(modulePath)) { + const module = await import(modulePath); + + // Get any build overrides for the given build-image + if (module.getBuildOverrides) { + overrides = module.getBuildOverrides() as BuildOverrides; + } + } + + return Promise.resolve(overrides); +} diff --git a/packages/cli/src/lib/build-strategies/BuildStrategy.ts b/packages/cli/src/lib/build-strategies/BuildStrategy.ts index 9b0086903c..0e5054c0a0 100644 --- a/packages/cli/src/lib/build-strategies/BuildStrategy.ts +++ b/packages/cli/src/lib/build-strategies/BuildStrategy.ts @@ -1,9 +1,10 @@ +import { tryGetBuildOverrides } from "./BuildOverrides"; import { PolywrapProject } from "../project"; import fse from "fs-extra"; import path from "path"; -export interface BuildStrategyArgs { +export interface BuildStrategyConfig { project: PolywrapProject; outputDir: string; } @@ -12,7 +13,7 @@ export abstract class BuildStrategy { protected project: PolywrapProject; protected outputDir: string; - constructor({ project, outputDir }: BuildStrategyArgs) { + constructor({ project, outputDir }: BuildStrategyConfig) { this.project = project; this.outputDir = outputDir; } @@ -23,7 +24,7 @@ export abstract class BuildStrategy { async build(): Promise { const language = await this.project.getManifestLanguage(); - const defaultsOfStrategyUsed = path.join( + const buildStrategyDir = path.join( __dirname, "..", "defaults", @@ -31,17 +32,27 @@ export abstract class BuildStrategy { language, this.getStrategyName() ); + + // Cache all build strategy files const strategyUsedCacheDir = this.project.getCachePath( PolywrapProject.cacheLayout.buildStrategyUsed ); - if (fse.existsSync(strategyUsedCacheDir)) { fse.removeSync(strategyUsedCacheDir); } - fse.mkdirSync(strategyUsedCacheDir, { recursive: true }); + fse.copySync(buildStrategyDir, strategyUsedCacheDir); + + // Check if build overrides exist + const overrides = await tryGetBuildOverrides(language); + + // If they do, ensure the manifest if valid before build starts + if (overrides) { + await overrides.validateManifest( + await this.project.getManifest() + ); + } - fse.copySync(defaultsOfStrategyUsed, strategyUsedCacheDir); return this.buildSources(); } } diff --git a/packages/cli/src/lib/build-strategies/index.ts b/packages/cli/src/lib/build-strategies/index.ts index 6aa24c9e22..1daa4e6083 100644 --- a/packages/cli/src/lib/build-strategies/index.ts +++ b/packages/cli/src/lib/build-strategies/index.ts @@ -1,3 +1,4 @@ +export * from "./BuildOverrides"; export * from "./BuildStrategy"; export * from "./strategies"; diff --git a/packages/cli/src/lib/build-strategies/strategies/DockerImageStrategy.ts b/packages/cli/src/lib/build-strategies/strategies/DockerImageStrategy.ts index 0de8d4552a..d200659b5a 100644 --- a/packages/cli/src/lib/build-strategies/strategies/DockerImageStrategy.ts +++ b/packages/cli/src/lib/build-strategies/strategies/DockerImageStrategy.ts @@ -7,7 +7,7 @@ import { runCommand, runCommandSync, } from "../../system"; -import { BuildStrategyArgs, BuildStrategy } from "../BuildStrategy"; +import { BuildStrategyConfig, BuildStrategy } from "../BuildStrategy"; import { intlMsg } from "../../intl"; import { logActivity } from "../../logging"; @@ -21,8 +21,8 @@ type BuildImageId = string; export class DockerImageBuildStrategy extends BuildStrategy { private _dockerLock: FileLock; - constructor(args: BuildStrategyArgs) { - super(args); + constructor(config: BuildStrategyConfig) { + super(config); if (!isDockerInstalled(this.project.logger)) { throw new Error(intlMsg.lib_docker_noInstall()); diff --git a/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts b/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts index cbf143803b..5ac3ab5285 100644 --- a/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts +++ b/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts @@ -4,7 +4,7 @@ import { isDockerInstalled, runCommand, } from "../../system"; -import { BuildStrategyArgs, BuildStrategy } from "../BuildStrategy"; +import { BuildStrategyConfig, BuildStrategy } from "../BuildStrategy"; import { intlMsg } from "../../intl"; import { BuildManifestConfig, @@ -55,8 +55,8 @@ export class DockerVMBuildStrategy extends BuildStrategy { project: string; linkedPackages: string; }; - constructor(args: BuildStrategyArgs) { - super(args); + constructor(config: BuildStrategyConfig) { + super(config); if (!isDockerInstalled(this.project.logger)) { throw new Error(intlMsg.lib_docker_noInstall()); @@ -77,13 +77,10 @@ export class DockerVMBuildStrategy extends BuildStrategy { } public async buildSources(): Promise { - console.log("Docker checking..."); await ensureDockerDaemonRunning(this.project.logger); - console.log("Building sources..."); await this._buildSources(); - console.log("Copying build output..."); await this._copyBuildOutput(); } @@ -93,17 +90,13 @@ export class DockerVMBuildStrategy extends BuildStrategy { const buildManifest = await this.project.getBuildManifest(); const buildManifestConfig = buildManifest.config as BuildManifestConfig; - console.log("Copy manifests..."); // Copy manifests buildManifestConfig.polywrap_manifests.forEach((manifestPath) => { - console.log(path.join(manifestDir, manifestPath)); - console.log(path.join(this._volumePaths.project, manifestPath)); fse.copySync( path.join(manifestDir, manifestPath), path.join(this._volumePaths.project, manifestPath) ); }); - console.log("Copying manifests done..."); const language = (await this.project.getManifestLanguage()) as BuildableLanguage; diff --git a/packages/cli/src/lib/codegen/CodeGenerator.ts b/packages/cli/src/lib/codegen/CodeGenerator.ts index affc649213..1fd3a14da2 100644 --- a/packages/cli/src/lib/codegen/CodeGenerator.ts +++ b/packages/cli/src/lib/codegen/CodeGenerator.ts @@ -20,6 +20,7 @@ import { SchemaComposer } from "../SchemaComposer"; import path from "path"; import { BindLanguage } from "@polywrap/schema-bind"; import { writeDirectorySync } from "@polywrap/os-js"; +import { CodegenOverrides, tryGetCodegenOverrides } from "./CodegenOverrides"; export interface CodeGeneratorConfig { project: Project; @@ -48,13 +49,16 @@ export class CodeGenerator { ); } + // Get overrides if they exist + const overrides = await tryGetCodegenOverrides(language); + await logActivity( this._config.project.logger, intlMsg.lib_codeGenerator_genCodeText(), intlMsg.lib_codeGenerator_genCodeError(), intlMsg.lib_codeGenerator_genCodeWarning(), async () => { - return this.runCodegen(bindLanguage); + return this.runCodegen(bindLanguage, overrides); } ); @@ -65,7 +69,8 @@ export class CodeGenerator { } } - protected async runCodegen(_: BindLanguage): Promise { + protected async runCodegen(_: BindLanguage, overrides?: CodegenOverrides): Promise { + // TODO: move codegen dir overrides into the new "language-overrides" const codegenDir = this._config.codegenDirAbs ? path.relative( this._config.project.getManifestDir(), @@ -73,10 +78,15 @@ export class CodeGenerator { ) : undefined; + const bindConfig = overrides ? await overrides.getSchemaBindConfig( + this._config.project + ) : {}; + const abi = await this._config.schemaComposer.getComposedAbis(); const binding = await this._config.project.generateSchemaBindings( abi, - codegenDir + codegenDir, + bindConfig ); resetDir(binding.outputDirAbs); diff --git a/packages/cli/src/lib/codegen/CodegenOverrides.ts b/packages/cli/src/lib/codegen/CodegenOverrides.ts new file mode 100644 index 0000000000..dd224839b5 --- /dev/null +++ b/packages/cli/src/lib/codegen/CodegenOverrides.ts @@ -0,0 +1,35 @@ +import { Project, AnyProjectManifest, AnyProjectManifestLanguage } from "../"; + +import path from "path"; +import fs from "fs"; + +export interface CodegenOverrides { + getSchemaBindConfig: ( + project: Project + ) => Promise>; +} + +export async function tryGetCodegenOverrides( + language: AnyProjectManifestLanguage +): Promise { + const modulePath = path.join( + __dirname, + "..", + "defaults", + "language-overrides", + language, + "index.js" + ); + let overrides: CodegenOverrides | undefined; + + if (fs.existsSync(modulePath)) { + const module = await import(modulePath); + + // Get any build overrides for the given build-image + if (module.getCodegenOverrides) { + overrides = module.getCodegenOverrides() as CodegenOverrides; + } + } + + return Promise.resolve(overrides); +} diff --git a/packages/cli/src/lib/codegen/index.ts b/packages/cli/src/lib/codegen/index.ts index fb9b3a2ef5..cd95e5446c 100644 --- a/packages/cli/src/lib/codegen/index.ts +++ b/packages/cli/src/lib/codegen/index.ts @@ -1,2 +1,3 @@ export * from "./CodeGenerator"; +export * from "./CodegenOverrides"; export * from "./ScriptCodeGenerator"; diff --git a/packages/cli/src/lib/defaults/language-overrides/wasm/golang/index.ts b/packages/cli/src/lib/defaults/language-overrides/wasm/golang/index.ts new file mode 100644 index 0000000000..8d383921ee --- /dev/null +++ b/packages/cli/src/lib/defaults/language-overrides/wasm/golang/index.ts @@ -0,0 +1,73 @@ +import { BuildOverrides } from "../../../../build-strategies"; +import { CodegenOverrides } from "../../../../codegen"; +import { PolywrapProject } from "../../../../project"; +import { resolvePathIfExists } from "../../../../system"; +import { intlMsg } from "../../../../intl"; + +import { PolywrapManifest } from "@polywrap/polywrap-manifest-types-js"; +import fs from "fs"; + +export function getBuildOverrides(): BuildOverrides { + return { + validateManifest: (manifest: PolywrapManifest) => { + getGoModulePath(manifest); + return Promise.resolve(); + } + } +} + +export function getCodegenOverrides(): CodegenOverrides { + return { + getSchemaBindConfig: async (project: PolywrapProject) => { + const manifest = await project.getManifest(); + const goModpath = getGoModulePath(manifest); + console.log(goModpath); + const goModuleName = readGoModuleName(goModpath); + console.log(goModuleName); + return { + goModuleName + }; + } + } +} + +function getGoModulePath(manifest: PolywrapManifest): string { + // Ensure `module: ...` is pointing to a `go.mod` file + const module = manifest.source.module; + if (!module || module.indexOf("go.mod") === -1) { + throw Error( + intlMsg.lib_wasm_golang_invalidModule({ path: module || "N/A" }) + ); + } + + // Ensure the `go.mod` file exists + const goModFile = resolvePathIfExists([module]); + if (!goModFile) { + throw Error( + intlMsg.commands_build_error_goModNotFound({ + paths: module, + }) + ); + } + + return goModFile; +} + +function readGoModuleName(filePath: string): string { + const goMod = fs.readFileSync(filePath, "utf-8"); + + if (!goMod) { + const noLoadMessage = intlMsg.lib_helpers_gomod_unableToLoad({ + path: filePath, + }); + throw Error(noLoadMessage); + } + + const regex = /module (.+)/m; + const module = goMod.match(regex); + if (!module || module.length != 2) { + throw Error(intlMsg.lib_helpers_gomod_invalid({ path: filePath })); + } + + return module[1]; +} diff --git a/packages/cli/src/lib/defaults/language-overrides/wasm/rust/index.ts b/packages/cli/src/lib/defaults/language-overrides/wasm/rust/index.ts new file mode 100644 index 0000000000..714b6c4736 --- /dev/null +++ b/packages/cli/src/lib/defaults/language-overrides/wasm/rust/index.ts @@ -0,0 +1,18 @@ +import { BuildOverrides } from "../../../../build-strategies"; +import { intlMsg } from "../../../../intl"; + +import { PolywrapManifest } from "@polywrap/polywrap-manifest-types-js"; + +export function getBuildOverrides(): BuildOverrides { + return { + validateManifest: (manifest: PolywrapManifest) => { + const module = manifest.source.module; + + if (module && module.indexOf("Cargo.toml") === -1) { + throw Error(intlMsg.lib_wasm_rust_invalidModule({ path: module })); + } + + return Promise.resolve(); + } + } +} From 1b1a0eed0593bd01d7a5977496c558a87d7fc6b4 Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Thu, 6 Jul 2023 04:24:12 +0200 Subject: [PATCH 37/65] chore: building test case --- .../bind/src/__tests__/test-cases.spec.ts | 2 +- .../bind/src/bindings/golang/wasm/index.ts | 6 ++- .../wasm/go/001-sanity/module/go.mod | 7 +++ .../wasm/go/001-sanity/module/mod.go | 7 +++ .../wasm/go/001-sanity/polywrap.yaml | 7 +++ .../wasm/go/001-sanity/schema.graphql | 5 ++ .../wasm/go/001-sanity/this-builds/build.sh | 3 ++ .../go/001-sanity/this-builds/module/go.mod | 7 +++ .../go/001-sanity/this-builds/module/go.sum | 4 ++ .../this-builds/module/main/main.go | 21 ++++++++ .../module_wrapped/module_serialization.go | 53 +++++++++++++++++++ .../main/module_wrapped/module_wrapped.go | 13 +++++ .../module/main/types/module_args.go | 5 ++ .../go/001-sanity/this-builds/module/mod.go | 7 +++ .../001-sanity/this-builds/polywrap-build.sh | 9 ++++ .../go/001-sanity/this-builds/polywrap.yaml | 7 +++ .../001-sanity/this-builds/wasm-memory.json | 25 +++++++++ 17 files changed, 186 insertions(+), 2 deletions(-) create mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/go.mod create mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/mod.go create mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/polywrap.yaml create mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/schema.graphql create mode 100755 packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/build.sh create mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/go.mod create mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/go.sum create mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/main/main.go create mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/main/module_wrapped/module_serialization.go create mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/main/module_wrapped/module_wrapped.go create mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/main/types/module_args.go create mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/mod.go create mode 100755 packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/polywrap-build.sh create mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/polywrap.yaml create mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/wasm-memory.json diff --git a/packages/schema/bind/src/__tests__/test-cases.spec.ts b/packages/schema/bind/src/__tests__/test-cases.spec.ts index d9a29f9024..6fd98b00d7 100644 --- a/packages/schema/bind/src/__tests__/test-cases.spec.ts +++ b/packages/schema/bind/src/__tests__/test-cases.spec.ts @@ -49,7 +49,7 @@ describe("Polywrap Binding Test Suite", () => { if (!bindOptions.config) { bindOptions.config = {}; } - bindOptions.config.golangModuleName = "github.com/testorg/testrepo"; + bindOptions.config.goModuleName = "github.com/testorg/testrepo"; } const output = bindSchema(bindOptions); diff --git a/packages/schema/bind/src/bindings/golang/wasm/index.ts b/packages/schema/bind/src/bindings/golang/wasm/index.ts index 8eb30576ad..72643987a5 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/index.ts +++ b/packages/schema/bind/src/bindings/golang/wasm/index.ts @@ -41,7 +41,11 @@ export const generateBinding: GenerateBindingFn = ( }; const output = result.output; const abi = applyTransforms(options.abi); - const goImport = options.config?.golangModuleName; + const goImport = options.config?.goModuleName; + + if (!goImport) { + throw Error("wasm/golang bindings requires the config property 'goModuleName' to be set"); + } // Generate object type folders if (abi.objectTypes) { diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/go.mod b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/go.mod new file mode 100644 index 0000000000..e6eb3ba066 --- /dev/null +++ b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/go.mod @@ -0,0 +1,7 @@ +module test.com/go-wrap-test + +go 1.18 + +require ( + github.com/polywrap/go-wrap 29691688fe81720d8fcbe1c19ba6492eed96f9ba +) diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/mod.go b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/mod.go new file mode 100644 index 0000000000..6266c33bf5 --- /dev/null +++ b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/mod.go @@ -0,0 +1,7 @@ +package module + +import "github.com/polywrap/cli/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/wrap/types" + +func Method(args *types.ArgsMethod) string { + return args.Arg +} diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/polywrap.yaml b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/polywrap.yaml new file mode 100644 index 0000000000..a287b38b27 --- /dev/null +++ b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/polywrap.yaml @@ -0,0 +1,7 @@ +format: 0.4.0 +project: + name: ObjectTypes + type: wasm/golang +source: + schema: ./schema.graphql + module: ./module/go.mod diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/schema.graphql b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/schema.graphql new file mode 100644 index 0000000000..325e224971 --- /dev/null +++ b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/schema.graphql @@ -0,0 +1,5 @@ +type Module { + method( + arg: String! + ): String! +} diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/build.sh b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/build.sh new file mode 100755 index 0000000000..c75f4d5791 --- /dev/null +++ b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/build.sh @@ -0,0 +1,3 @@ +cd module +tinygo build -o wrap.wasm -target ../wasm-memory.json ./main/main.go +wasm-snip -o ./wrap_snip.wasm wrap.wasm -p syscall runtime.ticks fd_write diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/go.mod b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/go.mod new file mode 100644 index 0000000000..06586f28bb --- /dev/null +++ b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/go.mod @@ -0,0 +1,7 @@ +module example.com/go-wrap-test + +go 1.18 + +require github.com/polywrap/go-wrap v0.0.0-20230706013513-29691688fe81 + +require github.com/valyala/fastjson v1.6.3 // indirect diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/go.sum b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/go.sum new file mode 100644 index 0000000000..4c9c458017 --- /dev/null +++ b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/go.sum @@ -0,0 +1,4 @@ +github.com/polywrap/go-wrap v0.0.0-20230706013513-29691688fe81 h1:6aeLyP7nvw2xD7rteUCFE+iB/3kvtRoqUuVcLaMLaW0= +github.com/polywrap/go-wrap v0.0.0-20230706013513-29691688fe81/go.mod h1:rxqhIFKUzn/M46+zjnA1RHlCzLGQn2BiLWalezhLj/k= +github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= +github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/main/main.go b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/main/main.go new file mode 100644 index 0000000000..dd51c895e5 --- /dev/null +++ b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/main/main.go @@ -0,0 +1,21 @@ +package main + +import ( + moduleWrapped "example.com/go-wrap-test/main/module_wrapped" + "github.com/polywrap/go-wrap/polywrap" +) + +//export _wrap_invoke +func _wrap_invoke(methodSize, argsSize, envSize uint32) bool { + args := polywrap.WrapInvokeArgs(methodSize, argsSize) + switch args.Method { + case "method": + return polywrap.WrapInvoke(args, envSize, moduleWrapped.MethodWrapped) + default: + return polywrap.WrapInvoke(args, envSize, nil) + } +} + +func main() { + +} diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/main/module_wrapped/module_serialization.go b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/main/module_wrapped/module_serialization.go new file mode 100644 index 0000000000..0a1e13d3db --- /dev/null +++ b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/main/module_wrapped/module_serialization.go @@ -0,0 +1,53 @@ +package module_wrapped + +import ( + . "example.com/go-wrap-test/main/types" + "github.com/polywrap/go-wrap/polywrap/msgpack" +) + +func DeserializeMethodArgs(argsBuf []byte) *MethodArgsMethod { + ctx := msgpack.NewContext("Deserializing module-type: Method") + reader := msgpack.NewReadDecoder(ctx, argsBuf) + + var ( + _arg string + _argSet bool + ) + + for i := int32(reader.ReadMapLength()); i > 0; i-- { + field := reader.ReadString() + reader.Context().Push(field, "unknown", "searching for property type") + switch field { + case "arg": + reader.Context().Push(field, "string", "type found, reading property") + _arg = reader.ReadString() + _argSet = true + reader.Context().Pop() + } + reader.Context().Pop() + } + + if !_argSet { + panic(reader.Context().PrintWithContext("Missing required property: 'arg: String'")) + } + + return &MethodArgsMethod{ + Arg: _arg, + } +} + +func SerializeMethodResult(value string) []byte { + ctx := msgpack.NewContext("Serializing module-type: Method") + encoder := msgpack.NewWriteEncoder(ctx) + WriteMethodResult(encoder, value); + return encoder.Buffer() +} + +func WriteMethodResult(writer msgpack.Write, value string) { + writer.Context().Push("method", "string", "writing property") + { + v := value + writer.WriteString(v) + } + writer.Context().Pop() +} diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/main/module_wrapped/module_wrapped.go b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/main/module_wrapped/module_wrapped.go new file mode 100644 index 0000000000..a5efc02dda --- /dev/null +++ b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/main/module_wrapped/module_wrapped.go @@ -0,0 +1,13 @@ +package module_wrapped + +import ( + methods "example.com/go-wrap-test" +) + +func MethodWrapped(argsBuf []byte, envSize uint32) []byte { + + args := DeserializeMethodArgs(argsBuf) + + result := methods.Method(args) + return SerializeMethodResult(result) +} diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/main/types/module_args.go b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/main/types/module_args.go new file mode 100644 index 0000000000..b69e2ed8fa --- /dev/null +++ b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/main/types/module_args.go @@ -0,0 +1,5 @@ +package types + +type MethodArgsMethod struct { + Arg string +} diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/mod.go b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/mod.go new file mode 100644 index 0000000000..53d394725c --- /dev/null +++ b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/mod.go @@ -0,0 +1,7 @@ +package module + +import "example.com/go-wrap-test/main/types" + +func Method(args *types.MethodArgsMethod) string { + return args.Arg +} diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/polywrap-build.sh b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/polywrap-build.sh new file mode 100755 index 0000000000..74782a6e6e --- /dev/null +++ b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/polywrap-build.sh @@ -0,0 +1,9 @@ +set -e + +tinygo build -o main.wasm -target wasm-memory src/wrap/main.go + +# Make the build directory +rm -rf ./build +mkdir ./build + +wasm-snip -o ./build/wrap.wasm main.wasm -p syscall runtime.ticks fd_write diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/polywrap.yaml b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/polywrap.yaml new file mode 100644 index 0000000000..a287b38b27 --- /dev/null +++ b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/polywrap.yaml @@ -0,0 +1,7 @@ +format: 0.4.0 +project: + name: ObjectTypes + type: wasm/golang +source: + schema: ./schema.graphql + module: ./module/go.mod diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/wasm-memory.json b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/wasm-memory.json new file mode 100644 index 0000000000..e714908734 --- /dev/null +++ b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/wasm-memory.json @@ -0,0 +1,25 @@ +{ + "llvm-target": "wasm32-unknown-wasi", + "cpu": "generic", + "features": "+bulk-memory,+nontrapping-fptoint,+sign-ext", + "build-tags": ["tinygo.wasm"], + "goos": "js", + "goarch": "wasm", + "linker": "wasm-ld", + "libc": "wasi-libc", + "scheduler": "asyncify", + "default-stack-size": 16384, + "cflags": [ + "-mbulk-memory", + "-mnontrapping-fptoint", + "-msign-ext" + ], + "ldflags": [ + "--allow-undefined", + "--stack-first", + "--no-demangle", + "--import-memory" + ], + "emulator": "node {root}/targets/wasm_exec.js {}", + "wasm-abi": "js" +} \ No newline at end of file From 483fb8acafb48a89234bada309116846675afee2 Mon Sep 17 00:00:00 2001 From: Niraj Kamdar Date: Thu, 6 Jul 2023 22:56:34 +0800 Subject: [PATCH 38/65] wip: checkpoint --- .../strategies/DockerVMStrategy.ts | 2 +- .../wasm/golang/local/local.sh | 11 ++++ .../wasm/golang/local}/wasm-memory.json | 0 .../wasm/golang/vm/Dockerfile | 10 +++- .../wasm/golang/vm/wasm-memory.json | 26 +++++++++ .../project/manifests/polywrap/languages.ts | 2 + .../wasm/go/001-sanity/module/go.mod | 8 +-- .../wasm/go/001-sanity/module/go.sum | 4 ++ .../wasm/go/001-sanity/module/main/main.go | 21 +++++++ .../module_wrapped/module_serialization.go | 53 ++++++++++++++++++ .../main/module_wrapped/module_wrapped.go | 13 +++++ .../module/main/types/module_args.go | 5 ++ .../wasm/go/001-sanity/module/mod.go | 4 +- .../wasm/go/001-sanity/module/wrap.wasm | Bin 0 -> 481987 bytes .../wasm/go/001-sanity/module/wrap_snip.wasm | Bin 0 -> 198443 bytes .../001-sanity/this-builds/module/wrap.wasm | Bin 0 -> 482011 bytes .../this-builds/module/wrap_snip.wasm | Bin 0 -> 198443 bytes 17 files changed, 151 insertions(+), 8 deletions(-) create mode 100644 packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/local.sh rename packages/{test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds => cli/src/lib/defaults/build-strategies/wasm/golang/local}/wasm-memory.json (100%) create mode 100644 packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/wasm-memory.json create mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/go.sum create mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/main.go create mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/module_wrapped/module_serialization.go create mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/module_wrapped/module_wrapped.go create mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/types/module_args.go create mode 100755 packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/wrap.wasm create mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/wrap_snip.wasm create mode 100755 packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/wrap.wasm create mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/wrap_snip.wasm diff --git a/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts b/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts index 5ac3ab5285..47dfac8cdc 100644 --- a/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts +++ b/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts @@ -45,7 +45,7 @@ const CONFIGS: Record = { }, "wasm/golang": { defaultIncludes: ["go.mod", "go.sum"], - baseImage: "consideritdone/polywrap-base-go", + baseImage: "polywrap/vm-base-go", version: "0.1.0", }, }; diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/local.sh b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/local.sh new file mode 100644 index 0000000000..0d936dfb13 --- /dev/null +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/local.sh @@ -0,0 +1,11 @@ +rm -Rf build/ +mkdir build/ + +cd module + +tinygo build -o ../build/wrap.wasm -target ../.polywrap/wasm/build/strategy-used/wasm-memory.json ./main/main.go +wasm-snip -o ../build/wrap_snip.wasm ../build/wrap.wasm -p syscall runtime.ticks fd_write + +cd ../build +rm wrap.wasm +mv wrap_snip.wasm wrap.wasm diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/wasm-memory.json b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/wasm-memory.json similarity index 100% rename from packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/wasm-memory.json rename to packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/wasm-memory.json diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile index b4182dac01..5eb21a821a 100644 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile @@ -1,2 +1,10 @@ -FROM consideritdone/polywrap-base-go:0.1.0 +FROM --platform=arm64 rust:1.60.0 as rust + +RUN cargo install -f wasm-snip + +FROM --platform=arm64 tinygo/tinygo:0.24.0 + +# Copy wasm-snip +COPY --from=rust /usr/local/cargo/bin/wasm-snip /usr/local/bin/ +COPY wasm-memory.json /usr/local/tinygo/targets/ WORKDIR /project diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/wasm-memory.json b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/wasm-memory.json new file mode 100644 index 0000000000..54768a7408 --- /dev/null +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/wasm-memory.json @@ -0,0 +1,26 @@ + +{ + "llvm-target": "wasm32-unknown-wasi", + "cpu": "generic", + "features": "+bulk-memory,+nontrapping-fptoint,+sign-ext", + "build-tags": ["tinygo.wasm"], + "goos": "js", + "goarch": "wasm", + "linker": "wasm-ld", + "libc": "wasi-libc", + "scheduler": "asyncify", + "default-stack-size": 16384, + "cflags": [ + "-mbulk-memory", + "-mnontrapping-fptoint", + "-msign-ext" + ], + "ldflags": [ + "--allow-undefined", + "--stack-first", + "--no-demangle", + "--import-memory" + ], + "emulator": "node {root}/targets/wasm_exec.js {}", + "wasm-abi": "js" +} \ No newline at end of file diff --git a/packages/cli/src/lib/project/manifests/polywrap/languages.ts b/packages/cli/src/lib/project/manifests/polywrap/languages.ts index 9fcf065408..5a3e8897fe 100644 --- a/packages/cli/src/lib/project/manifests/polywrap/languages.ts +++ b/packages/cli/src/lib/project/manifests/polywrap/languages.ts @@ -51,6 +51,8 @@ export function polywrapManifestOverrideCodegenDir( // the codegen directory to be `./src/wrap` case "wasm/rust": return "./src/wrap"; + case "wasm/golang": + return "./main"; default: return undefined; } diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/go.mod b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/go.mod index e6eb3ba066..24d82683b1 100644 --- a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/go.mod +++ b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/go.mod @@ -1,7 +1,7 @@ -module test.com/go-wrap-test +module example.com/go-wrap-test go 1.18 -require ( - github.com/polywrap/go-wrap 29691688fe81720d8fcbe1c19ba6492eed96f9ba -) +require github.com/polywrap/go-wrap v0.0.0-20230706013513-29691688fe81 + +require github.com/valyala/fastjson v1.6.3 // indirect \ No newline at end of file diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/go.sum b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/go.sum new file mode 100644 index 0000000000..4c9c458017 --- /dev/null +++ b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/go.sum @@ -0,0 +1,4 @@ +github.com/polywrap/go-wrap v0.0.0-20230706013513-29691688fe81 h1:6aeLyP7nvw2xD7rteUCFE+iB/3kvtRoqUuVcLaMLaW0= +github.com/polywrap/go-wrap v0.0.0-20230706013513-29691688fe81/go.mod h1:rxqhIFKUzn/M46+zjnA1RHlCzLGQn2BiLWalezhLj/k= +github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= +github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/main.go b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/main.go new file mode 100644 index 0000000000..dd51c895e5 --- /dev/null +++ b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/main.go @@ -0,0 +1,21 @@ +package main + +import ( + moduleWrapped "example.com/go-wrap-test/main/module_wrapped" + "github.com/polywrap/go-wrap/polywrap" +) + +//export _wrap_invoke +func _wrap_invoke(methodSize, argsSize, envSize uint32) bool { + args := polywrap.WrapInvokeArgs(methodSize, argsSize) + switch args.Method { + case "method": + return polywrap.WrapInvoke(args, envSize, moduleWrapped.MethodWrapped) + default: + return polywrap.WrapInvoke(args, envSize, nil) + } +} + +func main() { + +} diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/module_wrapped/module_serialization.go b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/module_wrapped/module_serialization.go new file mode 100644 index 0000000000..0a1e13d3db --- /dev/null +++ b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/module_wrapped/module_serialization.go @@ -0,0 +1,53 @@ +package module_wrapped + +import ( + . "example.com/go-wrap-test/main/types" + "github.com/polywrap/go-wrap/polywrap/msgpack" +) + +func DeserializeMethodArgs(argsBuf []byte) *MethodArgsMethod { + ctx := msgpack.NewContext("Deserializing module-type: Method") + reader := msgpack.NewReadDecoder(ctx, argsBuf) + + var ( + _arg string + _argSet bool + ) + + for i := int32(reader.ReadMapLength()); i > 0; i-- { + field := reader.ReadString() + reader.Context().Push(field, "unknown", "searching for property type") + switch field { + case "arg": + reader.Context().Push(field, "string", "type found, reading property") + _arg = reader.ReadString() + _argSet = true + reader.Context().Pop() + } + reader.Context().Pop() + } + + if !_argSet { + panic(reader.Context().PrintWithContext("Missing required property: 'arg: String'")) + } + + return &MethodArgsMethod{ + Arg: _arg, + } +} + +func SerializeMethodResult(value string) []byte { + ctx := msgpack.NewContext("Serializing module-type: Method") + encoder := msgpack.NewWriteEncoder(ctx) + WriteMethodResult(encoder, value); + return encoder.Buffer() +} + +func WriteMethodResult(writer msgpack.Write, value string) { + writer.Context().Push("method", "string", "writing property") + { + v := value + writer.WriteString(v) + } + writer.Context().Pop() +} diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/module_wrapped/module_wrapped.go b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/module_wrapped/module_wrapped.go new file mode 100644 index 0000000000..a5efc02dda --- /dev/null +++ b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/module_wrapped/module_wrapped.go @@ -0,0 +1,13 @@ +package module_wrapped + +import ( + methods "example.com/go-wrap-test" +) + +func MethodWrapped(argsBuf []byte, envSize uint32) []byte { + + args := DeserializeMethodArgs(argsBuf) + + result := methods.Method(args) + return SerializeMethodResult(result) +} diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/types/module_args.go b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/types/module_args.go new file mode 100644 index 0000000000..b69e2ed8fa --- /dev/null +++ b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/types/module_args.go @@ -0,0 +1,5 @@ +package types + +type MethodArgsMethod struct { + Arg string +} diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/mod.go b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/mod.go index 6266c33bf5..53d394725c 100644 --- a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/mod.go +++ b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/mod.go @@ -1,7 +1,7 @@ package module -import "github.com/polywrap/cli/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/wrap/types" +import "example.com/go-wrap-test/main/types" -func Method(args *types.ArgsMethod) string { +func Method(args *types.MethodArgsMethod) string { return args.Arg } diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/wrap.wasm b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/wrap.wasm new file mode 100755 index 0000000000000000000000000000000000000000..ee4d20906fd806e77883706b7a34fcab22fc8038 GIT binary patch literal 481987 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

        sHiGt_%Q7UO}=;x`-IULXz!o|E(`BftDxt? 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₊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 SbQ77+<*i-EtH-k&h5jE!*vS(B literal 0 HcmV?d00001 diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/wrap_snip.wasm b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/wrap_snip.wasm new file mode 100644 index 0000000000000000000000000000000000000000..d68c73b42607a54f25b8e538e9f3cea83f4d4704 GIT binary patch literal 198443 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 Date: Thu, 6 Jul 2023 23:41:35 +0800 Subject: [PATCH 39/65] wip: working local build --- packages/cli/src/lib/project/PolywrapProject.ts | 11 +++++++++++ .../src/lib/project/manifests/polywrap/languages.ts | 2 +- .../schema/bind/src/bindings/golang/wasm/index.ts | 4 ++-- .../bindings/golang/wasm/templates/main-go.mustache | 4 ++-- .../%type%Serialization-go.mustache | 4 ++-- .../%type%Wrapped-go.mustache | 4 ++-- .../module-type/types/%type%Args-go.mustache | 2 +- .../wasm/go/001-sanity/module/main/main.go | 1 - .../main/module_wrapped/module_serialization.go | 2 +- .../module/main/module_wrapped/module_wrapped.go | 2 +- .../wasm/{go/001-sanity => }/this-builds/build.sh | 0 .../{go/001-sanity => }/this-builds/module/go.mod | 0 .../{go/001-sanity => }/this-builds/module/go.sum | 0 .../001-sanity => }/this-builds/module/main/main.go | 0 .../main/module_wrapped/module_serialization.go | 0 .../module/main/module_wrapped/module_wrapped.go | 0 .../this-builds/module/main/types/module_args.go | 0 .../{go/001-sanity => }/this-builds/module/mod.go | 0 .../001-sanity => }/this-builds/module/wrap.wasm | Bin .../this-builds/module/wrap_snip.wasm | Bin .../001-sanity => }/this-builds/polywrap-build.sh | 0 .../{go/001-sanity => }/this-builds/polywrap.yaml | 0 22 files changed, 23 insertions(+), 13 deletions(-) rename packages/schema/bind/src/bindings/golang/wasm/templates/module-type/{module => module_wrapped}/%type%Serialization-go.mustache (95%) rename packages/schema/bind/src/bindings/golang/wasm/templates/module-type/{module => module_wrapped}/%type%Wrapped-go.mustache (91%) rename packages/test-cases/cases/cli/build-cmd/wasm/{go/001-sanity => }/this-builds/build.sh (100%) rename packages/test-cases/cases/cli/build-cmd/wasm/{go/001-sanity => }/this-builds/module/go.mod (100%) rename packages/test-cases/cases/cli/build-cmd/wasm/{go/001-sanity => }/this-builds/module/go.sum (100%) rename packages/test-cases/cases/cli/build-cmd/wasm/{go/001-sanity => }/this-builds/module/main/main.go (100%) rename packages/test-cases/cases/cli/build-cmd/wasm/{go/001-sanity => }/this-builds/module/main/module_wrapped/module_serialization.go (100%) rename packages/test-cases/cases/cli/build-cmd/wasm/{go/001-sanity => }/this-builds/module/main/module_wrapped/module_wrapped.go (100%) rename packages/test-cases/cases/cli/build-cmd/wasm/{go/001-sanity => }/this-builds/module/main/types/module_args.go (100%) rename packages/test-cases/cases/cli/build-cmd/wasm/{go/001-sanity => }/this-builds/module/mod.go (100%) rename packages/test-cases/cases/cli/build-cmd/wasm/{go/001-sanity => }/this-builds/module/wrap.wasm (100%) rename packages/test-cases/cases/cli/build-cmd/wasm/{go/001-sanity => }/this-builds/module/wrap_snip.wasm (100%) rename packages/test-cases/cases/cli/build-cmd/wasm/{go/001-sanity => }/this-builds/polywrap-build.sh (100%) rename packages/test-cases/cases/cli/build-cmd/wasm/{go/001-sanity => }/this-builds/polywrap.yaml (100%) diff --git a/packages/cli/src/lib/project/PolywrapProject.ts b/packages/cli/src/lib/project/PolywrapProject.ts index 8aed37043b..39465bf236 100644 --- a/packages/cli/src/lib/project/PolywrapProject.ts +++ b/packages/cli/src/lib/project/PolywrapProject.ts @@ -150,6 +150,7 @@ export class PolywrapProject extends Project { bindConfig?: Record ): Promise { const manifest = await this.getManifest(); + console.log("GENERATION SUB PATH", generationSubPath) const codegenDirectory = await this.getGenerationDirectory( generationSubPath ); @@ -363,6 +364,16 @@ export class PolywrapProject extends Project { // 4. Use the default defaultDir; + console.log("#######################"); + console.log(useDefinedPath); + console.log( + polywrapManifestOverrideCodegenDir( + manifest.project.type as PolywrapManifestLanguage + ) + ); + console.log(genPath); + console.log("##############################"); + if (path.isAbsolute(genPath)) { return genPath; } else { diff --git a/packages/cli/src/lib/project/manifests/polywrap/languages.ts b/packages/cli/src/lib/project/manifests/polywrap/languages.ts index 5a3e8897fe..12fc2d4fb2 100644 --- a/packages/cli/src/lib/project/manifests/polywrap/languages.ts +++ b/packages/cli/src/lib/project/manifests/polywrap/languages.ts @@ -52,7 +52,7 @@ export function polywrapManifestOverrideCodegenDir( case "wasm/rust": return "./src/wrap"; case "wasm/golang": - return "./main"; + return "./module/main"; default: return undefined; } diff --git a/packages/schema/bind/src/bindings/golang/wasm/index.ts b/packages/schema/bind/src/bindings/golang/wasm/index.ts index 72643987a5..5910015b9d 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/index.ts +++ b/packages/schema/bind/src/bindings/golang/wasm/index.ts @@ -178,9 +178,9 @@ export const generateBinding: GenerateBindingFn = ( }); output.entries.push({ type: "Directory", - name: "module", + name: "module_wrapped", data: renderTemplates( - templatePath("module-type/module"), + templatePath("module-type/module_wrapped"), { importedTypes, goImport, ...abi.moduleType }, subTemplates ), diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/main-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/main-go.mustache index 314c61d9ab..9268da2bff 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/main-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/main-go.mustache @@ -1,7 +1,7 @@ package main import ( - "{{goImport}}/src/wrap/module" + moduleWrapped "{{goImport}}/main/module_wrapped" "github.com/polywrap/go-wrap/polywrap" ) @@ -12,7 +12,7 @@ func _wrap_invoke(methodSize, argsSize, envSize uint32) bool { {{#moduleType}} {{#methods}} case "{{name}}": - return polywrap.WrapInvoke(args, envSize, module.{{#toUpper}}{{name}}{{/toUpper}}Wrapped) + return polywrap.WrapInvoke(args, envSize, moduleWrapped.{{#toUpper}}{{name}}{{/toUpper}}Wrapped) {{/methods}} {{/moduleType}} default: diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Serialization-go.mustache similarity index 95% rename from packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Serialization-go.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Serialization-go.mustache index 330361cbf3..9b77f51089 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Serialization-go.mustache @@ -1,9 +1,9 @@ package module {{#makeImports}} github.com/polywrap/go-wrap/polywrap/msgpack, - . {{goImport}}/src/wrap/types, + . {{goImport}}/main/types, {{#importedTypes}} - . {{goImport}}/src/wrap/imported/{{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}}, + . {{goImport}}/main/imported/{{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}}, {{/importedTypes}} {{#methods}} {{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}, diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Wrapped-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Wrapped-go.mustache similarity index 91% rename from packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Wrapped-go.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Wrapped-go.mustache index ca99702f61..847825d77b 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Wrapped-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Wrapped-go.mustache @@ -1,7 +1,7 @@ package module {{#makeImports}} - {{#methods}}{{#env}}github.com/polywrap/go-wrap/polywrap,. {{goImport}}/src/wrap/types,{{/env}}{{/methods}} - {{goImport}}/module as methods, + {{#methods}}{{#env}}github.com/polywrap/go-wrap/polywrap,. {{goImport}}/main/types,{{/env}}{{/methods}} + {{goImport}} as methods, {{/makeImports}} {{#methods}} func {{#toUpper}}{{name}}{{/toUpper}}Wrapped(argsBuf []byte, envSize uint32) []byte { diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache index 424f8ed842..153e903ae0 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache @@ -1,7 +1,7 @@ package types {{#makeImports}} {{#importedTypes}} - . {{goImport}}/src/wrap/imported/{{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}}, + . {{goImport}}/main/imported/{{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}}, {{/importedTypes}} {{#methods}} {{#arguments}} diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/main.go b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/main.go index dd51c895e5..9d976ff215 100644 --- a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/main.go +++ b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/main.go @@ -17,5 +17,4 @@ func _wrap_invoke(methodSize, argsSize, envSize uint32) bool { } func main() { - } diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/module_wrapped/module_serialization.go b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/module_wrapped/module_serialization.go index 0a1e13d3db..5fcee5679a 100644 --- a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/module_wrapped/module_serialization.go +++ b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/module_wrapped/module_serialization.go @@ -1,4 +1,4 @@ -package module_wrapped +package module import ( . "example.com/go-wrap-test/main/types" diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/module_wrapped/module_wrapped.go b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/module_wrapped/module_wrapped.go index a5efc02dda..fa2ae39875 100644 --- a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/module_wrapped/module_wrapped.go +++ b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/module_wrapped/module_wrapped.go @@ -1,4 +1,4 @@ -package module_wrapped +package module import ( methods "example.com/go-wrap-test" diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/build.sh b/packages/test-cases/cases/cli/build-cmd/wasm/this-builds/build.sh similarity index 100% rename from packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/build.sh rename to packages/test-cases/cases/cli/build-cmd/wasm/this-builds/build.sh diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/go.mod b/packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/go.mod similarity index 100% rename from packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/go.mod rename to packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/go.mod diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/go.sum b/packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/go.sum similarity index 100% rename from packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/go.sum rename to packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/go.sum diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/main/main.go b/packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/main/main.go similarity index 100% rename from packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/main/main.go rename to packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/main/main.go diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/main/module_wrapped/module_serialization.go b/packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/main/module_wrapped/module_serialization.go similarity index 100% rename from packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/main/module_wrapped/module_serialization.go rename to packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/main/module_wrapped/module_serialization.go diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/main/module_wrapped/module_wrapped.go b/packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/main/module_wrapped/module_wrapped.go similarity index 100% rename from packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/main/module_wrapped/module_wrapped.go rename to packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/main/module_wrapped/module_wrapped.go diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/main/types/module_args.go b/packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/main/types/module_args.go similarity index 100% rename from packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/main/types/module_args.go rename to packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/main/types/module_args.go diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/mod.go b/packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/mod.go similarity index 100% rename from packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/mod.go rename to packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/mod.go diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/wrap.wasm b/packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/wrap.wasm similarity index 100% rename from packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/wrap.wasm rename to packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/wrap.wasm diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/wrap_snip.wasm b/packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/wrap_snip.wasm similarity index 100% rename from packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/wrap_snip.wasm rename to packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/wrap_snip.wasm diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/polywrap-build.sh b/packages/test-cases/cases/cli/build-cmd/wasm/this-builds/polywrap-build.sh similarity index 100% rename from packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/polywrap-build.sh rename to packages/test-cases/cases/cli/build-cmd/wasm/this-builds/polywrap-build.sh diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/polywrap.yaml b/packages/test-cases/cases/cli/build-cmd/wasm/this-builds/polywrap.yaml similarity index 100% rename from packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/polywrap.yaml rename to packages/test-cases/cases/cli/build-cmd/wasm/this-builds/polywrap.yaml From 255dc1ace4ae4e3cfa8a5fcb1092226f6478bd4b Mon Sep 17 00:00:00 2001 From: Niraj Kamdar Date: Fri, 7 Jul 2023 00:10:35 +0800 Subject: [PATCH 40/65] wip: local strategy fully working --- packages/cli/src/commands/build.ts | 7 ++- .../wasm/golang/local/local.sh | 3 - .../wasm/golang/vm/Dockerfile | 4 +- .../wasm/go/001-sanity/module/wrap.wasm | Bin 481987 -> 0 bytes .../wasm/go/001-sanity/module/wrap_snip.wasm | Bin 198443 -> 0 bytes .../cli/build-cmd/wasm/this-builds/build.sh | 3 - .../build-cmd/wasm/this-builds/module/go.mod | 7 --- .../build-cmd/wasm/this-builds/module/go.sum | 4 -- .../wasm/this-builds/module/main/main.go | 21 ------- .../module_wrapped/module_serialization.go | 53 ------------------ .../main/module_wrapped/module_wrapped.go | 13 ----- .../module/main/types/module_args.go | 5 -- .../build-cmd/wasm/this-builds/module/mod.go | 7 --- .../wasm/this-builds/module/wrap.wasm | Bin 482011 -> 0 bytes .../wasm/this-builds/module/wrap_snip.wasm | Bin 198443 -> 0 bytes .../wasm/this-builds/polywrap-build.sh | 9 --- .../build-cmd/wasm/this-builds/polywrap.yaml | 7 --- 17 files changed, 6 insertions(+), 137 deletions(-) delete mode 100755 packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/wrap.wasm delete mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/wrap_snip.wasm delete mode 100755 packages/test-cases/cases/cli/build-cmd/wasm/this-builds/build.sh delete mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/go.mod delete mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/go.sum delete mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/main/main.go delete mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/main/module_wrapped/module_serialization.go delete mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/main/module_wrapped/module_wrapped.go delete mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/main/types/module_args.go delete mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/mod.go delete mode 100755 packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/wrap.wasm delete mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/wrap_snip.wasm delete mode 100755 packages/test-cases/cases/cli/build-cmd/wasm/this-builds/polywrap-build.sh delete mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/this-builds/polywrap.yaml diff --git a/packages/cli/src/commands/build.ts b/packages/cli/src/commands/build.ts index 4fd735e068..695e132aee 100644 --- a/packages/cli/src/commands/build.ts +++ b/packages/cli/src/commands/build.ts @@ -15,6 +15,7 @@ import { polywrapManifestLanguages, pluginManifestLanguages, parseWrapperEnvsOption, + parseDirOptionNoDefault, } from "../lib"; import { CodeGenerator } from "../lib/codegen"; import { @@ -48,7 +49,7 @@ export interface BuildCommandOptions extends BaseCommandOptions { clientConfig: string | false; wrapperEnvs: string | false; noCodegen: boolean; - codegenDir: string; + codegenDir: string | false; watch: boolean; strategy: `${SupportedStrategies}`; } @@ -112,7 +113,7 @@ export const build: Command = { wrapperEnvs: options.wrapperEnvs || false, outputDir: parseDirOption(options.outputDir, defaultOutputDir), noCodegen: !options.codegen || false, - codegenDir: parseDirOption(options.codegenDir, DEFAULT_CODEGEN_DIR), + codegenDir: parseDirOptionNoDefault(options.codegenDir), strategy: options.strategy || defaultStrategy, watch: options.watch || false, verbose: options.verbose || false, @@ -241,7 +242,7 @@ async function run(options: Required) { const codeGenerator = new CodeGenerator({ project, schemaComposer, - codegenDirAbs: codegenDir, + codegenDirAbs: codegenDir || undefined, }); const codegenSuccess = await codeGenerator.generate(); diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/local.sh b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/local.sh index 0d936dfb13..c02517347f 100644 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/local.sh +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/local.sh @@ -1,6 +1,3 @@ -rm -Rf build/ -mkdir build/ - cd module tinygo build -o ../build/wrap.wasm -target ../.polywrap/wasm/build/strategy-used/wasm-memory.json ./main/main.go diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile index 5eb21a821a..015f6ff9ce 100644 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile @@ -1,8 +1,8 @@ -FROM --platform=arm64 rust:1.60.0 as rust +FROM rust:1.60.0 as rust RUN cargo install -f wasm-snip -FROM --platform=arm64 tinygo/tinygo:0.24.0 +FROM tinygo/tinygo:0.24.0 # Copy wasm-snip COPY --from=rust /usr/local/cargo/bin/wasm-snip /usr/local/bin/ diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/wrap.wasm b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/wrap.wasm deleted file mode 100755 index ee4d20906fd806e77883706b7a34fcab22fc8038..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 481987 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 0; i-- { - field := reader.ReadString() - reader.Context().Push(field, "unknown", "searching for property type") - switch field { - case "arg": - reader.Context().Push(field, "string", "type found, reading property") - _arg = reader.ReadString() - _argSet = true - reader.Context().Pop() - } - reader.Context().Pop() - } - - if !_argSet { - panic(reader.Context().PrintWithContext("Missing required property: 'arg: String'")) - } - - return &MethodArgsMethod{ - Arg: _arg, - } -} - -func SerializeMethodResult(value string) []byte { - ctx := msgpack.NewContext("Serializing module-type: Method") - encoder := msgpack.NewWriteEncoder(ctx) - WriteMethodResult(encoder, value); - return encoder.Buffer() -} - -func WriteMethodResult(writer msgpack.Write, value string) { - writer.Context().Push("method", "string", "writing property") - { - v := value - writer.WriteString(v) - } - writer.Context().Pop() -} diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/main/module_wrapped/module_wrapped.go b/packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/main/module_wrapped/module_wrapped.go deleted file mode 100644 index a5efc02dda..0000000000 --- a/packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/main/module_wrapped/module_wrapped.go +++ /dev/null @@ -1,13 +0,0 @@ -package module_wrapped - -import ( - methods "example.com/go-wrap-test" -) - -func MethodWrapped(argsBuf []byte, envSize uint32) []byte { - - args := DeserializeMethodArgs(argsBuf) - - result := methods.Method(args) - return SerializeMethodResult(result) -} diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/main/types/module_args.go b/packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/main/types/module_args.go deleted file mode 100644 index b69e2ed8fa..0000000000 --- a/packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/main/types/module_args.go +++ /dev/null @@ -1,5 +0,0 @@ -package types - -type MethodArgsMethod struct { - Arg string -} diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/mod.go b/packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/mod.go deleted file mode 100644 index 53d394725c..0000000000 --- a/packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/mod.go +++ /dev/null @@ -1,7 +0,0 @@ -package module - -import "example.com/go-wrap-test/main/types" - -func Method(args *types.MethodArgsMethod) string { - return args.Arg -} diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/wrap.wasm b/packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/wrap.wasm deleted file mode 100755 index 9be041ebb3efe0e073057bc75e5b6809dcef7276..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 482011 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

              sHiGt_%Q7UO}=;x`-IULXz!o|E(`BftDxt? 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₊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 SbQ77+<*i-EtH-k&h5jE!*vS(B diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/wrap_snip.wasm b/packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/wrap_snip.wasm deleted file mode 100644 index d68c73b42607a54f25b8e538e9f3cea83f4d4704..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 198443 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 Date: Fri, 7 Jul 2023 00:13:25 +0800 Subject: [PATCH 41/65] refactor: remove debug leftover --- .../defaults/language-overrides/wasm/golang/index.ts | 12 +++++------- packages/cli/src/lib/project/PolywrapProject.ts | 11 ----------- 2 files changed, 5 insertions(+), 18 deletions(-) diff --git a/packages/cli/src/lib/defaults/language-overrides/wasm/golang/index.ts b/packages/cli/src/lib/defaults/language-overrides/wasm/golang/index.ts index 8d383921ee..248f9191f5 100644 --- a/packages/cli/src/lib/defaults/language-overrides/wasm/golang/index.ts +++ b/packages/cli/src/lib/defaults/language-overrides/wasm/golang/index.ts @@ -12,8 +12,8 @@ export function getBuildOverrides(): BuildOverrides { validateManifest: (manifest: PolywrapManifest) => { getGoModulePath(manifest); return Promise.resolve(); - } - } + }, + }; } export function getCodegenOverrides(): CodegenOverrides { @@ -21,14 +21,12 @@ export function getCodegenOverrides(): CodegenOverrides { getSchemaBindConfig: async (project: PolywrapProject) => { const manifest = await project.getManifest(); const goModpath = getGoModulePath(manifest); - console.log(goModpath); const goModuleName = readGoModuleName(goModpath); - console.log(goModuleName); return { - goModuleName + goModuleName, }; - } - } + }, + }; } function getGoModulePath(manifest: PolywrapManifest): string { diff --git a/packages/cli/src/lib/project/PolywrapProject.ts b/packages/cli/src/lib/project/PolywrapProject.ts index 39465bf236..8aed37043b 100644 --- a/packages/cli/src/lib/project/PolywrapProject.ts +++ b/packages/cli/src/lib/project/PolywrapProject.ts @@ -150,7 +150,6 @@ export class PolywrapProject extends Project { bindConfig?: Record ): Promise { const manifest = await this.getManifest(); - console.log("GENERATION SUB PATH", generationSubPath) const codegenDirectory = await this.getGenerationDirectory( generationSubPath ); @@ -364,16 +363,6 @@ export class PolywrapProject extends Project { // 4. Use the default defaultDir; - console.log("#######################"); - console.log(useDefinedPath); - console.log( - polywrapManifestOverrideCodegenDir( - manifest.project.type as PolywrapManifestLanguage - ) - ); - console.log(genPath); - console.log("##############################"); - if (path.isAbsolute(genPath)) { return genPath; } else { From 2497dc2e6a4f0fdc6eb264bb23b7fe292fdf5c67 Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Thu, 6 Jul 2023 23:12:37 +0200 Subject: [PATCH 42/65] chore: update bindings --- .../schema/bind/src/bindings/golang/wasm/index.ts | 13 ++++++++++--- .../wasm/templates/{ => main}/main-go.mustache | 4 ++-- .../module_wrapped/%type%Serialization-go.mustache | 6 +++--- .../module_wrapped/%type%Wrapped-go.mustache | 6 +++--- .../module-type/types/%type%Args-go.mustache | 2 +- 5 files changed, 19 insertions(+), 12 deletions(-) rename packages/schema/bind/src/bindings/golang/wasm/templates/{ => main}/main-go.mustache (72%) diff --git a/packages/schema/bind/src/bindings/golang/wasm/index.ts b/packages/schema/bind/src/bindings/golang/wasm/index.ts index 5910015b9d..d9c97a1b3f 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/index.ts +++ b/packages/schema/bind/src/bindings/golang/wasm/index.ts @@ -216,9 +216,16 @@ export const generateBinding: GenerateBindingFn = ( } // Generate root entry file - output.entries.push( - ...renderTemplates(templatePath(""), { goImport, ...abi }, subTemplates) - ); + output.entries.push({ + type: "Directory", + name: "main", + data: renderTemplates( + templatePath("main"), + { goImport, ...abi }, + subTemplates + ), + }); + output.entries = mergePaths(output.entries); return result; diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/main-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/main/main-go.mustache similarity index 72% rename from packages/schema/bind/src/bindings/golang/wasm/templates/main-go.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/main/main-go.mustache index 9268da2bff..dfd495835a 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/main-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/main/main-go.mustache @@ -1,7 +1,7 @@ package main import ( - moduleWrapped "{{goImport}}/main/module_wrapped" + "{{goImport}}/module/wrap/module_wrapped" "github.com/polywrap/go-wrap/polywrap" ) @@ -12,7 +12,7 @@ func _wrap_invoke(methodSize, argsSize, envSize uint32) bool { {{#moduleType}} {{#methods}} case "{{name}}": - return polywrap.WrapInvoke(args, envSize, moduleWrapped.{{#toUpper}}{{name}}{{/toUpper}}Wrapped) + return polywrap.WrapInvoke(args, envSize, module_wrapped.{{#toUpper}}{{name}}{{/toUpper}}Wrapped) {{/methods}} {{/moduleType}} default: diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Serialization-go.mustache index 9b77f51089..d77db20f3f 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Serialization-go.mustache @@ -1,9 +1,9 @@ -package module +package module_wrapped {{#makeImports}} github.com/polywrap/go-wrap/polywrap/msgpack, - . {{goImport}}/main/types, + . {{goImport}}/module/wrap/types, {{#importedTypes}} - . {{goImport}}/main/imported/{{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}}, + . {{goImport}}/module/wrap/imported/{{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}}, {{/importedTypes}} {{#methods}} {{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}, diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Wrapped-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Wrapped-go.mustache index 847825d77b..24ac51d231 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Wrapped-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Wrapped-go.mustache @@ -1,7 +1,7 @@ -package module +package module_wrapped {{#makeImports}} - {{#methods}}{{#env}}github.com/polywrap/go-wrap/polywrap,. {{goImport}}/main/types,{{/env}}{{/methods}} - {{goImport}} as methods, + {{#methods}}{{#env}}github.com/polywrap/go-wrap/polywrap,. {{goImport}}/module/wrap/types,{{/env}}{{/methods}} + {{goImport}}/module as methods, {{/makeImports}} {{#methods}} func {{#toUpper}}{{name}}{{/toUpper}}Wrapped(argsBuf []byte, envSize uint32) []byte { diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache index 153e903ae0..d20db1c755 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache @@ -1,7 +1,7 @@ package types {{#makeImports}} {{#importedTypes}} - . {{goImport}}/main/imported/{{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}}, + . {{goImport}}/module/wrap/imported/{{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}}, {{/importedTypes}} {{#methods}} {{#arguments}} From 8259f248fdc2cd020252334e698c0ca0a8e712ff Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Thu, 6 Jul 2023 23:13:18 +0200 Subject: [PATCH 43/65] chore: update bind test-case --- .../bind/sanity/output/wasm-go/{ => main}/main.go | 10 +++++----- .../{module => module_wrapped}/module_serialization.go | 4 ++-- .../{module => module_wrapped}/module_wrapped.go | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) rename packages/test-cases/cases/bind/sanity/output/wasm-go/{ => main}/main.go (51%) rename packages/test-cases/cases/bind/sanity/output/wasm-go/{module => module_wrapped}/module_serialization.go (99%) rename packages/test-cases/cases/bind/sanity/output/wasm-go/{module => module_wrapped}/module_wrapped.go (94%) diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/main/main.go similarity index 51% rename from packages/test-cases/cases/bind/sanity/output/wasm-go/main.go rename to packages/test-cases/cases/bind/sanity/output/wasm-go/main/main.go index 5a4fb1b074..4c9f9939cf 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/main/main.go @@ -1,7 +1,7 @@ package main import ( - "github.com/testorg/testrepo/src/wrap/module" + "github.com/testorg/testrepo/module/wrap/module_wrapped" "github.com/polywrap/go-wrap/polywrap" ) @@ -10,13 +10,13 @@ func _wrap_invoke(methodSize, argsSize, envSize uint32) bool { args := polywrap.WrapInvokeArgs(methodSize, argsSize) switch args.Method { case "moduleMethod": - return polywrap.WrapInvoke(args, envSize, module.ModuleMethodWrapped) + return polywrap.WrapInvoke(args, envSize, module_wrapped.ModuleMethodWrapped) case "objectMethod": - return polywrap.WrapInvoke(args, envSize, module.ObjectMethodWrapped) + return polywrap.WrapInvoke(args, envSize, module_wrapped.ObjectMethodWrapped) case "optionalEnvMethod": - return polywrap.WrapInvoke(args, envSize, module.OptionalEnvMethodWrapped) + return polywrap.WrapInvoke(args, envSize, module_wrapped.OptionalEnvMethodWrapped) case "if": - return polywrap.WrapInvoke(args, envSize, module.IfWrapped) + return polywrap.WrapInvoke(args, envSize, module_wrapped.IfWrapped) default: return polywrap.WrapInvoke(args, envSize, nil) } diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/module_wrapped/module_serialization.go similarity index 99% rename from packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_serialization.go rename to packages/test-cases/cases/bind/sanity/output/wasm-go/module_wrapped/module_serialization.go index 980351923c..e3e502b889 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/module_wrapped/module_serialization.go @@ -1,7 +1,7 @@ -package module +package module_wrapped import ( - . "github.com/testorg/testrepo/src/wrap/types" + . "github.com/testorg/testrepo/module/wrap/types" "github.com/polywrap/go-wrap/polywrap/msgpack" ) diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_wrapped.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/module_wrapped/module_wrapped.go similarity index 94% rename from packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_wrapped.go rename to packages/test-cases/cases/bind/sanity/output/wasm-go/module_wrapped/module_wrapped.go index e9ff1de025..69e5da455d 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_wrapped.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/module_wrapped/module_wrapped.go @@ -1,7 +1,7 @@ -package module +package module_wrapped import ( - . "github.com/testorg/testrepo/src/wrap/types" + . "github.com/testorg/testrepo/module/wrap/types" "github.com/polywrap/go-wrap/polywrap" methods "github.com/testorg/testrepo/module" ) From 8c8efcdc3c5c75d635e9800f5bc0a4f504445e3e Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Thu, 6 Jul 2023 23:45:39 +0200 Subject: [PATCH 44/65] chore: local build working for test project --- .../lib/build-strategies/BuildOverrides.ts | 4 +- .../src/lib/build-strategies/BuildStrategy.ts | 9 ++-- .../strategies/DockerVMStrategy.ts | 26 ++++----- .../wasm/golang/image/Dockerfile.mustache | 8 +-- .../wasm/golang/local/local.sh | 11 ++-- .../wasm/golang/local/wasm-memory.json | 48 ++++++++--------- .../wasm/golang/vm/vm-script.mustache | 6 ++- .../wasm/golang/vm/wasm-memory.json | 49 +++++++++-------- .../language-overrides/wasm/golang/index.ts | 1 + .../language-overrides/wasm/rust/index.ts | 3 +- .../project/manifests/polywrap/languages.ts | 2 +- .../bind/src/bindings/golang/wasm/index.ts | 5 ++ .../golang/wasm/templates/wrap-go.mustache | 1 + .../cases/bind/sanity/output/wasm-go/wrap.go | 1 + .../wasm/go/001-sanity/{module => }/go.mod | 2 +- .../wasm/go/001-sanity/{module => }/go.sum | 0 .../wasm/go/001-sanity/module/main/main.go | 20 ------- .../module_wrapped/module_serialization.go | 53 ------------------- .../main/module_wrapped/module_wrapped.go | 13 ----- .../module/main/types/module_args.go | 5 -- .../001-sanity/module/{mod.go => module.go} | 2 +- .../wasm/go/001-sanity/polywrap.yaml | 2 +- 22 files changed, 95 insertions(+), 176 deletions(-) create mode 100644 packages/schema/bind/src/bindings/golang/wasm/templates/wrap-go.mustache create mode 100644 packages/test-cases/cases/bind/sanity/output/wasm-go/wrap.go rename packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/{module => }/go.mod (67%) rename packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/{module => }/go.sum (100%) delete mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/main.go delete mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/module_wrapped/module_serialization.go delete mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/module_wrapped/module_wrapped.go delete mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/types/module_args.go rename packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/{mod.go => module.go} (62%) diff --git a/packages/cli/src/lib/build-strategies/BuildOverrides.ts b/packages/cli/src/lib/build-strategies/BuildOverrides.ts index cd1836af2b..38f0609917 100644 --- a/packages/cli/src/lib/build-strategies/BuildOverrides.ts +++ b/packages/cli/src/lib/build-strategies/BuildOverrides.ts @@ -5,9 +5,11 @@ import path from "path"; import fs from "fs"; export interface BuildOverrides { - validateManifest: ( + validateManifest?: ( manifest: PolywrapManifest ) => Promise; + + sourcesSubDirectory?: string; } export async function tryGetBuildOverrides( diff --git a/packages/cli/src/lib/build-strategies/BuildStrategy.ts b/packages/cli/src/lib/build-strategies/BuildStrategy.ts index 0e5054c0a0..8d521238ab 100644 --- a/packages/cli/src/lib/build-strategies/BuildStrategy.ts +++ b/packages/cli/src/lib/build-strategies/BuildStrategy.ts @@ -1,4 +1,4 @@ -import { tryGetBuildOverrides } from "./BuildOverrides"; +import { BuildOverrides, tryGetBuildOverrides } from "./BuildOverrides"; import { PolywrapProject } from "../project"; import fse from "fs-extra"; @@ -12,6 +12,7 @@ export interface BuildStrategyConfig { export abstract class BuildStrategy { protected project: PolywrapProject; protected outputDir: string; + protected overrides?: BuildOverrides; constructor({ project, outputDir }: BuildStrategyConfig) { this.project = project; @@ -44,11 +45,11 @@ export abstract class BuildStrategy { fse.copySync(buildStrategyDir, strategyUsedCacheDir); // Check if build overrides exist - const overrides = await tryGetBuildOverrides(language); + this.overrides = await tryGetBuildOverrides(language); // If they do, ensure the manifest if valid before build starts - if (overrides) { - await overrides.validateManifest( + if (this.overrides && this.overrides.validateManifest) { + await this.overrides.validateManifest( await this.project.getManifest() ); } diff --git a/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts b/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts index 47dfac8cdc..8135c31f9b 100644 --- a/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts +++ b/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts @@ -138,21 +138,17 @@ export class DockerVMBuildStrategy extends BuildStrategy { // Copy sources and build if (buildManifestConfig.polywrap_module) { - // HACK: moduleDir is path to Cargo.toml in Rust - if (language === "wasm/rust") { - fse.copySync( - path.join(manifestDir, "src"), - path.join(this._volumePaths.project, "src") - ); - } else { - fse.copySync( - path.join(manifestDir, buildManifestConfig.polywrap_module.dir), - path.join( - this._volumePaths.project, - buildManifestConfig.polywrap_module.dir - ) - ); - } + const sourcesSubDirectory = + this.overrides?.sourcesSubDirectory || + buildManifestConfig.polywrap_module.dir; + + fse.copySync( + path.join(manifestDir, sourcesSubDirectory), + path.join( + this._volumePaths.project, + sourcesSubDirectory + ) + ); const scriptTemplate = fse.readFileSync( path.join( diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/image/Dockerfile.mustache b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/image/Dockerfile.mustache index 9fcdde2e40..84b096a922 100644 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/image/Dockerfile.mustache +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/image/Dockerfile.mustache @@ -1,13 +1,15 @@ -FROM consideritdone/polywrap-base-go:0.1.0 +FROM polywrap/vm-base-go:0.1.0 WORKDIR /project COPY . . -RUN tinygo build -o main.wasm -target wasm-memory src/wrap/main.go +RUN go mod tidy + +RUN tinygo build -o main.wasm -target wasm-memory ./module/wrap/main/main.go # Make the build directory RUN rm -rf ./build RUN mkdir ./build -RUN wasm-snip -o ./build/wrap.wasm main.wasm -p syscall runtime.ticks fd_write +RUN wasm-snip -o ./build/wrap.wasm main.wasm -p syscall runtime.ticks fd_write tinygo diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/local.sh b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/local.sh index c02517347f..9d6cf95724 100644 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/local.sh +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/local.sh @@ -1,8 +1,7 @@ -cd module +go mod tidy -tinygo build -o ../build/wrap.wasm -target ../.polywrap/wasm/build/strategy-used/wasm-memory.json ./main/main.go -wasm-snip -o ../build/wrap_snip.wasm ../build/wrap.wasm -p syscall runtime.ticks fd_write +tinygo build -o ./build/main.wasm -target ./.polywrap/wasm/build/strategy-used/wasm-memory.json ./module/wrap/main/main.go -cd ../build -rm wrap.wasm -mv wrap_snip.wasm wrap.wasm +wasm-snip -o ./build/wrap.wasm ./build/main.wasm -p syscall runtime.ticks fd_write tinygo + +rm ./build/main.wasm diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/wasm-memory.json b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/wasm-memory.json index e714908734..3ba36c6805 100644 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/wasm-memory.json +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/wasm-memory.json @@ -1,25 +1,25 @@ { - "llvm-target": "wasm32-unknown-wasi", - "cpu": "generic", - "features": "+bulk-memory,+nontrapping-fptoint,+sign-ext", - "build-tags": ["tinygo.wasm"], - "goos": "js", - "goarch": "wasm", - "linker": "wasm-ld", - "libc": "wasi-libc", - "scheduler": "asyncify", - "default-stack-size": 16384, - "cflags": [ - "-mbulk-memory", - "-mnontrapping-fptoint", - "-msign-ext" - ], - "ldflags": [ - "--allow-undefined", - "--stack-first", - "--no-demangle", - "--import-memory" - ], - "emulator": "node {root}/targets/wasm_exec.js {}", - "wasm-abi": "js" -} \ No newline at end of file + "llvm-target": "wasm32-unknown-wasi", + "cpu": "generic", + "features": "+bulk-memory,+nontrapping-fptoint,+sign-ext", + "build-tags": ["tinygo.wasm"], + "goos": "js", + "goarch": "wasm", + "linker": "wasm-ld", + "libc": "wasi-libc", + "scheduler": "asyncify", + "default-stack-size": 16384, + "cflags": [ + "-mbulk-memory", + "-mnontrapping-fptoint", + "-msign-ext" + ], + "ldflags": [ + "--allow-undefined", + "--stack-first", + "--no-demangle", + "--import-memory" + ], + "emulator": "node {root}/targets/wasm_exec.js {}", + "wasm-abi": "js" +} diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/vm-script.mustache b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/vm-script.mustache index 74782a6e6e..cbda5ef9eb 100644 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/vm-script.mustache +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/vm-script.mustache @@ -1,9 +1,11 @@ set -e -tinygo build -o main.wasm -target wasm-memory src/wrap/main.go +go mod tidy + +tinygo build -o main.wasm -target wasm-memory ./module/wrap/main/main.go # Make the build directory rm -rf ./build mkdir ./build -wasm-snip -o ./build/wrap.wasm main.wasm -p syscall runtime.ticks fd_write +wasm-snip -o ./build/wrap.wasm main.wasm -p syscall runtime.ticks fd_write tinygo diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/wasm-memory.json b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/wasm-memory.json index 54768a7408..3ba36c6805 100644 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/wasm-memory.json +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/wasm-memory.json @@ -1,26 +1,25 @@ - { - "llvm-target": "wasm32-unknown-wasi", - "cpu": "generic", - "features": "+bulk-memory,+nontrapping-fptoint,+sign-ext", - "build-tags": ["tinygo.wasm"], - "goos": "js", - "goarch": "wasm", - "linker": "wasm-ld", - "libc": "wasi-libc", - "scheduler": "asyncify", - "default-stack-size": 16384, - "cflags": [ - "-mbulk-memory", - "-mnontrapping-fptoint", - "-msign-ext" - ], - "ldflags": [ - "--allow-undefined", - "--stack-first", - "--no-demangle", - "--import-memory" - ], - "emulator": "node {root}/targets/wasm_exec.js {}", - "wasm-abi": "js" -} \ No newline at end of file + "llvm-target": "wasm32-unknown-wasi", + "cpu": "generic", + "features": "+bulk-memory,+nontrapping-fptoint,+sign-ext", + "build-tags": ["tinygo.wasm"], + "goos": "js", + "goarch": "wasm", + "linker": "wasm-ld", + "libc": "wasi-libc", + "scheduler": "asyncify", + "default-stack-size": 16384, + "cflags": [ + "-mbulk-memory", + "-mnontrapping-fptoint", + "-msign-ext" + ], + "ldflags": [ + "--allow-undefined", + "--stack-first", + "--no-demangle", + "--import-memory" + ], + "emulator": "node {root}/targets/wasm_exec.js {}", + "wasm-abi": "js" +} diff --git a/packages/cli/src/lib/defaults/language-overrides/wasm/golang/index.ts b/packages/cli/src/lib/defaults/language-overrides/wasm/golang/index.ts index 248f9191f5..3c745d1f8a 100644 --- a/packages/cli/src/lib/defaults/language-overrides/wasm/golang/index.ts +++ b/packages/cli/src/lib/defaults/language-overrides/wasm/golang/index.ts @@ -13,6 +13,7 @@ export function getBuildOverrides(): BuildOverrides { getGoModulePath(manifest); return Promise.resolve(); }, + sourcesSubDirectory: "module" }; } diff --git a/packages/cli/src/lib/defaults/language-overrides/wasm/rust/index.ts b/packages/cli/src/lib/defaults/language-overrides/wasm/rust/index.ts index 714b6c4736..656c1c0807 100644 --- a/packages/cli/src/lib/defaults/language-overrides/wasm/rust/index.ts +++ b/packages/cli/src/lib/defaults/language-overrides/wasm/rust/index.ts @@ -13,6 +13,7 @@ export function getBuildOverrides(): BuildOverrides { } return Promise.resolve(); - } + }, + sourcesSubDirectory: "src" } } diff --git a/packages/cli/src/lib/project/manifests/polywrap/languages.ts b/packages/cli/src/lib/project/manifests/polywrap/languages.ts index 12fc2d4fb2..d4c49fdc2d 100644 --- a/packages/cli/src/lib/project/manifests/polywrap/languages.ts +++ b/packages/cli/src/lib/project/manifests/polywrap/languages.ts @@ -52,7 +52,7 @@ export function polywrapManifestOverrideCodegenDir( case "wasm/rust": return "./src/wrap"; case "wasm/golang": - return "./module/main"; + return "./module/wrap"; default: return undefined; } diff --git a/packages/schema/bind/src/bindings/golang/wasm/index.ts b/packages/schema/bind/src/bindings/golang/wasm/index.ts index d9c97a1b3f..4533a4f3c7 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/index.ts +++ b/packages/schema/bind/src/bindings/golang/wasm/index.ts @@ -226,6 +226,11 @@ export const generateBinding: GenerateBindingFn = ( ), }); + // Render the root directory + output.entries.push( + ...renderTemplates(templatePath(""), { goImport, ...abi }, subTemplates) + ); + output.entries = mergePaths(output.entries); return result; diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/wrap-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/wrap-go.mustache new file mode 100644 index 0000000000..a1080fa322 --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/wrap-go.mustache @@ -0,0 +1 @@ +package wrap diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/wrap.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/wrap.go new file mode 100644 index 0000000000..a1080fa322 --- /dev/null +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/wrap.go @@ -0,0 +1 @@ +package wrap diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/go.mod b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/go.mod similarity index 67% rename from packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/go.mod rename to packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/go.mod index 24d82683b1..06586f28bb 100644 --- a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/go.mod +++ b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/go.mod @@ -4,4 +4,4 @@ go 1.18 require github.com/polywrap/go-wrap v0.0.0-20230706013513-29691688fe81 -require github.com/valyala/fastjson v1.6.3 // indirect \ No newline at end of file +require github.com/valyala/fastjson v1.6.3 // indirect diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/go.sum b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/go.sum similarity index 100% rename from packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/go.sum rename to packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/go.sum diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/main.go b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/main.go deleted file mode 100644 index 9d976ff215..0000000000 --- a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/main.go +++ /dev/null @@ -1,20 +0,0 @@ -package main - -import ( - moduleWrapped "example.com/go-wrap-test/main/module_wrapped" - "github.com/polywrap/go-wrap/polywrap" -) - -//export _wrap_invoke -func _wrap_invoke(methodSize, argsSize, envSize uint32) bool { - args := polywrap.WrapInvokeArgs(methodSize, argsSize) - switch args.Method { - case "method": - return polywrap.WrapInvoke(args, envSize, moduleWrapped.MethodWrapped) - default: - return polywrap.WrapInvoke(args, envSize, nil) - } -} - -func main() { -} diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/module_wrapped/module_serialization.go b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/module_wrapped/module_serialization.go deleted file mode 100644 index 5fcee5679a..0000000000 --- a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/module_wrapped/module_serialization.go +++ /dev/null @@ -1,53 +0,0 @@ -package module - -import ( - . "example.com/go-wrap-test/main/types" - "github.com/polywrap/go-wrap/polywrap/msgpack" -) - -func DeserializeMethodArgs(argsBuf []byte) *MethodArgsMethod { - ctx := msgpack.NewContext("Deserializing module-type: Method") - reader := msgpack.NewReadDecoder(ctx, argsBuf) - - var ( - _arg string - _argSet bool - ) - - for i := int32(reader.ReadMapLength()); i > 0; i-- { - field := reader.ReadString() - reader.Context().Push(field, "unknown", "searching for property type") - switch field { - case "arg": - reader.Context().Push(field, "string", "type found, reading property") - _arg = reader.ReadString() - _argSet = true - reader.Context().Pop() - } - reader.Context().Pop() - } - - if !_argSet { - panic(reader.Context().PrintWithContext("Missing required property: 'arg: String'")) - } - - return &MethodArgsMethod{ - Arg: _arg, - } -} - -func SerializeMethodResult(value string) []byte { - ctx := msgpack.NewContext("Serializing module-type: Method") - encoder := msgpack.NewWriteEncoder(ctx) - WriteMethodResult(encoder, value); - return encoder.Buffer() -} - -func WriteMethodResult(writer msgpack.Write, value string) { - writer.Context().Push("method", "string", "writing property") - { - v := value - writer.WriteString(v) - } - writer.Context().Pop() -} diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/module_wrapped/module_wrapped.go b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/module_wrapped/module_wrapped.go deleted file mode 100644 index fa2ae39875..0000000000 --- a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/module_wrapped/module_wrapped.go +++ /dev/null @@ -1,13 +0,0 @@ -package module - -import ( - methods "example.com/go-wrap-test" -) - -func MethodWrapped(argsBuf []byte, envSize uint32) []byte { - - args := DeserializeMethodArgs(argsBuf) - - result := methods.Method(args) - return SerializeMethodResult(result) -} diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/types/module_args.go b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/types/module_args.go deleted file mode 100644 index b69e2ed8fa..0000000000 --- a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/types/module_args.go +++ /dev/null @@ -1,5 +0,0 @@ -package types - -type MethodArgsMethod struct { - Arg string -} diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/mod.go b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/module.go similarity index 62% rename from packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/mod.go rename to packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/module.go index 53d394725c..5517c49168 100644 --- a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/mod.go +++ b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/module.go @@ -1,6 +1,6 @@ package module -import "example.com/go-wrap-test/main/types" +import "example.com/go-wrap-test/module/wrap/types" func Method(args *types.MethodArgsMethod) string { return args.Arg diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/polywrap.yaml b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/polywrap.yaml index a287b38b27..07650dd125 100644 --- a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/polywrap.yaml +++ b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/polywrap.yaml @@ -4,4 +4,4 @@ project: type: wasm/golang source: schema: ./schema.graphql - module: ./module/go.mod + module: ./go.mod From 015c7aa474512cc4f3b0b2f772faa6d240adffae Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Fri, 7 Jul 2023 00:28:56 +0200 Subject: [PATCH 45/65] chore: vm builds --- .../cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts b/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts index 8135c31f9b..397376e33b 100644 --- a/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts +++ b/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts @@ -46,7 +46,7 @@ const CONFIGS: Record = { "wasm/golang": { defaultIncludes: ["go.mod", "go.sum"], baseImage: "polywrap/vm-base-go", - version: "0.1.0", + version: "0.1.1", }, }; From fae0bd69183ef115a1880f2824ad138d1ca26518 Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Fri, 7 Jul 2023 00:36:00 +0200 Subject: [PATCH 46/65] chore: add cli test cases for golang --- .github/workflows/ci-golang.yaml | 45 +++++++++++++++++++ packages/cli/jest.config.js | 3 +- packages/cli/jest.go.config.js | 22 +++++++++ packages/cli/package.json | 1 + .../cli/src/__tests__/e2e/build-go.spec.ts | 2 +- .../wasm/{go => golang}/001-sanity/go.mod | 0 .../wasm/{go => golang}/001-sanity/go.sum | 0 .../001-sanity/module/module.go | 0 .../{go => golang}/001-sanity/polywrap.yaml | 0 .../{go => golang}/001-sanity/schema.graphql | 0 .../008-sanity-golang/expected/stdout.json | 4 ++ .../cli/codegen/wasm/008-sanity-golang/go.mod | 7 +++ .../wasm/008-sanity-golang/module/module.go | 7 +++ .../wasm/008-sanity-golang/polywrap.yaml | 7 +++ .../wasm/008-sanity-golang/schema.graphql | 5 +++ 15 files changed, 101 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/ci-golang.yaml create mode 100644 packages/cli/jest.go.config.js rename packages/test-cases/cases/cli/build-cmd/wasm/{go => golang}/001-sanity/go.mod (100%) rename packages/test-cases/cases/cli/build-cmd/wasm/{go => golang}/001-sanity/go.sum (100%) rename packages/test-cases/cases/cli/build-cmd/wasm/{go => golang}/001-sanity/module/module.go (100%) rename packages/test-cases/cases/cli/build-cmd/wasm/{go => golang}/001-sanity/polywrap.yaml (100%) rename packages/test-cases/cases/cli/build-cmd/wasm/{go => golang}/001-sanity/schema.graphql (100%) create mode 100644 packages/test-cases/cases/cli/codegen/wasm/008-sanity-golang/expected/stdout.json create mode 100644 packages/test-cases/cases/cli/codegen/wasm/008-sanity-golang/go.mod create mode 100644 packages/test-cases/cases/cli/codegen/wasm/008-sanity-golang/module/module.go create mode 100644 packages/test-cases/cases/cli/codegen/wasm/008-sanity-golang/polywrap.yaml create mode 100644 packages/test-cases/cases/cli/codegen/wasm/008-sanity-golang/schema.graphql diff --git a/.github/workflows/ci-golang.yaml b/.github/workflows/ci-golang.yaml new file mode 100644 index 0000000000..4a28418d0b --- /dev/null +++ b/.github/workflows/ci-golang.yaml @@ -0,0 +1,45 @@ +name: CI-Golang + +on: + push: + branches: + - origin + - origin-dev + pull_request: + +jobs: + Test-Cli: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Read .nvmrc + run: echo ::set-output name=NVMRC::$(cat .nvmrc) + id: nvm + + - name: Setup Node.js + uses: actions/setup-node@master + with: + node-version: '${{ steps.nvm.outputs.NVMRC }}' + + - name: Get yarn cache directory path + id: yarn-cache-dir-path + run: echo "::set-output name=dir::$(yarn cache dir)" + + - uses: actions/cache@v2 + with: + path: ${{ steps.yarn-cache-dir-path.outputs.dir }} + key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} + restore-keys: | + ${{ runner.os }}-yarn- + + - name: Install dependencies + run: yarn install --nonInteractive --frozen-lockfile --prefer-offline + + - name: Build + run: yarn build + + - name: Test + run: yarn test:golang + working-directory: ./packages/cli diff --git a/packages/cli/jest.config.js b/packages/cli/jest.config.js index aef0111dbf..57c9519473 100644 --- a/packages/cli/jest.config.js +++ b/packages/cli/jest.config.js @@ -11,7 +11,8 @@ module.exports = { modulePathIgnorePatterns: [ "/build", "/src/__tests__/project/.polywrap", - "/src/__tests__/e2e/build-rs.spec.ts" + "/src/__tests__/e2e/build-rs.spec.ts", + "/src/__tests__/e2e/build-go.spec.ts" ], testPathIgnorePatterns: [ "/src/__tests__/project/.polywrap" diff --git a/packages/cli/jest.go.config.js b/packages/cli/jest.go.config.js new file mode 100644 index 0000000000..7465b45559 --- /dev/null +++ b/packages/cli/jest.go.config.js @@ -0,0 +1,22 @@ +module.exports = { + collectCoverage: true, + preset: "ts-jest", + testEnvironment: "node", + globals: { + "ts-jest": { + diagnostics: false + }, + }, + modulePathIgnorePatterns: [ + "/build", + "/src/__tests__/project/.polywrap" + ], + testPathIgnorePatterns: [ + "/src/__tests__/project/.polywrap" + ], + transformIgnorePatterns: [ + "/src/__tests__/project/.polywrap" + ], + setupFilesAfterEnv: ["./jest.setup.js"], + testMatch: ["**/build-go.spec.ts"] +}; diff --git a/packages/cli/package.json b/packages/cli/package.json index d20311d753..ddcc04cf2b 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -36,6 +36,7 @@ "test:e2e:p1": "yarn test:cmd -- ./src/__tests__/e2e/p1/*.spec.ts", "test:e2e:p2": "yarn test:cmd -- ./src/__tests__/e2e/p2/*.spec.ts", "test:rust": "yarn test:cmd -- --config ./jest.rs.config.js", + "test:golang": "yarn test:cmd -- --config ./jest.go.config.js", "test:watch": "yarn test -- --watch" }, "resolutions": { diff --git a/packages/cli/src/__tests__/e2e/build-go.spec.ts b/packages/cli/src/__tests__/e2e/build-go.spec.ts index 138a00f6f4..8c9606fe0f 100644 --- a/packages/cli/src/__tests__/e2e/build-go.spec.ts +++ b/packages/cli/src/__tests__/e2e/build-go.spec.ts @@ -7,7 +7,7 @@ import path from "path"; jest.setTimeout(1500000); describe("e2e tests for build command", () => { - const testCaseRoot = path.join(GetPathToCliTestFiles(), "build-cmd/wasm/go"); + const testCaseRoot = path.join(GetPathToCliTestFiles(), "build-cmd/wasm/golang"); const testCases = fs .readdirSync(testCaseRoot, { withFileTypes: true }) .filter((dirent) => dirent.isDirectory()) diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/go.mod b/packages/test-cases/cases/cli/build-cmd/wasm/golang/001-sanity/go.mod similarity index 100% rename from packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/go.mod rename to packages/test-cases/cases/cli/build-cmd/wasm/golang/001-sanity/go.mod diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/go.sum b/packages/test-cases/cases/cli/build-cmd/wasm/golang/001-sanity/go.sum similarity index 100% rename from packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/go.sum rename to packages/test-cases/cases/cli/build-cmd/wasm/golang/001-sanity/go.sum diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/module.go b/packages/test-cases/cases/cli/build-cmd/wasm/golang/001-sanity/module/module.go similarity index 100% rename from packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/module.go rename to packages/test-cases/cases/cli/build-cmd/wasm/golang/001-sanity/module/module.go diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/polywrap.yaml b/packages/test-cases/cases/cli/build-cmd/wasm/golang/001-sanity/polywrap.yaml similarity index 100% rename from packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/polywrap.yaml rename to packages/test-cases/cases/cli/build-cmd/wasm/golang/001-sanity/polywrap.yaml diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/schema.graphql b/packages/test-cases/cases/cli/build-cmd/wasm/golang/001-sanity/schema.graphql similarity index 100% rename from packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/schema.graphql rename to packages/test-cases/cases/cli/build-cmd/wasm/golang/001-sanity/schema.graphql diff --git a/packages/test-cases/cases/cli/codegen/wasm/008-sanity-golang/expected/stdout.json b/packages/test-cases/cases/cli/codegen/wasm/008-sanity-golang/expected/stdout.json new file mode 100644 index 0000000000..735a6dca2c --- /dev/null +++ b/packages/test-cases/cases/cli/codegen/wasm/008-sanity-golang/expected/stdout.json @@ -0,0 +1,4 @@ +{ + "stdout": "Types were generated successfully", + "exitCode": 0 +} diff --git a/packages/test-cases/cases/cli/codegen/wasm/008-sanity-golang/go.mod b/packages/test-cases/cases/cli/codegen/wasm/008-sanity-golang/go.mod new file mode 100644 index 0000000000..06586f28bb --- /dev/null +++ b/packages/test-cases/cases/cli/codegen/wasm/008-sanity-golang/go.mod @@ -0,0 +1,7 @@ +module example.com/go-wrap-test + +go 1.18 + +require github.com/polywrap/go-wrap v0.0.0-20230706013513-29691688fe81 + +require github.com/valyala/fastjson v1.6.3 // indirect diff --git a/packages/test-cases/cases/cli/codegen/wasm/008-sanity-golang/module/module.go b/packages/test-cases/cases/cli/codegen/wasm/008-sanity-golang/module/module.go new file mode 100644 index 0000000000..5517c49168 --- /dev/null +++ b/packages/test-cases/cases/cli/codegen/wasm/008-sanity-golang/module/module.go @@ -0,0 +1,7 @@ +package module + +import "example.com/go-wrap-test/module/wrap/types" + +func Method(args *types.MethodArgsMethod) string { + return args.Arg +} diff --git a/packages/test-cases/cases/cli/codegen/wasm/008-sanity-golang/polywrap.yaml b/packages/test-cases/cases/cli/codegen/wasm/008-sanity-golang/polywrap.yaml new file mode 100644 index 0000000000..07650dd125 --- /dev/null +++ b/packages/test-cases/cases/cli/codegen/wasm/008-sanity-golang/polywrap.yaml @@ -0,0 +1,7 @@ +format: 0.4.0 +project: + name: ObjectTypes + type: wasm/golang +source: + schema: ./schema.graphql + module: ./go.mod diff --git a/packages/test-cases/cases/cli/codegen/wasm/008-sanity-golang/schema.graphql b/packages/test-cases/cases/cli/codegen/wasm/008-sanity-golang/schema.graphql new file mode 100644 index 0000000000..3dc66d388a --- /dev/null +++ b/packages/test-cases/cases/cli/codegen/wasm/008-sanity-golang/schema.graphql @@ -0,0 +1,5 @@ +type Module { + method( + arg: String! + ): String! +} \ No newline at end of file From a00dea3c22101854df21b099db8ab4f980a1e657 Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Mon, 10 Jul 2023 21:59:38 -0400 Subject: [PATCH 47/65] chore: fix bindings --- .../Env%type%Serialization-go.mustache | 2 +- .../Env%type%Serialization-go.mustache | 2 +- .../Object%type%Serialization-go.mustache | 2 +- .../%type%Serialization-go.mustache | 2 +- .../Object%type%Serialization-go.mustache | 2 +- .../env_test_import__env_serialization.go | 16 ++-- ...st_import__another_object_serialization.go | 2 +- ...bject_test_import__object_serialization.go | 16 ++-- .../module_wrapped/module_serialization.go | 4 +- .../object_another_type_serialization.go | 6 +- .../object_custom_map_value_serialization.go | 2 +- .../types/object_custom_type_serialization.go | 82 +++++++++---------- .../wasm-go/types/object_env_serialization.go | 6 +- .../wasm-go/types/objectelse_serialization.go | 2 +- 14 files changed, 73 insertions(+), 73 deletions(-) diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%Serialization-go.mustache index a959eaf7f2..bb107d2031 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%Serialization-go.mustache @@ -60,7 +60,7 @@ func read{{#toUpper}}{{type}}{{/toUpper}}(reader msgpack.Read) *{{#toUpper}}{{ty reader.Context().Push(field, "unknown", "searching for property type") switch field { {{#properties}} - case "{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}": + case "{{name}}": reader.Context().Push(field, "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "type found, reading property") {{#scalar}} {{> deserialize_scalar}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%Serialization-go.mustache index a715b7bd59..1157ba4df3 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%Serialization-go.mustache @@ -63,7 +63,7 @@ func read{{#toUpper}}{{type}}{{/toUpper}}(reader msgpack.Read) *{{#toUpper}}{{ty reader.Context().Push(field, "unknown", "searching for property type") switch field { {{#properties}} - case "{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}": + case "{{name}}": reader.Context().Push(field, "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "type found, reading property") {{#scalar}} {{> deserialize_scalar}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%Serialization-go.mustache index 11f4aa2f0a..a3c8df5fbb 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%Serialization-go.mustache @@ -63,7 +63,7 @@ func read{{#toUpper}}{{type}}{{/toUpper}}(reader msgpack.Read) *{{#toUpper}}{{ty reader.Context().Push(field, "unknown", "searching for property type") switch field { {{#properties}} - case "{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}": + case "{{name}}": reader.Context().Push(field, "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "type found, reading property") {{#scalar}} {{> deserialize_scalar}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Serialization-go.mustache index d77db20f3f..552612599a 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Serialization-go.mustache @@ -31,7 +31,7 @@ func Deserialize{{#toUpper}}{{name}}{{/toUpper}}Args(argsBuf []byte) *MethodArgs reader.Context().Push(field, "unknown", "searching for property type") switch field { {{#arguments}} - case "{{#handleKeywords}}{{name}}{{/handleKeywords}}": + case "{{name}}": reader.Context().Push(field, "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "type found, reading property") {{#scalar}} {{> deserialize_scalar}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%Serialization-go.mustache index 249c10f617..0531e1f9a2 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%Serialization-go.mustache @@ -63,7 +63,7 @@ func read{{#toUpper}}{{type}}{{/toUpper}}(reader msgpack.Read) *{{#toUpper}}{{ty reader.Context().Push(field, "unknown", "searching for property type") switch field { {{#properties}} - case "{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}": + case "{{name}}": reader.Context().Push(field, "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "type found, reading property") {{#scalar}} {{> deserialize_scalar}} diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env_serialization.go index 592d639a05..d4cbc7936e 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env_serialization.go @@ -137,20 +137,20 @@ func readTestImport_Env(reader msgpack.Read) *TestImport_Env { field := reader.ReadString() reader.Context().Push(field, "unknown", "searching for property type") switch field { - case "Object": + case "object": reader.Context().Push(field, "TestImport_AnotherObject", "type found, reading property") if v := TestImport_AnotherObjectRead(reader); v != nil { _object = *v } _objectSet = true reader.Context().Pop() - case "OptObject": + case "optObject": reader.Context().Push(field, "*TestImport_AnotherObject", "type found, reading property") if v := TestImport_AnotherObjectRead(reader); v != nil { _optObject = v } reader.Context().Pop() - case "ObjectArray": + case "objectArray": reader.Context().Push(field, "[]TestImport_AnotherObject", "type found, reading property") if reader.IsNil() { _objectArray = nil @@ -165,7 +165,7 @@ func readTestImport_Env(reader msgpack.Read) *TestImport_Env { } _objectArraySet = true reader.Context().Pop() - case "OptObjectArray": + case "optObjectArray": reader.Context().Push(field, "[]*TestImport_AnotherObject", "type found, reading property") if reader.IsNil() { _optObjectArray = nil @@ -179,13 +179,13 @@ func readTestImport_Env(reader msgpack.Read) *TestImport_Env { } } reader.Context().Pop() - case "En": + case "en": reader.Context().Push(field, "TestImport_Enum", "type found, reading property") _en = TestImport_Enum(reader.ReadI32()) SanitizeTestImport_EnumValue(int32(_en)) _enSet = true reader.Context().Pop() - case "OptEnum": + case "optEnum": reader.Context().Push(field, "*TestImport_Enum", "type found, reading property") if !reader.IsNil() { v := TestImport_Enum(reader.ReadI32()) @@ -193,7 +193,7 @@ func readTestImport_Env(reader msgpack.Read) *TestImport_Env { _optEnum = &v } reader.Context().Pop() - case "EnumArray": + case "enumArray": reader.Context().Push(field, "[]TestImport_Enum", "type found, reading property") if reader.IsNil() { _enumArray = nil @@ -207,7 +207,7 @@ func readTestImport_Env(reader msgpack.Read) *TestImport_Env { } _enumArraySet = true reader.Context().Pop() - case "OptEnumArray": + case "optEnumArray": reader.Context().Push(field, "[]*TestImport_Enum", "type found, reading property") if reader.IsNil() { _optEnumArray = nil diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object_serialization.go index 36168acfb1..3cfa4e63db 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object_serialization.go @@ -38,7 +38,7 @@ func readTestImport_AnotherObject(reader msgpack.Read) *TestImport_AnotherObject field := reader.ReadString() reader.Context().Push(field, "unknown", "searching for property type") switch field { - case "Prop": + case "prop": reader.Context().Push(field, "string", "type found, reading property") _prop = reader.ReadString() _propSet = true diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object_serialization.go index d3c17cc26d..f2c7c52ae6 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object_serialization.go @@ -137,20 +137,20 @@ func readTestImport_Object(reader msgpack.Read) *TestImport_Object { field := reader.ReadString() reader.Context().Push(field, "unknown", "searching for property type") switch field { - case "Object": + case "object": reader.Context().Push(field, "TestImport_AnotherObject", "type found, reading property") if v := TestImport_AnotherObjectRead(reader); v != nil { _object = *v } _objectSet = true reader.Context().Pop() - case "OptObject": + case "optObject": reader.Context().Push(field, "*TestImport_AnotherObject", "type found, reading property") if v := TestImport_AnotherObjectRead(reader); v != nil { _optObject = v } reader.Context().Pop() - case "ObjectArray": + case "objectArray": reader.Context().Push(field, "[]TestImport_AnotherObject", "type found, reading property") if reader.IsNil() { _objectArray = nil @@ -165,7 +165,7 @@ func readTestImport_Object(reader msgpack.Read) *TestImport_Object { } _objectArraySet = true reader.Context().Pop() - case "OptObjectArray": + case "optObjectArray": reader.Context().Push(field, "[]*TestImport_AnotherObject", "type found, reading property") if reader.IsNil() { _optObjectArray = nil @@ -179,13 +179,13 @@ func readTestImport_Object(reader msgpack.Read) *TestImport_Object { } } reader.Context().Pop() - case "En": + case "en": reader.Context().Push(field, "TestImport_Enum", "type found, reading property") _en = TestImport_Enum(reader.ReadI32()) SanitizeTestImport_EnumValue(int32(_en)) _enSet = true reader.Context().Pop() - case "OptEnum": + case "optEnum": reader.Context().Push(field, "*TestImport_Enum", "type found, reading property") if !reader.IsNil() { v := TestImport_Enum(reader.ReadI32()) @@ -193,7 +193,7 @@ func readTestImport_Object(reader msgpack.Read) *TestImport_Object { _optEnum = &v } reader.Context().Pop() - case "EnumArray": + case "enumArray": reader.Context().Push(field, "[]TestImport_Enum", "type found, reading property") if reader.IsNil() { _enumArray = nil @@ -207,7 +207,7 @@ func readTestImport_Object(reader msgpack.Read) *TestImport_Object { } _enumArraySet = true reader.Context().Pop() - case "OptEnumArray": + case "optEnumArray": reader.Context().Push(field, "[]*TestImport_Enum", "type found, reading property") if reader.IsNil() { _optEnumArray = nil diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/module_wrapped/module_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/module_wrapped/module_serialization.go index e3e502b889..19b7b664c0 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/module_wrapped/module_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/module_wrapped/module_serialization.go @@ -91,7 +91,7 @@ func DeserializeModuleMethodArgs(argsBuf []byte) *MethodArgsModuleMethod { } } reader.Context().Pop() - case "m_map": + case "map": reader.Context().Push(field, "map[string]int32", "type found, reading property") if reader.IsNil() { _map = nil @@ -451,7 +451,7 @@ func DeserializeIfArgs(argsBuf []byte) *MethodArgsIf { field := reader.ReadString() reader.Context().Push(field, "unknown", "searching for property type") switch field { - case "m_if": + case "if": reader.Context().Push(field, "Else", "type found, reading property") if v := ElseRead(reader); v != nil { _if = *v diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_another_type_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_another_type_serialization.go index dc10397874..eb860e0ff7 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_another_type_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_another_type_serialization.go @@ -61,20 +61,20 @@ func readAnotherType(reader msgpack.Read) *AnotherType { field := reader.ReadString() reader.Context().Push(field, "unknown", "searching for property type") switch field { - case "Prop": + case "prop": reader.Context().Push(field, "*string", "type found, reading property") if !reader.IsNil() { v := reader.ReadString() _prop = &v } reader.Context().Pop() - case "Circular": + case "circular": reader.Context().Push(field, "*CustomType", "type found, reading property") if v := CustomTypeRead(reader); v != nil { _circular = v } reader.Context().Pop() - case "M_const": + case "const": reader.Context().Push(field, "*string", "type found, reading property") if !reader.IsNil() { v := reader.ReadString() diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value_serialization.go index 11ca1da95e..babbd72f89 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value_serialization.go @@ -38,7 +38,7 @@ func readCustomMapValue(reader msgpack.Read) *CustomMapValue { field := reader.ReadString() reader.Context().Push(field, "unknown", "searching for property type") switch field { - case "Foo": + case "foo": reader.Context().Push(field, "string", "type found, reading property") _foo = reader.ReadString() _fooSet = true diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go index 2275a4e94c..7485b1d615 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go @@ -655,126 +655,126 @@ func readCustomType(reader msgpack.Read) *CustomType { field := reader.ReadString() reader.Context().Push(field, "unknown", "searching for property type") switch field { - case "Str": + case "str": reader.Context().Push(field, "string", "type found, reading property") _str = reader.ReadString() _strSet = true reader.Context().Pop() - case "OptStr": + case "optStr": reader.Context().Push(field, "*string", "type found, reading property") if !reader.IsNil() { v := reader.ReadString() _optStr = &v } reader.Context().Pop() - case "U": + case "u": reader.Context().Push(field, "uint32", "type found, reading property") _u = reader.ReadU32() _uSet = true reader.Context().Pop() - case "OptU": + case "optU": reader.Context().Push(field, "*uint32", "type found, reading property") if !reader.IsNil() { v := reader.ReadU32() _optU = &v } reader.Context().Pop() - case "M_u8": + case "u8": reader.Context().Push(field, "uint8", "type found, reading property") _u8 = reader.ReadU8() _u8Set = true reader.Context().Pop() - case "M_u16": + case "u16": reader.Context().Push(field, "uint16", "type found, reading property") _u16 = reader.ReadU16() _u16Set = true reader.Context().Pop() - case "M_u32": + case "u32": reader.Context().Push(field, "uint32", "type found, reading property") _u32 = reader.ReadU32() _u32Set = true reader.Context().Pop() - case "I": + case "i": reader.Context().Push(field, "int32", "type found, reading property") _i = reader.ReadI32() _iSet = true reader.Context().Pop() - case "M_i8": + case "i8": reader.Context().Push(field, "int8", "type found, reading property") _i8 = reader.ReadI8() _i8Set = true reader.Context().Pop() - case "M_i16": + case "i16": reader.Context().Push(field, "int16", "type found, reading property") _i16 = reader.ReadI16() _i16Set = true reader.Context().Pop() - case "M_i32": + case "i32": reader.Context().Push(field, "int32", "type found, reading property") _i32 = reader.ReadI32() _i32Set = true reader.Context().Pop() - case "Bigint": + case "bigint": reader.Context().Push(field, "*big.Int", "type found, reading property") _bigint = reader.ReadBigInt() _bigintSet = true reader.Context().Pop() - case "OptBigint": + case "optBigint": reader.Context().Push(field, "*big.Int", "type found, reading property") if !reader.IsNil() { v := reader.ReadBigInt() _optBigint = v } reader.Context().Pop() - case "Bignumber": + case "bignumber": reader.Context().Push(field, "*big.Int", "type found, reading property") _bignumber = reader.ReadBigInt() _bignumberSet = true reader.Context().Pop() - case "OptBignumber": + case "optBignumber": reader.Context().Push(field, "*big.Int", "type found, reading property") if !reader.IsNil() { v := reader.ReadBigInt() _optBignumber = v } reader.Context().Pop() - case "Json": + case "json": reader.Context().Push(field, "*fastjson.Value", "type found, reading property") _json = reader.ReadJson() _jsonSet = true reader.Context().Pop() - case "OptJson": + case "optJson": reader.Context().Push(field, "*fastjson.Value", "type found, reading property") if !reader.IsNil() { v := reader.ReadJson() _optJson = v } reader.Context().Pop() - case "Bytes": + case "bytes": reader.Context().Push(field, "[]byte", "type found, reading property") _bytes = reader.ReadBytes() _bytesSet = true reader.Context().Pop() - case "OptBytes": + case "optBytes": reader.Context().Push(field, "[]byte", "type found, reading property") if !reader.IsNil() { v := reader.ReadBytes() _optBytes = v } reader.Context().Pop() - case "M_boolean": + case "boolean": reader.Context().Push(field, "bool", "type found, reading property") _boolean = reader.ReadBool() _booleanSet = true reader.Context().Pop() - case "OptBoolean": + case "optBoolean": reader.Context().Push(field, "*bool", "type found, reading property") if !reader.IsNil() { v := reader.ReadBool() _optBoolean = &v } reader.Context().Pop() - case "U_array": + case "u_array": reader.Context().Push(field, "[]uint32", "type found, reading property") if reader.IsNil() { _u_array = nil @@ -787,7 +787,7 @@ func readCustomType(reader msgpack.Read) *CustomType { } _u_arraySet = true reader.Context().Pop() - case "UOpt_array": + case "uOpt_array": reader.Context().Push(field, "[]uint32", "type found, reading property") if reader.IsNil() { _uOpt_array = nil @@ -814,7 +814,7 @@ func readCustomType(reader msgpack.Read) *CustomType { } } reader.Context().Pop() - case "OptStrOptArray": + case "optStrOptArray": reader.Context().Push(field, "[]*string", "type found, reading property") if reader.IsNil() { _optStrOptArray = nil @@ -829,7 +829,7 @@ func readCustomType(reader msgpack.Read) *CustomType { } } reader.Context().Pop() - case "UArrayArray": + case "uArrayArray": reader.Context().Push(field, "[][]uint32", "type found, reading property") if reader.IsNil() { _uArrayArray = nil @@ -850,7 +850,7 @@ func readCustomType(reader msgpack.Read) *CustomType { } _uArrayArraySet = true reader.Context().Pop() - case "UOptArrayOptArray": + case "uOptArrayOptArray": reader.Context().Push(field, "[][]*uint32", "type found, reading property") if reader.IsNil() { _uOptArrayOptArray = nil @@ -874,7 +874,7 @@ func readCustomType(reader msgpack.Read) *CustomType { } _uOptArrayOptArraySet = true reader.Context().Pop() - case "UArrayOptArrayArray": + case "uArrayOptArrayArray": reader.Context().Push(field, "[][][]uint32", "type found, reading property") if reader.IsNil() { _uArrayOptArrayArray = nil @@ -903,7 +903,7 @@ func readCustomType(reader msgpack.Read) *CustomType { } _uArrayOptArrayArraySet = true reader.Context().Pop() - case "CrazyArray": + case "crazyArray": reader.Context().Push(field, "[][][][]uint32", "type found, reading property") if reader.IsNil() { _crazyArray = nil @@ -939,20 +939,20 @@ func readCustomType(reader msgpack.Read) *CustomType { } } reader.Context().Pop() - case "Object": + case "object": reader.Context().Push(field, "AnotherType", "type found, reading property") if v := AnotherTypeRead(reader); v != nil { _object = *v } _objectSet = true reader.Context().Pop() - case "OptObject": + case "optObject": reader.Context().Push(field, "*AnotherType", "type found, reading property") if v := AnotherTypeRead(reader); v != nil { _optObject = v } reader.Context().Pop() - case "ObjectArray": + case "objectArray": reader.Context().Push(field, "[]AnotherType", "type found, reading property") if reader.IsNil() { _objectArray = nil @@ -967,7 +967,7 @@ func readCustomType(reader msgpack.Read) *CustomType { } _objectArraySet = true reader.Context().Pop() - case "OptObjectArray": + case "optObjectArray": reader.Context().Push(field, "[]*AnotherType", "type found, reading property") if reader.IsNil() { _optObjectArray = nil @@ -981,13 +981,13 @@ func readCustomType(reader msgpack.Read) *CustomType { } } reader.Context().Pop() - case "En": + case "en": reader.Context().Push(field, "CustomEnum", "type found, reading property") _en = CustomEnum(reader.ReadI32()) SanitizeCustomEnumValue(int32(_en)) _enSet = true reader.Context().Pop() - case "OptEnum": + case "optEnum": reader.Context().Push(field, "*CustomEnum", "type found, reading property") if !reader.IsNil() { v := CustomEnum(reader.ReadI32()) @@ -995,7 +995,7 @@ func readCustomType(reader msgpack.Read) *CustomType { _optEnum = &v } reader.Context().Pop() - case "EnumArray": + case "enumArray": reader.Context().Push(field, "[]CustomEnum", "type found, reading property") if reader.IsNil() { _enumArray = nil @@ -1009,7 +1009,7 @@ func readCustomType(reader msgpack.Read) *CustomType { } _enumArraySet = true reader.Context().Pop() - case "OptEnumArray": + case "optEnumArray": reader.Context().Push(field, "[]*CustomEnum", "type found, reading property") if reader.IsNil() { _optEnumArray = nil @@ -1025,7 +1025,7 @@ func readCustomType(reader msgpack.Read) *CustomType { } } reader.Context().Pop() - case "M_map": + case "map": reader.Context().Push(field, "map[string]int32", "type found, reading property") if reader.IsNil() { _map = nil @@ -1039,7 +1039,7 @@ func readCustomType(reader msgpack.Read) *CustomType { } _mapSet = true reader.Context().Pop() - case "MapOfArr": + case "mapOfArr": reader.Context().Push(field, "map[string][]int32", "type found, reading property") if reader.IsNil() { _mapOfArr = nil @@ -1061,7 +1061,7 @@ func readCustomType(reader msgpack.Read) *CustomType { } _mapOfArrSet = true reader.Context().Pop() - case "MapOfObj": + case "mapOfObj": reader.Context().Push(field, "map[string]AnotherType", "type found, reading property") if reader.IsNil() { _mapOfObj = nil @@ -1077,7 +1077,7 @@ func readCustomType(reader msgpack.Read) *CustomType { } _mapOfObjSet = true reader.Context().Pop() - case "MapOfArrOfObj": + case "mapOfArrOfObj": reader.Context().Push(field, "map[string][]AnotherType", "type found, reading property") if reader.IsNil() { _mapOfArrOfObj = nil @@ -1101,7 +1101,7 @@ func readCustomType(reader msgpack.Read) *CustomType { } _mapOfArrOfObjSet = true reader.Context().Pop() - case "MapCustomValue": + case "mapCustomValue": reader.Context().Push(field, "map[string]*CustomMapValue", "type found, reading property") if reader.IsNil() { _mapCustomValue = nil diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_env_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_env_serialization.go index bac49ecae9..abbdb35b71 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_env_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_env_serialization.go @@ -71,19 +71,19 @@ func readEnv(reader msgpack.Read) *Env { field := reader.ReadString() reader.Context().Push(field, "unknown", "searching for property type") switch field { - case "Prop": + case "prop": reader.Context().Push(field, "string", "type found, reading property") _prop = reader.ReadString() _propSet = true reader.Context().Pop() - case "OptProp": + case "optProp": reader.Context().Push(field, "*string", "type found, reading property") if !reader.IsNil() { v := reader.ReadString() _optProp = &v } reader.Context().Pop() - case "OptMap": + case "optMap": reader.Context().Push(field, "map[string]*int32", "type found, reading property") if reader.IsNil() { _optMap = nil diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse_serialization.go index 925f93a1ea..0d5add817f 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse_serialization.go @@ -38,7 +38,7 @@ func readElse(reader msgpack.Read) *Else { field := reader.ReadString() reader.Context().Push(field, "unknown", "searching for property type") switch field { - case "M_else": + case "else": reader.Context().Push(field, "string", "type found, reading property") _else = reader.ReadString() _elseSet = true From 592e6f6439b4f9a541c3d3e9efdd208a2d9b4ac6 Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Mon, 10 Jul 2023 22:11:39 -0400 Subject: [PATCH 48/65] chore: update golang build --- .../wasm/golang/image/Dockerfile.mustache | 4 +-- .../wasm/golang/local/local.sh | 4 +-- .../wasm/golang/local/wasm-memory.json | 25 ----------------- .../wasm/golang/local/wasm-target.json | 27 +++++++++++++++++++ .../wasm/golang/vm/Dockerfile | 4 +-- .../wasm/golang/vm/vm-script.mustache | 4 +-- .../wasm/golang/vm/wasm-memory.json | 25 ----------------- .../wasm/golang/vm/wasm-target.json | 27 +++++++++++++++++++ 8 files changed, 62 insertions(+), 58 deletions(-) delete mode 100644 packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/wasm-memory.json create mode 100644 packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/wasm-target.json delete mode 100644 packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/wasm-memory.json create mode 100644 packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/wasm-target.json diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/image/Dockerfile.mustache b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/image/Dockerfile.mustache index 84b096a922..4385711874 100644 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/image/Dockerfile.mustache +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/image/Dockerfile.mustache @@ -6,10 +6,10 @@ COPY . . RUN go mod tidy -RUN tinygo build -o main.wasm -target wasm-memory ./module/wrap/main/main.go +RUN tinygo build -o main.wasm -target wasm-target ./module/wrap/main/main.go # Make the build directory RUN rm -rf ./build RUN mkdir ./build -RUN wasm-snip -o ./build/wrap.wasm main.wasm -p syscall runtime.ticks fd_write tinygo +RUN wasm-snip ./main.wasm -o ./build/wrap.wasm -p fd_write clock_time_get args_sizes_get args_get diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/local.sh b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/local.sh index 9d6cf95724..00b41f6bad 100644 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/local.sh +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/local.sh @@ -1,7 +1,7 @@ go mod tidy -tinygo build -o ./build/main.wasm -target ./.polywrap/wasm/build/strategy-used/wasm-memory.json ./module/wrap/main/main.go +tinygo build -o ./build/main.wasm -target ./.polywrap/wasm/build/strategy-used/wasm-target.json ./module/wrap/main/main.go -wasm-snip -o ./build/wrap.wasm ./build/main.wasm -p syscall runtime.ticks fd_write tinygo +wasm-snip -o ./build/wrap.wasm ./build/main.wasm -p fd_write clock_time_get args_sizes_get args_get rm ./build/main.wasm diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/wasm-memory.json b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/wasm-memory.json deleted file mode 100644 index 3ba36c6805..0000000000 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/wasm-memory.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "llvm-target": "wasm32-unknown-wasi", - "cpu": "generic", - "features": "+bulk-memory,+nontrapping-fptoint,+sign-ext", - "build-tags": ["tinygo.wasm"], - "goos": "js", - "goarch": "wasm", - "linker": "wasm-ld", - "libc": "wasi-libc", - "scheduler": "asyncify", - "default-stack-size": 16384, - "cflags": [ - "-mbulk-memory", - "-mnontrapping-fptoint", - "-msign-ext" - ], - "ldflags": [ - "--allow-undefined", - "--stack-first", - "--no-demangle", - "--import-memory" - ], - "emulator": "node {root}/targets/wasm_exec.js {}", - "wasm-abi": "js" -} diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/wasm-target.json b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/wasm-target.json new file mode 100644 index 0000000000..2e45a55999 --- /dev/null +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/wasm-target.json @@ -0,0 +1,27 @@ +{ + "llvm-target": "wasm32-unknown-wasi", + "cpu": "generic", + "features": "+bulk-memory,+nontrapping-fptoint,+sign-ext", + "build-tags": ["tinygo.wasm", "wasi"], + "goos": "linux", + "goarch": "arm", + "linker": "wasm-ld", + "libc": "wasi-libc", + "scheduler": "asyncify", + "default-stack-size": 24576, + "cflags": [ + "-mbulk-memory", + "-mnontrapping-fptoint", + "-msign-ext" + ], + "ldflags": [ + "--stack-first", + "--no-demangle", + "--import-memory" + ], + "extra-files": [ + "src/runtime/asm_tinygowasm.S" + ], + "emulator": "wasmtime --mapdir=/tmp::{tmpDir} {}", + "wasm-abi": "generic" +} diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile index 015f6ff9ce..1748c20951 100644 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile @@ -2,9 +2,9 @@ FROM rust:1.60.0 as rust RUN cargo install -f wasm-snip -FROM tinygo/tinygo:0.24.0 +FROM tinygo/tinygo:0.27.0 # Copy wasm-snip COPY --from=rust /usr/local/cargo/bin/wasm-snip /usr/local/bin/ -COPY wasm-memory.json /usr/local/tinygo/targets/ +COPY wasm-target.json /usr/local/tinygo/targets/ WORKDIR /project diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/vm-script.mustache b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/vm-script.mustache index cbda5ef9eb..390359e144 100644 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/vm-script.mustache +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/vm-script.mustache @@ -2,10 +2,10 @@ set -e go mod tidy -tinygo build -o main.wasm -target wasm-memory ./module/wrap/main/main.go +tinygo build -o main.wasm -target wasm-target ./module/wrap/main/main.go # Make the build directory rm -rf ./build mkdir ./build -wasm-snip -o ./build/wrap.wasm main.wasm -p syscall runtime.ticks fd_write tinygo +wasm-snip ./main.wasm -o ./build/wrap.wasm -p fd_write clock_time_get args_sizes_get args_get \ No newline at end of file diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/wasm-memory.json b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/wasm-memory.json deleted file mode 100644 index 3ba36c6805..0000000000 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/wasm-memory.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "llvm-target": "wasm32-unknown-wasi", - "cpu": "generic", - "features": "+bulk-memory,+nontrapping-fptoint,+sign-ext", - "build-tags": ["tinygo.wasm"], - "goos": "js", - "goarch": "wasm", - "linker": "wasm-ld", - "libc": "wasi-libc", - "scheduler": "asyncify", - "default-stack-size": 16384, - "cflags": [ - "-mbulk-memory", - "-mnontrapping-fptoint", - "-msign-ext" - ], - "ldflags": [ - "--allow-undefined", - "--stack-first", - "--no-demangle", - "--import-memory" - ], - "emulator": "node {root}/targets/wasm_exec.js {}", - "wasm-abi": "js" -} diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/wasm-target.json b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/wasm-target.json new file mode 100644 index 0000000000..2e45a55999 --- /dev/null +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/wasm-target.json @@ -0,0 +1,27 @@ +{ + "llvm-target": "wasm32-unknown-wasi", + "cpu": "generic", + "features": "+bulk-memory,+nontrapping-fptoint,+sign-ext", + "build-tags": ["tinygo.wasm", "wasi"], + "goos": "linux", + "goarch": "arm", + "linker": "wasm-ld", + "libc": "wasi-libc", + "scheduler": "asyncify", + "default-stack-size": 24576, + "cflags": [ + "-mbulk-memory", + "-mnontrapping-fptoint", + "-msign-ext" + ], + "ldflags": [ + "--stack-first", + "--no-demangle", + "--import-memory" + ], + "extra-files": [ + "src/runtime/asm_tinygowasm.S" + ], + "emulator": "wasmtime --mapdir=/tmp::{tmpDir} {}", + "wasm-abi": "generic" +} From a13853bf57b613aa4214bad0ceffd3fc12776bdc Mon Sep 17 00:00:00 2001 From: Niraj Kamdar Date: Tue, 11 Jul 2023 15:18:36 +0800 Subject: [PATCH 49/65] feat: add missing docgen --- .../cli/docgen/001-sanity/docs/module.md | 14 + .../docgen/002-custom-config/docs/module.md | 21 + .../003-custom-manifest-file/docs/module.md | 14 + .../docgen/004-app/docs/Ethereum_module.md | 256 ++++++++++ .../docgen/004-app/docs/Ethereum_objects.md | 149 ++++++ .../cli/docgen/004-app/docs/Logger_enums.md | 18 + .../cli/docgen/004-app/docs/Logger_module.md | 15 + .../cases/cli/docgen/005-wasm/docs/module.md | 14 + .../cases/cli/docgen/005-wasm/docs/objects.md | 17 + .../cases/cli/docgen/006-plugin/docs/env.md | 15 + .../cli/docgen/006-plugin/docs/module.md | 23 + .../cli/docgen/006-plugin/docs/objects.md | 17 + .../cli/docgen/007-docusaurus/docs/enums.md | 16 + .../cli/docgen/007-docusaurus/docs/module.md | 15 + .../cli/docgen/007-docusaurus/docs/objects.md | 39 ++ .../cases/cli/docgen/008-jsdoc/docs/enums.js | 10 + .../cases/cli/docgen/008-jsdoc/docs/module.js | 14 + .../cli/docgen/008-jsdoc/docs/objects.js | 32 ++ .../009-schema/docs/generated-schema.graphql | 436 ++++++++++++++++++ 19 files changed, 1135 insertions(+) create mode 100644 packages/test-cases/cases/cli/docgen/001-sanity/docs/module.md create mode 100644 packages/test-cases/cases/cli/docgen/002-custom-config/docs/module.md create mode 100644 packages/test-cases/cases/cli/docgen/003-custom-manifest-file/docs/module.md create mode 100644 packages/test-cases/cases/cli/docgen/004-app/docs/Ethereum_module.md create mode 100644 packages/test-cases/cases/cli/docgen/004-app/docs/Ethereum_objects.md create mode 100644 packages/test-cases/cases/cli/docgen/004-app/docs/Logger_enums.md create mode 100644 packages/test-cases/cases/cli/docgen/004-app/docs/Logger_module.md create mode 100644 packages/test-cases/cases/cli/docgen/005-wasm/docs/module.md create mode 100644 packages/test-cases/cases/cli/docgen/005-wasm/docs/objects.md create mode 100644 packages/test-cases/cases/cli/docgen/006-plugin/docs/env.md create mode 100644 packages/test-cases/cases/cli/docgen/006-plugin/docs/module.md create mode 100644 packages/test-cases/cases/cli/docgen/006-plugin/docs/objects.md create mode 100644 packages/test-cases/cases/cli/docgen/007-docusaurus/docs/enums.md create mode 100644 packages/test-cases/cases/cli/docgen/007-docusaurus/docs/module.md create mode 100644 packages/test-cases/cases/cli/docgen/007-docusaurus/docs/objects.md create mode 100644 packages/test-cases/cases/cli/docgen/008-jsdoc/docs/enums.js create mode 100644 packages/test-cases/cases/cli/docgen/008-jsdoc/docs/module.js create mode 100644 packages/test-cases/cases/cli/docgen/008-jsdoc/docs/objects.js create mode 100644 packages/test-cases/cases/cli/docgen/009-schema/docs/generated-schema.graphql diff --git a/packages/test-cases/cases/cli/docgen/001-sanity/docs/module.md b/packages/test-cases/cases/cli/docgen/001-sanity/docs/module.md new file mode 100644 index 0000000000..a2abb12a0a --- /dev/null +++ b/packages/test-cases/cases/cli/docgen/001-sanity/docs/module.md @@ -0,0 +1,14 @@ +--- +id: module +title: Module +sidebar_position: 1 +--- + +### method + +```graphql +method( + arg: String! +): String! +``` + diff --git a/packages/test-cases/cases/cli/docgen/002-custom-config/docs/module.md b/packages/test-cases/cases/cli/docgen/002-custom-config/docs/module.md new file mode 100644 index 0000000000..46bf7e0d15 --- /dev/null +++ b/packages/test-cases/cases/cli/docgen/002-custom-config/docs/module.md @@ -0,0 +1,21 @@ +--- +id: module +title: Module +sidebar_position: 1 +--- + +### deployContract + +```graphql +deployContract( +): String! +``` + +### method + +```graphql +method( + arg: String! +): String! +``` + diff --git a/packages/test-cases/cases/cli/docgen/003-custom-manifest-file/docs/module.md b/packages/test-cases/cases/cli/docgen/003-custom-manifest-file/docs/module.md new file mode 100644 index 0000000000..a2abb12a0a --- /dev/null +++ b/packages/test-cases/cases/cli/docgen/003-custom-manifest-file/docs/module.md @@ -0,0 +1,14 @@ +--- +id: module +title: Module +sidebar_position: 1 +--- + +### method + +```graphql +method( + arg: String! +): String! +``` + diff --git a/packages/test-cases/cases/cli/docgen/004-app/docs/Ethereum_module.md b/packages/test-cases/cases/cli/docgen/004-app/docs/Ethereum_module.md new file mode 100644 index 0000000000..30ec3c9c04 --- /dev/null +++ b/packages/test-cases/cases/cli/docgen/004-app/docs/Ethereum_module.md @@ -0,0 +1,256 @@ +--- +id: Ethereum_module +title: Ethereum Module +sidebar_position: 1 +--- + +### awaitTransaction + +```graphql +awaitTransaction( + txHash: String! + connection: Ethereum_Connection +): Ethereum_TxReceipt! +``` + +### callContractMethod + +```graphql +callContractMethod( + address: String! + method: String! + args: String[] + options: Ethereum_TxOptions + connection: Ethereum_Connection +): Ethereum_TxResponse! +``` + +### callContractMethodAndWait + +```graphql +callContractMethodAndWait( + address: String! + method: String! + args: String[] + options: Ethereum_TxOptions + connection: Ethereum_Connection +): Ethereum_TxReceipt! +``` + +### callContractStatic + +```graphql +callContractStatic( + address: String! + method: String! + args: String[] + options: Ethereum_TxOptions + connection: Ethereum_Connection +): Ethereum_StaticTxResult! +``` + +### callContractView + +```graphql +callContractView( + address: String! + method: String! + args: String[] + connection: Ethereum_Connection +): String! +``` + +### checkAddress + +```graphql +checkAddress( + address: String! + connection: Ethereum_Connection +): Boolean! +``` + +### decodeFunction + +```graphql +decodeFunction( + method: String! + data: String! + connection: Ethereum_Connection +): String[]! +``` + +### deployContract + +```graphql +deployContract( + abi: String! + bytecode: String! + args: String[] + options: Ethereum_TxOptions + connection: Ethereum_Connection +): String! +``` + +### encodeFunction + +```graphql +encodeFunction( + method: String! + args: String[] + connection: Ethereum_Connection +): String! +``` + +### encodeParams + +```graphql +encodeParams( + types: String[]! + values: String[]! + connection: Ethereum_Connection +): String! +``` + +### estimateContractCallGas + +```graphql +estimateContractCallGas( + address: String! + method: String! + args: String[] + options: Ethereum_TxOptions + connection: Ethereum_Connection +): BigInt! +``` + +### estimateEip1559Fees + +```graphql +estimateEip1559Fees( + connection: Ethereum_Connection +): Ethereum_Eip1559FeesEstimate! +``` + +### estimateTransactionGas + +```graphql +estimateTransactionGas( + tx: Ethereum_TxRequest! + connection: Ethereum_Connection +): BigInt! +``` + +### getBalance + +```graphql +getBalance( + address: String! + blockTag: BigInt + connection: Ethereum_Connection +): BigInt! +``` + +### getChainId + +```graphql +getChainId( + connection: Ethereum_Connection +): String! +``` + +### getGasPrice + +```graphql +getGasPrice( + connection: Ethereum_Connection +): BigInt! +``` + +### getSignerAddress + +```graphql +getSignerAddress( + connection: Ethereum_Connection +): String! +``` + +### getSignerBalance + +```graphql +getSignerBalance( + blockTag: BigInt + connection: Ethereum_Connection +): BigInt! +``` + +### getSignerTransactionCount + +```graphql +getSignerTransactionCount( + blockTag: BigInt + connection: Ethereum_Connection +): BigInt! +``` + +### sendRpc + +```graphql +sendRpc( + method: String! + params: String[]! + connection: Ethereum_Connection +): String! +``` + +### sendTransaction + +```graphql +sendTransaction( + tx: Ethereum_TxRequest! + connection: Ethereum_Connection +): Ethereum_TxResponse! +``` + +### sendTransactionAndWait + +```graphql +sendTransactionAndWait( + tx: Ethereum_TxRequest! + connection: Ethereum_Connection +): Ethereum_TxReceipt! +``` + +### signMessage + +```graphql +signMessage( + message: String! + connection: Ethereum_Connection +): String! +``` + +### signMessageBytes + +```graphql +signMessageBytes( + bytes: Bytes! + connection: Ethereum_Connection +): String! +``` + +### toEth + +```graphql +toEth( + wei: String! +): String! +``` + +### toWei + +```graphql +toWei( + eth: String! +): String! +``` + diff --git a/packages/test-cases/cases/cli/docgen/004-app/docs/Ethereum_objects.md b/packages/test-cases/cases/cli/docgen/004-app/docs/Ethereum_objects.md new file mode 100644 index 0000000000..0bee987edc --- /dev/null +++ b/packages/test-cases/cases/cli/docgen/004-app/docs/Ethereum_objects.md @@ -0,0 +1,149 @@ +--- +id: Ethereum_objects +title: Ethereum Object Types +sidebar_position: 2 +--- + + +### Ethereum_AccessItem + +```graphql +type Ethereum_AccessItem { + address: String! + storageKeys: String[]! +} +``` + +### Ethereum_Connection + +```graphql +type Ethereum_Connection { + node: String + networkNameOrChainId: String +} +``` + +### Ethereum_Eip1559FeesEstimate + +```graphql +type Ethereum_Eip1559FeesEstimate { + maxFeePerGas: BigInt! + maxPriorityFeePerGas: BigInt! +} +``` + +### Ethereum_Log + +```graphql +type Ethereum_Log { + blockNumber: BigInt! + blockHash: String! + transactionIndex: UInt32! + removed: Boolean! + address: String! + data: String! + topics: String[]! + transactionHash: String! + logIndex: UInt32! +} +``` + +### Ethereum_StaticTxResult + +```graphql +type Ethereum_StaticTxResult { + result: String! + error: Boolean! +} +``` + +### Ethereum_TxOptions + +```graphql +type Ethereum_TxOptions { + gasLimit: BigInt # Gas supplied for the transaction + maxFeePerGas: BigInt # The max total fee to pay per unit of gas. +The difference between maxFeePerGas and baseFeePerGas + maxPriorityFeePerGas is “refunded” to the user. +This property is ignored when gasPrice is not null. + maxPriorityFeePerGas: BigInt # The gas price paid is baseFeePerGas + maxPriorityFeePerGas. +The difference between maxFeePerGas and baseFeePerGas + maxPriorityFeePerGas is “refunded” to the user. +This property is ignored when gasPrice is not null. + gasPrice: BigInt # The gas price for legacy transactions. +If this property is not null, a legacy transaction will be sent and maxFeePerGas and maxPriorityFeePerGas will be ignored. + value: BigInt # Ether value sent with transaction + nonce: UInt32 # Override default nonce +} +``` + +### Ethereum_TxReceipt + +```graphql +type Ethereum_TxReceipt { + to: String! + from: String! + contractAddress: String! + transactionIndex: UInt32! + root: String + gasUsed: BigInt! + logsBloom: String! + transactionHash: String! + logs: Ethereum_Log[]! + blockNumber: BigInt! + blockHash: String! + confirmations: UInt32! + cumulativeGasUsed: BigInt! + effectiveGasPrice: BigInt! + type: UInt32! + status: UInt32 +} +``` + +### Ethereum_TxRequest + +```graphql +type Ethereum_TxRequest { + to: String + from: String + data: String + type: UInt32 + chainId: BigInt + accessList: Ethereum_AccessItem[] + gasLimit: BigInt # Gas supplied for the transaction + maxFeePerGas: BigInt # The max total fee to pay per unit of gas. +The difference between maxFeePerGas and baseFeePerGas + maxPriorityFeePerGas is “refunded” to the user. +This property is ignored when gasPrice is not null. + maxPriorityFeePerGas: BigInt # The gas price paid is baseFeePerGas + maxPriorityFeePerGas. +The difference between maxFeePerGas and baseFeePerGas + maxPriorityFeePerGas is “refunded” to the user. +This property is ignored when gasPrice is not null. + gasPrice: BigInt # The gas price for legacy transactions. +If this property is not null, a legacy transaction will be sent and maxFeePerGas and maxPriorityFeePerGas will be ignored. + value: BigInt # Ether value sent with transaction + nonce: UInt32 # Override default nonce +} +``` + +### Ethereum_TxResponse + +```graphql +type Ethereum_TxResponse { + hash: String! + to: String + from: String! + nonce: UInt32! + gasLimit: BigInt! + maxFeePerGas: BigInt + maxPriorityFeePerGas: BigInt + gasPrice: BigInt + value: BigInt! + chainId: BigInt! + blockNumber: BigInt + blockHash: String + timestamp: UInt32 + r: String + s: String + v: UInt32 + type: UInt32 + accessList: Ethereum_AccessItem[] +} +``` + diff --git a/packages/test-cases/cases/cli/docgen/004-app/docs/Logger_enums.md b/packages/test-cases/cases/cli/docgen/004-app/docs/Logger_enums.md new file mode 100644 index 0000000000..c4cac40698 --- /dev/null +++ b/packages/test-cases/cases/cli/docgen/004-app/docs/Logger_enums.md @@ -0,0 +1,18 @@ +--- +id: Logger_enums +title: Logger Enum Types +sidebar_position: 3 +--- + + +### Logger_Logger_LogLevel + +```graphql +enum Logger_Logger_LogLevel { + DEBUG + INFO + WARN + ERROR +} +``` + diff --git a/packages/test-cases/cases/cli/docgen/004-app/docs/Logger_module.md b/packages/test-cases/cases/cli/docgen/004-app/docs/Logger_module.md new file mode 100644 index 0000000000..c483edc248 --- /dev/null +++ b/packages/test-cases/cases/cli/docgen/004-app/docs/Logger_module.md @@ -0,0 +1,15 @@ +--- +id: Logger_module +title: Logger Module +sidebar_position: 1 +--- + +### log + +```graphql +log( + level: Logger_Logger_LogLevel! + message: String! +): Boolean! +``` + diff --git a/packages/test-cases/cases/cli/docgen/005-wasm/docs/module.md b/packages/test-cases/cases/cli/docgen/005-wasm/docs/module.md new file mode 100644 index 0000000000..a2abb12a0a --- /dev/null +++ b/packages/test-cases/cases/cli/docgen/005-wasm/docs/module.md @@ -0,0 +1,14 @@ +--- +id: module +title: Module +sidebar_position: 1 +--- + +### method + +```graphql +method( + arg: String! +): String! +``` + diff --git a/packages/test-cases/cases/cli/docgen/005-wasm/docs/objects.md b/packages/test-cases/cases/cli/docgen/005-wasm/docs/objects.md new file mode 100644 index 0000000000..656ab28e09 --- /dev/null +++ b/packages/test-cases/cases/cli/docgen/005-wasm/docs/objects.md @@ -0,0 +1,17 @@ +--- +id: objects +title: Object Types +sidebar_position: 2 +--- + + +### Object + +```graphql +type Object { + uint: UInt! + bools: Boolean[]! + bites: Bytes +} +``` + diff --git a/packages/test-cases/cases/cli/docgen/006-plugin/docs/env.md b/packages/test-cases/cases/cli/docgen/006-plugin/docs/env.md new file mode 100644 index 0000000000..277239ca0a --- /dev/null +++ b/packages/test-cases/cases/cli/docgen/006-plugin/docs/env.md @@ -0,0 +1,15 @@ +--- +id: env +title: Env Type +sidebar_position: 4 +--- + + +### Env + +```graphql +type Env { + arg1: String! +} +``` + diff --git a/packages/test-cases/cases/cli/docgen/006-plugin/docs/module.md b/packages/test-cases/cases/cli/docgen/006-plugin/docs/module.md new file mode 100644 index 0000000000..678ec7c901 --- /dev/null +++ b/packages/test-cases/cases/cli/docgen/006-plugin/docs/module.md @@ -0,0 +1,23 @@ +--- +id: module +title: Module +sidebar_position: 1 +--- + +### methodOne + +```graphql +methodOne( + str: String! + optStr: String +): Object! +``` + +### methodTwo + +```graphql +methodTwo( + arg: UInt32! +): String! +``` + diff --git a/packages/test-cases/cases/cli/docgen/006-plugin/docs/objects.md b/packages/test-cases/cases/cli/docgen/006-plugin/docs/objects.md new file mode 100644 index 0000000000..794ce00c0a --- /dev/null +++ b/packages/test-cases/cases/cli/docgen/006-plugin/docs/objects.md @@ -0,0 +1,17 @@ +--- +id: objects +title: Object Types +sidebar_position: 2 +--- + + +### Object + +```graphql +type Object { + u: UInt! + array: Boolean[]! + bytes: Bytes +} +``` + diff --git a/packages/test-cases/cases/cli/docgen/007-docusaurus/docs/enums.md b/packages/test-cases/cases/cli/docgen/007-docusaurus/docs/enums.md new file mode 100644 index 0000000000..f5467760a0 --- /dev/null +++ b/packages/test-cases/cases/cli/docgen/007-docusaurus/docs/enums.md @@ -0,0 +1,16 @@ +--- +id: enums +title: Enum Types +sidebar_position: 3 +--- + + +### test + +```graphql +enum test { + ARG1 + ARG2 +} +``` + diff --git a/packages/test-cases/cases/cli/docgen/007-docusaurus/docs/module.md b/packages/test-cases/cases/cli/docgen/007-docusaurus/docs/module.md new file mode 100644 index 0000000000..d194ca9215 --- /dev/null +++ b/packages/test-cases/cases/cli/docgen/007-docusaurus/docs/module.md @@ -0,0 +1,15 @@ +--- +id: module +title: Module +sidebar_position: 1 +--- + +### method + +```graphql +method( + str: String! + optStr: String +): Object! +``` + diff --git a/packages/test-cases/cases/cli/docgen/007-docusaurus/docs/objects.md b/packages/test-cases/cases/cli/docgen/007-docusaurus/docs/objects.md new file mode 100644 index 0000000000..96a0bbdbc9 --- /dev/null +++ b/packages/test-cases/cases/cli/docgen/007-docusaurus/docs/objects.md @@ -0,0 +1,39 @@ +--- +id: objects +title: Object Types +sidebar_position: 2 +--- + + +### Object + +```graphql +type Object { + u: UInt! + array: Boolean[]! + bytes: Bytes +} +``` + +### Object2 + +_Test Comment_ + +```graphql +type Object2 { + u: UInt! # Test Comment + array: Boolean[]! # Test Comment + bytes: Bytes # Test Comment +} +``` + +### Object3 + +```graphql +type Object3 { + u: UInt! + array: Boolean[]! + bytes: Bytes +} +``` + diff --git a/packages/test-cases/cases/cli/docgen/008-jsdoc/docs/enums.js b/packages/test-cases/cases/cli/docgen/008-jsdoc/docs/enums.js new file mode 100644 index 0000000000..81d229be22 --- /dev/null +++ b/packages/test-cases/cases/cli/docgen/008-jsdoc/docs/enums.js @@ -0,0 +1,10 @@ +/** +* Enum Types +* @module enums +*/ + +/** +* +* @typedef { } module:enums.test +*/ + diff --git a/packages/test-cases/cases/cli/docgen/008-jsdoc/docs/module.js b/packages/test-cases/cases/cli/docgen/008-jsdoc/docs/module.js new file mode 100644 index 0000000000..1cea6bda95 --- /dev/null +++ b/packages/test-cases/cases/cli/docgen/008-jsdoc/docs/module.js @@ -0,0 +1,14 @@ +/** +* Module +* @module module +* +*/ + +/** +* +* @function module:method.method +* @param { String } str +* @param { String | null } optStr +* @returns { Object } +*/ + diff --git a/packages/test-cases/cases/cli/docgen/008-jsdoc/docs/objects.js b/packages/test-cases/cases/cli/docgen/008-jsdoc/docs/objects.js new file mode 100644 index 0000000000..5ebf119cd0 --- /dev/null +++ b/packages/test-cases/cases/cli/docgen/008-jsdoc/docs/objects.js @@ -0,0 +1,32 @@ +/** +* Object Types +* @module objects +*/ + +/** +* +* @typedef {Object} module:objects.Object +* +* @property { UInt } u +* @property { Boolean[] } array +* @property { Bytes } bytes +*/ + +/** +* Test Comment +* @typedef {Object} module:objects.Object2 +* +* @property { UInt } u Test Comment +* @property { Boolean[] } array Test Comment +* @property { Bytes } bytes Test Comment +*/ + +/** +* +* @typedef {Object} module:objects.Object3 +* +* @property { UInt } u +* @property { Boolean[] } array +* @property { Bytes } bytes +*/ + diff --git a/packages/test-cases/cases/cli/docgen/009-schema/docs/generated-schema.graphql b/packages/test-cases/cases/cli/docgen/009-schema/docs/generated-schema.graphql new file mode 100644 index 0000000000..398f33cac6 --- /dev/null +++ b/packages/test-cases/cases/cli/docgen/009-schema/docs/generated-schema.graphql @@ -0,0 +1,436 @@ +### Polywrap Header START ### +scalar UInt +scalar UInt8 +scalar UInt16 +scalar UInt32 +scalar Int +scalar Int8 +scalar Int16 +scalar Int32 +scalar Bytes +scalar BigInt +scalar BigNumber +scalar JSON +scalar Map + +directive @imported( + uri: String! + namespace: String! + nativeType: String! +) on OBJECT | ENUM + +directive @imports( + types: [String!]! +) on OBJECT + +directive @capability( + type: String! + uri: String! + namespace: String! +) repeatable on OBJECT + +directive @enabled_interface on OBJECT + +directive @annotate(type: String!) on FIELD + +directive @env(required: Boolean!) on FIELD_DEFINITION + +### Polywrap Header END ### + +type Module @imports( + types: [ + "Ethereum_Module", + "Ethereum_Connection", + "Ethereum_TxOptions", + "Ethereum_StaticTxResult", + "Ethereum_Eip1559FeesEstimate", + "Ethereum_TxRequest", + "Ethereum_AccessItem", + "Ethereum_TxReceipt", + "Ethereum_Log", + "Ethereum_TxResponse" + ] +) { + method( + str: String! + optStr: String + ): Object! +} + +type Object { + u: UInt! + array: [Boolean!]! + bytes: Bytes +} + +""" +Test Comment +""" +type Object2 { + """ + Test Comment + """ + u: UInt! + """ + Test Comment + """ + array: [Boolean!]! + """ + Test Comment + """ + bytes: Bytes +} + +type Object3 { + u: UInt! + array: [Boolean!]! + bytes: Bytes +} + +enum test { + ARG1 + ARG2 +} + +### Imported Modules START ### + +type Ethereum_Module @imported( + uri: "ens/wraps.eth:ethereum@1.0.0", + namespace: "Ethereum", + nativeType: "Module" +) { + getChainId( + connection: Ethereum_Connection + ): String! + + callContractView( + address: String! + method: String! + args: [String!] + connection: Ethereum_Connection + ): String! + + callContractStatic( + address: String! + method: String! + args: [String!] + options: Ethereum_TxOptions + connection: Ethereum_Connection + ): Ethereum_StaticTxResult! + + encodeParams( + types: [String!]! + values: [String!]! + connection: Ethereum_Connection + ): String! + + encodeFunction( + method: String! + args: [String!] + connection: Ethereum_Connection + ): String! + + decodeFunction( + method: String! + data: String! + connection: Ethereum_Connection + ): [String!]! + + getSignerAddress( + connection: Ethereum_Connection + ): String! + + getSignerBalance( + blockTag: BigInt + connection: Ethereum_Connection + ): BigInt! + + getBalance( + address: String! + blockTag: BigInt + connection: Ethereum_Connection + ): BigInt! + + getGasPrice( + connection: Ethereum_Connection + ): BigInt! + + estimateEip1559Fees( + connection: Ethereum_Connection + ): Ethereum_Eip1559FeesEstimate! + + sendRpc( + method: String! + params: [String!]! + connection: Ethereum_Connection + ): String! + + getSignerTransactionCount( + blockTag: BigInt + connection: Ethereum_Connection + ): BigInt! + + checkAddress( + address: String! + connection: Ethereum_Connection + ): Boolean! + + toWei( + eth: String! + ): String! + + toEth( + wei: String! + ): String! + + estimateTransactionGas( + tx: Ethereum_TxRequest! + connection: Ethereum_Connection + ): BigInt! + + awaitTransaction( + txHash: String! + connection: Ethereum_Connection + ): Ethereum_TxReceipt! + + sendTransaction( + tx: Ethereum_TxRequest! + connection: Ethereum_Connection + ): Ethereum_TxResponse! + + sendTransactionAndWait( + tx: Ethereum_TxRequest! + connection: Ethereum_Connection + ): Ethereum_TxReceipt! + + deployContract( + abi: String! + bytecode: String! + args: [String!] + options: Ethereum_TxOptions + connection: Ethereum_Connection + ): String! + + estimateContractCallGas( + address: String! + method: String! + args: [String!] + options: Ethereum_TxOptions + connection: Ethereum_Connection + ): BigInt! + + callContractMethod( + address: String! + method: String! + args: [String!] + options: Ethereum_TxOptions + connection: Ethereum_Connection + ): Ethereum_TxResponse! + + callContractMethodAndWait( + address: String! + method: String! + args: [String!] + options: Ethereum_TxOptions + connection: Ethereum_Connection + ): Ethereum_TxReceipt! + + signMessage( + message: String! + connection: Ethereum_Connection + ): String! + + signMessageBytes( + bytes: Bytes! + connection: Ethereum_Connection + ): String! +} + +### Imported Modules END ### + +### Imported Objects START ### + +type Ethereum_Connection @imported( + uri: "ens/wraps.eth:ethereum@1.0.0", + namespace: "Ethereum", + nativeType: "Connection" +) { + node: String + networkNameOrChainId: String +} + +type Ethereum_TxOptions @imported( + uri: "ens/wraps.eth:ethereum@1.0.0", + namespace: "Ethereum", + nativeType: "TxOptions" +) { + """ + Gas supplied for the transaction + """ + gasLimit: BigInt + """ + The max total fee to pay per unit of gas. +The difference between maxFeePerGas and baseFeePerGas + maxPriorityFeePerGas is “refunded” to the user. +This property is ignored when gasPrice is not null. + """ + maxFeePerGas: BigInt + """ + The gas price paid is baseFeePerGas + maxPriorityFeePerGas. +The difference between maxFeePerGas and baseFeePerGas + maxPriorityFeePerGas is “refunded” to the user. +This property is ignored when gasPrice is not null. + """ + maxPriorityFeePerGas: BigInt + """ + The gas price for legacy transactions. +If this property is not null, a legacy transaction will be sent and maxFeePerGas and maxPriorityFeePerGas will be ignored. + """ + gasPrice: BigInt + """ + Ether value sent with transaction + """ + value: BigInt + """ + Override default nonce + """ + nonce: UInt32 +} + +type Ethereum_StaticTxResult @imported( + uri: "ens/wraps.eth:ethereum@1.0.0", + namespace: "Ethereum", + nativeType: "StaticTxResult" +) { + result: String! + error: Boolean! +} + +type Ethereum_Eip1559FeesEstimate @imported( + uri: "ens/wraps.eth:ethereum@1.0.0", + namespace: "Ethereum", + nativeType: "Eip1559FeesEstimate" +) { + maxFeePerGas: BigInt! + maxPriorityFeePerGas: BigInt! +} + +type Ethereum_TxRequest @imported( + uri: "ens/wraps.eth:ethereum@1.0.0", + namespace: "Ethereum", + nativeType: "TxRequest" +) { + to: String + from: String + data: String + type: UInt32 + chainId: BigInt + accessList: [Ethereum_AccessItem!] + """ + Gas supplied for the transaction + """ + gasLimit: BigInt + """ + The max total fee to pay per unit of gas. +The difference between maxFeePerGas and baseFeePerGas + maxPriorityFeePerGas is “refunded” to the user. +This property is ignored when gasPrice is not null. + """ + maxFeePerGas: BigInt + """ + The gas price paid is baseFeePerGas + maxPriorityFeePerGas. +The difference between maxFeePerGas and baseFeePerGas + maxPriorityFeePerGas is “refunded” to the user. +This property is ignored when gasPrice is not null. + """ + maxPriorityFeePerGas: BigInt + """ + The gas price for legacy transactions. +If this property is not null, a legacy transaction will be sent and maxFeePerGas and maxPriorityFeePerGas will be ignored. + """ + gasPrice: BigInt + """ + Ether value sent with transaction + """ + value: BigInt + """ + Override default nonce + """ + nonce: UInt32 +} + +type Ethereum_AccessItem @imported( + uri: "ens/wraps.eth:ethereum@1.0.0", + namespace: "Ethereum", + nativeType: "AccessItem" +) { + address: String! + storageKeys: [String!]! +} + +type Ethereum_TxReceipt @imported( + uri: "ens/wraps.eth:ethereum@1.0.0", + namespace: "Ethereum", + nativeType: "TxReceipt" +) { + to: String! + from: String! + contractAddress: String! + transactionIndex: UInt32! + root: String + gasUsed: BigInt! + logsBloom: String! + transactionHash: String! + logs: [Ethereum_Log!]! + blockNumber: BigInt! + blockHash: String! + confirmations: UInt32! + cumulativeGasUsed: BigInt! + effectiveGasPrice: BigInt! + type: UInt32! + status: UInt32 +} + +type Ethereum_Log @imported( + uri: "ens/wraps.eth:ethereum@1.0.0", + namespace: "Ethereum", + nativeType: "Log" +) { + blockNumber: BigInt! + blockHash: String! + transactionIndex: UInt32! + removed: Boolean! + address: String! + data: String! + topics: [String!]! + transactionHash: String! + logIndex: UInt32! +} + +type Ethereum_TxResponse @imported( + uri: "ens/wraps.eth:ethereum@1.0.0", + namespace: "Ethereum", + nativeType: "TxResponse" +) { + hash: String! + to: String + from: String! + nonce: UInt32! + gasLimit: BigInt! + maxFeePerGas: BigInt + maxPriorityFeePerGas: BigInt + gasPrice: BigInt + value: BigInt! + chainId: BigInt! + blockNumber: BigInt + blockHash: String + timestamp: UInt32 + r: String + s: String + v: UInt32 + type: UInt32 + accessList: [Ethereum_AccessItem!] +} + +### Imported Objects END ### + +### Imported Envs START ### + +### Imported Envs END ### + From 1258378dd7f4321a1260235b70aea77d4143217a Mon Sep 17 00:00:00 2001 From: Niraj Kamdar Date: Thu, 13 Jul 2023 00:09:49 +0800 Subject: [PATCH 50/65] feat: add property deps transformer TODO: use this in bindings --- .../src/bindings/golang/transforms/index.ts | 1 + .../golang/transforms/propertyDeps.ts | 207 ++++++++++++++++++ .../bind/src/bindings/golang/wasm/index.ts | 2 + 3 files changed, 210 insertions(+) create mode 100644 packages/schema/bind/src/bindings/golang/transforms/index.ts create mode 100644 packages/schema/bind/src/bindings/golang/transforms/propertyDeps.ts diff --git a/packages/schema/bind/src/bindings/golang/transforms/index.ts b/packages/schema/bind/src/bindings/golang/transforms/index.ts new file mode 100644 index 0000000000..45b46dccaa --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/transforms/index.ts @@ -0,0 +1 @@ +export * from "./propertyDeps"; diff --git a/packages/schema/bind/src/bindings/golang/transforms/propertyDeps.ts b/packages/schema/bind/src/bindings/golang/transforms/propertyDeps.ts new file mode 100644 index 0000000000..5a6a5d20ba --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/transforms/propertyDeps.ts @@ -0,0 +1,207 @@ +/* eslint-disable @typescript-eslint/naming-convention */ +/* eslint-disable no-useless-escape */ +import { isBaseType, isBuiltInType } from "../types"; + +import { + ImportedModuleDefinition, + ObjectDefinition, + AnyDefinition, + ModuleDefinition, + EnvDefinition, + Abi, + ImportedEnvDefinition, +} from "@polywrap/wrap-manifest-types-js"; +import { AbiTransforms } from "@polywrap/schema-parse"; + +interface PropertyDep { + crate: string; + type: string; + isEnum: boolean; +} + +interface PropertyDepsState { + abiEnvDefinition?: EnvDefinition; + envDefinition?: EnvDefinition; + importedEnvDefinition?: ImportedEnvDefinition; + objectDefinition?: ObjectDefinition; + moduleDefinition?: ModuleDefinition; + importedModuleDefinition?: ImportedModuleDefinition; + propertyDeps?: PropertyDep[]; +} + +export function propertyDeps(): AbiTransforms { + const state: PropertyDepsState = {}; + + return { + enter: { + Abi: (abi: Abi) => { + if (abi.envType) { + state.abiEnvDefinition = abi.envType; + } + return abi; + }, + EnvDefinition: (def: EnvDefinition) => { + state.envDefinition = def; + state.propertyDeps = []; + return def; + }, + ImportedEnvDefinition: (def: ImportedEnvDefinition) => { + state.envDefinition = def; + state.propertyDeps = []; + return def; + }, + ObjectDefinition: (def: ObjectDefinition) => { + state.objectDefinition = def; + state.propertyDeps = []; + return def; + }, + ModuleDefinition: (def: ModuleDefinition) => { + state.moduleDefinition = def; + state.propertyDeps = []; + if (state.abiEnvDefinition) { + state.propertyDeps.push({ + crate: "crate", + type: "Env", + isEnum: false, + }); + } + return def; + }, + ImportedModuleDefinition: (def: ImportedModuleDefinition) => { + state.importedModuleDefinition = def; + state.propertyDeps = []; + return def; + }, + AnyDefinition: (def: AnyDefinition) => { + const appendPropertyDep = ( + rootType: string, + array: PropertyDep[] + ): PropertyDep[] => { + let typeName = def.type; + + if (typeName.indexOf("[") === 0) { + typeName = typeName.replace(/\[|\]|\!|\?/g, ""); + } + + const appendUnique = (item: PropertyDep) => { + if ( + array.findIndex( + (i) => i.crate === item.crate && i.type === item.type + ) === -1 + ) { + array.push(item); + } + }; + + const isKnownType = (name: string) => + isBaseType(name) || isBuiltInType(name) || name === rootType; + + // if type is map and the value is custom, + // we need to add it into property dependency + if (typeName.startsWith("Map<")) { + const valueName = def.map?.object?.type ?? def.map?.enum?.type; + if (valueName && !isKnownType(valueName)) { + appendUnique({ + crate: "crate", + type: valueName, + isEnum: valueName === def.map?.enum?.type, + }); + + return array; + } + + return array; + } + + if (isKnownType(typeName)) { + return array; + } + + appendUnique({ + crate: "crate", + type: typeName, + isEnum: !!def.enum || !!def.array?.enum, + }); + + return array; + }; + + if (state.envDefinition && state.propertyDeps) { + state.propertyDeps = appendPropertyDep( + state.envDefinition.type, + state.propertyDeps + ); + } else if (state.importedEnvDefinition && state.propertyDeps) { + state.propertyDeps = appendPropertyDep( + state.importedEnvDefinition.type, + state.propertyDeps + ); + } else if (state.objectDefinition && state.propertyDeps) { + state.propertyDeps = appendPropertyDep( + state.objectDefinition.type, + state.propertyDeps + ); + } else if (state.moduleDefinition && state.propertyDeps) { + state.propertyDeps = appendPropertyDep( + state.moduleDefinition.type, + state.propertyDeps + ); + } else if (state.importedModuleDefinition && state.propertyDeps) { + state.propertyDeps = appendPropertyDep( + state.importedModuleDefinition.type, + state.propertyDeps + ); + } + + return def; + }, + }, + leave: { + EnvDefinition: (def: EnvDefinition) => { + const propertyDeps = state.propertyDeps; + state.propertyDeps = undefined; + state.envDefinition = undefined; + return { + ...def, + propertyDeps, + }; + }, + ImportedEnvDefinition: (def: ImportedEnvDefinition) => { + const propertyDeps = state.propertyDeps; + state.propertyDeps = undefined; + state.importedEnvDefinition = undefined; + return { + ...def, + propertyDeps, + }; + }, + ObjectDefinition: (def: ObjectDefinition) => { + const propertyDeps = state.propertyDeps; + state.propertyDeps = undefined; + state.objectDefinition = undefined; + return { + ...def, + propertyDeps, + }; + }, + ModuleDefinition: (def: ModuleDefinition) => { + const propertyDeps = state.propertyDeps; + state.propertyDeps = undefined; + state.moduleDefinition = undefined; + return { + ...def, + propertyDeps, + }; + }, + ImportedModuleDefinition: (def: ImportedModuleDefinition) => { + const propertyDeps = state.propertyDeps; + state.propertyDeps = undefined; + state.importedModuleDefinition = undefined; + return { + ...def, + propertyDeps, + }; + }, + }, + }; +} diff --git a/packages/schema/bind/src/bindings/golang/wasm/index.ts b/packages/schema/bind/src/bindings/golang/wasm/index.ts index 4533a4f3c7..bbc85a03e3 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/index.ts +++ b/packages/schema/bind/src/bindings/golang/wasm/index.ts @@ -4,6 +4,7 @@ import { renderTemplates } from "../.."; import { loadSubTemplates } from "../../utils"; import { BindOptions, BindOutput } from "../../.."; import { reservedWordsAS } from "../reservedWords"; +import * as Transforms from "../transforms"; import { Abi, @@ -268,6 +269,7 @@ function applyTransforms(abi: Abi): Abi { extendType(Functions), addFirstLast, toPrefixedGraphQLType, + Transforms.propertyDeps(), ]; for (const transform of transforms) { From 5dea0c37591a7d929723494c35f373fdcd79d5d4 Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Wed, 12 Jul 2023 14:46:25 -0400 Subject: [PATCH 51/65] fix: golang binding transform --- packages/schema/bind/src/bindings/golang/types.ts | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/packages/schema/bind/src/bindings/golang/types.ts b/packages/schema/bind/src/bindings/golang/types.ts index e57c1b9b88..a46ca959d0 100644 --- a/packages/schema/bind/src/bindings/golang/types.ts +++ b/packages/schema/bind/src/bindings/golang/types.ts @@ -16,3 +16,17 @@ export type BaseType = keyof BaseTypes; export function isBaseType(type: string): type is BaseType { return type in types; } + +const builtInTypes = { + BigInt: "BigInt", + BigNumber: "BigNumber", + JSON: "JSON", +}; + +export type BuiltInTypes = typeof builtInTypes; + +export type BuiltInType = keyof BuiltInTypes; + +export function isBuiltInType(type: string): type is BuiltInType { + return type in builtInTypes; +} From 42dafc77f8af6c9babbbed9e2220b8dc40cb1f36 Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Wed, 12 Jul 2023 14:46:39 -0400 Subject: [PATCH 52/65] chore: docgen has been removed --- .../cli/src/__tests__/e2e/p1/help.spec.ts | 1 - .../src/__tests__/e2e/p1/no-command.spec.ts | 1 - .../cli/docgen/001-sanity/docs/module.md | 14 - .../docgen/002-custom-config/docs/module.md | 21 - .../003-custom-manifest-file/docs/module.md | 14 - .../docgen/004-app/docs/Ethereum_module.md | 256 ---------- .../docgen/004-app/docs/Ethereum_objects.md | 149 ------ .../cli/docgen/004-app/docs/Logger_enums.md | 18 - .../cli/docgen/004-app/docs/Logger_module.md | 15 - .../cases/cli/docgen/005-wasm/docs/module.md | 14 - .../cases/cli/docgen/005-wasm/docs/objects.md | 17 - .../cases/cli/docgen/006-plugin/docs/env.md | 15 - .../cli/docgen/006-plugin/docs/module.md | 23 - .../cli/docgen/006-plugin/docs/objects.md | 17 - .../cli/docgen/007-docusaurus/docs/enums.md | 16 - .../cli/docgen/007-docusaurus/docs/module.md | 15 - .../cli/docgen/007-docusaurus/docs/objects.md | 39 -- .../cases/cli/docgen/008-jsdoc/docs/enums.js | 10 - .../cases/cli/docgen/008-jsdoc/docs/module.js | 14 - .../cli/docgen/008-jsdoc/docs/objects.js | 32 -- .../009-schema/docs/generated-schema.graphql | 436 ------------------ yarn.lock | 78 ++-- 22 files changed, 35 insertions(+), 1180 deletions(-) delete mode 100644 packages/test-cases/cases/cli/docgen/001-sanity/docs/module.md delete mode 100644 packages/test-cases/cases/cli/docgen/002-custom-config/docs/module.md delete mode 100644 packages/test-cases/cases/cli/docgen/003-custom-manifest-file/docs/module.md delete mode 100644 packages/test-cases/cases/cli/docgen/004-app/docs/Ethereum_module.md delete mode 100644 packages/test-cases/cases/cli/docgen/004-app/docs/Ethereum_objects.md delete mode 100644 packages/test-cases/cases/cli/docgen/004-app/docs/Logger_enums.md delete mode 100644 packages/test-cases/cases/cli/docgen/004-app/docs/Logger_module.md delete mode 100644 packages/test-cases/cases/cli/docgen/005-wasm/docs/module.md delete mode 100644 packages/test-cases/cases/cli/docgen/005-wasm/docs/objects.md delete mode 100644 packages/test-cases/cases/cli/docgen/006-plugin/docs/env.md delete mode 100644 packages/test-cases/cases/cli/docgen/006-plugin/docs/module.md delete mode 100644 packages/test-cases/cases/cli/docgen/006-plugin/docs/objects.md delete mode 100644 packages/test-cases/cases/cli/docgen/007-docusaurus/docs/enums.md delete mode 100644 packages/test-cases/cases/cli/docgen/007-docusaurus/docs/module.md delete mode 100644 packages/test-cases/cases/cli/docgen/007-docusaurus/docs/objects.md delete mode 100644 packages/test-cases/cases/cli/docgen/008-jsdoc/docs/enums.js delete mode 100644 packages/test-cases/cases/cli/docgen/008-jsdoc/docs/module.js delete mode 100644 packages/test-cases/cases/cli/docgen/008-jsdoc/docs/objects.js delete mode 100644 packages/test-cases/cases/cli/docgen/009-schema/docs/generated-schema.graphql diff --git a/packages/cli/src/__tests__/e2e/p1/help.spec.ts b/packages/cli/src/__tests__/e2e/p1/help.spec.ts index 34e883a3a6..f8d71a857d 100644 --- a/packages/cli/src/__tests__/e2e/p1/help.spec.ts +++ b/packages/cli/src/__tests__/e2e/p1/help.spec.ts @@ -13,7 +13,6 @@ Commands: codegen|g [options] Generate Code For Polywrap Projects create|c Create New Projects deploy|d [options] Deploys Polywrap Projects - docgen|o [options] Generate wrapper documentation infra|i [options] Modular Infrastructure-As-Code Orchestrator manifest|m Inspect & Migrade Polywrap Manifests test|t [options] Execute Tests diff --git a/packages/cli/src/__tests__/e2e/p1/no-command.spec.ts b/packages/cli/src/__tests__/e2e/p1/no-command.spec.ts index 785821b0b4..3db13b855d 100644 --- a/packages/cli/src/__tests__/e2e/p1/no-command.spec.ts +++ b/packages/cli/src/__tests__/e2e/p1/no-command.spec.ts @@ -13,7 +13,6 @@ Commands: codegen|g [options] Generate Code For Polywrap Projects create|c Create New Projects deploy|d [options] Deploys Polywrap Projects - docgen|o [options] Generate wrapper documentation infra|i [options] Modular Infrastructure-As-Code Orchestrator manifest|m Inspect & Migrade Polywrap Manifests test|t [options] Execute Tests diff --git a/packages/test-cases/cases/cli/docgen/001-sanity/docs/module.md b/packages/test-cases/cases/cli/docgen/001-sanity/docs/module.md deleted file mode 100644 index a2abb12a0a..0000000000 --- a/packages/test-cases/cases/cli/docgen/001-sanity/docs/module.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -id: module -title: Module -sidebar_position: 1 ---- - -### method - -```graphql -method( - arg: String! -): String! -``` - diff --git a/packages/test-cases/cases/cli/docgen/002-custom-config/docs/module.md b/packages/test-cases/cases/cli/docgen/002-custom-config/docs/module.md deleted file mode 100644 index 46bf7e0d15..0000000000 --- a/packages/test-cases/cases/cli/docgen/002-custom-config/docs/module.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: module -title: Module -sidebar_position: 1 ---- - -### deployContract - -```graphql -deployContract( -): String! -``` - -### method - -```graphql -method( - arg: String! -): String! -``` - diff --git a/packages/test-cases/cases/cli/docgen/003-custom-manifest-file/docs/module.md b/packages/test-cases/cases/cli/docgen/003-custom-manifest-file/docs/module.md deleted file mode 100644 index a2abb12a0a..0000000000 --- a/packages/test-cases/cases/cli/docgen/003-custom-manifest-file/docs/module.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -id: module -title: Module -sidebar_position: 1 ---- - -### method - -```graphql -method( - arg: String! -): String! -``` - diff --git a/packages/test-cases/cases/cli/docgen/004-app/docs/Ethereum_module.md b/packages/test-cases/cases/cli/docgen/004-app/docs/Ethereum_module.md deleted file mode 100644 index 30ec3c9c04..0000000000 --- a/packages/test-cases/cases/cli/docgen/004-app/docs/Ethereum_module.md +++ /dev/null @@ -1,256 +0,0 @@ ---- -id: Ethereum_module -title: Ethereum Module -sidebar_position: 1 ---- - -### awaitTransaction - -```graphql -awaitTransaction( - txHash: String! - connection: Ethereum_Connection -): Ethereum_TxReceipt! -``` - -### callContractMethod - -```graphql -callContractMethod( - address: String! - method: String! - args: String[] - options: Ethereum_TxOptions - connection: Ethereum_Connection -): Ethereum_TxResponse! -``` - -### callContractMethodAndWait - -```graphql -callContractMethodAndWait( - address: String! - method: String! - args: String[] - options: Ethereum_TxOptions - connection: Ethereum_Connection -): Ethereum_TxReceipt! -``` - -### callContractStatic - -```graphql -callContractStatic( - address: String! - method: String! - args: String[] - options: Ethereum_TxOptions - connection: Ethereum_Connection -): Ethereum_StaticTxResult! -``` - -### callContractView - -```graphql -callContractView( - address: String! - method: String! - args: String[] - connection: Ethereum_Connection -): String! -``` - -### checkAddress - -```graphql -checkAddress( - address: String! - connection: Ethereum_Connection -): Boolean! -``` - -### decodeFunction - -```graphql -decodeFunction( - method: String! - data: String! - connection: Ethereum_Connection -): String[]! -``` - -### deployContract - -```graphql -deployContract( - abi: String! - bytecode: String! - args: String[] - options: Ethereum_TxOptions - connection: Ethereum_Connection -): String! -``` - -### encodeFunction - -```graphql -encodeFunction( - method: String! - args: String[] - connection: Ethereum_Connection -): String! -``` - -### encodeParams - -```graphql -encodeParams( - types: String[]! - values: String[]! - connection: Ethereum_Connection -): String! -``` - -### estimateContractCallGas - -```graphql -estimateContractCallGas( - address: String! - method: String! - args: String[] - options: Ethereum_TxOptions - connection: Ethereum_Connection -): BigInt! -``` - -### estimateEip1559Fees - -```graphql -estimateEip1559Fees( - connection: Ethereum_Connection -): Ethereum_Eip1559FeesEstimate! -``` - -### estimateTransactionGas - -```graphql -estimateTransactionGas( - tx: Ethereum_TxRequest! - connection: Ethereum_Connection -): BigInt! -``` - -### getBalance - -```graphql -getBalance( - address: String! - blockTag: BigInt - connection: Ethereum_Connection -): BigInt! -``` - -### getChainId - -```graphql -getChainId( - connection: Ethereum_Connection -): String! -``` - -### getGasPrice - -```graphql -getGasPrice( - connection: Ethereum_Connection -): BigInt! -``` - -### getSignerAddress - -```graphql -getSignerAddress( - connection: Ethereum_Connection -): String! -``` - -### getSignerBalance - -```graphql -getSignerBalance( - blockTag: BigInt - connection: Ethereum_Connection -): BigInt! -``` - -### getSignerTransactionCount - -```graphql -getSignerTransactionCount( - blockTag: BigInt - connection: Ethereum_Connection -): BigInt! -``` - -### sendRpc - -```graphql -sendRpc( - method: String! - params: String[]! - connection: Ethereum_Connection -): String! -``` - -### sendTransaction - -```graphql -sendTransaction( - tx: Ethereum_TxRequest! - connection: Ethereum_Connection -): Ethereum_TxResponse! -``` - -### sendTransactionAndWait - -```graphql -sendTransactionAndWait( - tx: Ethereum_TxRequest! - connection: Ethereum_Connection -): Ethereum_TxReceipt! -``` - -### signMessage - -```graphql -signMessage( - message: String! - connection: Ethereum_Connection -): String! -``` - -### signMessageBytes - -```graphql -signMessageBytes( - bytes: Bytes! - connection: Ethereum_Connection -): String! -``` - -### toEth - -```graphql -toEth( - wei: String! -): String! -``` - -### toWei - -```graphql -toWei( - eth: String! -): String! -``` - diff --git a/packages/test-cases/cases/cli/docgen/004-app/docs/Ethereum_objects.md b/packages/test-cases/cases/cli/docgen/004-app/docs/Ethereum_objects.md deleted file mode 100644 index 0bee987edc..0000000000 --- a/packages/test-cases/cases/cli/docgen/004-app/docs/Ethereum_objects.md +++ /dev/null @@ -1,149 +0,0 @@ ---- -id: Ethereum_objects -title: Ethereum Object Types -sidebar_position: 2 ---- - - -### Ethereum_AccessItem - -```graphql -type Ethereum_AccessItem { - address: String! - storageKeys: String[]! -} -``` - -### Ethereum_Connection - -```graphql -type Ethereum_Connection { - node: String - networkNameOrChainId: String -} -``` - -### Ethereum_Eip1559FeesEstimate - -```graphql -type Ethereum_Eip1559FeesEstimate { - maxFeePerGas: BigInt! - maxPriorityFeePerGas: BigInt! -} -``` - -### Ethereum_Log - -```graphql -type Ethereum_Log { - blockNumber: BigInt! - blockHash: String! - transactionIndex: UInt32! - removed: Boolean! - address: String! - data: String! - topics: String[]! - transactionHash: String! - logIndex: UInt32! -} -``` - -### Ethereum_StaticTxResult - -```graphql -type Ethereum_StaticTxResult { - result: String! - error: Boolean! -} -``` - -### Ethereum_TxOptions - -```graphql -type Ethereum_TxOptions { - gasLimit: BigInt # Gas supplied for the transaction - maxFeePerGas: BigInt # The max total fee to pay per unit of gas. -The difference between maxFeePerGas and baseFeePerGas + maxPriorityFeePerGas is “refunded” to the user. -This property is ignored when gasPrice is not null. - maxPriorityFeePerGas: BigInt # The gas price paid is baseFeePerGas + maxPriorityFeePerGas. -The difference between maxFeePerGas and baseFeePerGas + maxPriorityFeePerGas is “refunded” to the user. -This property is ignored when gasPrice is not null. - gasPrice: BigInt # The gas price for legacy transactions. -If this property is not null, a legacy transaction will be sent and maxFeePerGas and maxPriorityFeePerGas will be ignored. - value: BigInt # Ether value sent with transaction - nonce: UInt32 # Override default nonce -} -``` - -### Ethereum_TxReceipt - -```graphql -type Ethereum_TxReceipt { - to: String! - from: String! - contractAddress: String! - transactionIndex: UInt32! - root: String - gasUsed: BigInt! - logsBloom: String! - transactionHash: String! - logs: Ethereum_Log[]! - blockNumber: BigInt! - blockHash: String! - confirmations: UInt32! - cumulativeGasUsed: BigInt! - effectiveGasPrice: BigInt! - type: UInt32! - status: UInt32 -} -``` - -### Ethereum_TxRequest - -```graphql -type Ethereum_TxRequest { - to: String - from: String - data: String - type: UInt32 - chainId: BigInt - accessList: Ethereum_AccessItem[] - gasLimit: BigInt # Gas supplied for the transaction - maxFeePerGas: BigInt # The max total fee to pay per unit of gas. -The difference between maxFeePerGas and baseFeePerGas + maxPriorityFeePerGas is “refunded” to the user. -This property is ignored when gasPrice is not null. - maxPriorityFeePerGas: BigInt # The gas price paid is baseFeePerGas + maxPriorityFeePerGas. -The difference between maxFeePerGas and baseFeePerGas + maxPriorityFeePerGas is “refunded” to the user. -This property is ignored when gasPrice is not null. - gasPrice: BigInt # The gas price for legacy transactions. -If this property is not null, a legacy transaction will be sent and maxFeePerGas and maxPriorityFeePerGas will be ignored. - value: BigInt # Ether value sent with transaction - nonce: UInt32 # Override default nonce -} -``` - -### Ethereum_TxResponse - -```graphql -type Ethereum_TxResponse { - hash: String! - to: String - from: String! - nonce: UInt32! - gasLimit: BigInt! - maxFeePerGas: BigInt - maxPriorityFeePerGas: BigInt - gasPrice: BigInt - value: BigInt! - chainId: BigInt! - blockNumber: BigInt - blockHash: String - timestamp: UInt32 - r: String - s: String - v: UInt32 - type: UInt32 - accessList: Ethereum_AccessItem[] -} -``` - diff --git a/packages/test-cases/cases/cli/docgen/004-app/docs/Logger_enums.md b/packages/test-cases/cases/cli/docgen/004-app/docs/Logger_enums.md deleted file mode 100644 index c4cac40698..0000000000 --- a/packages/test-cases/cases/cli/docgen/004-app/docs/Logger_enums.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -id: Logger_enums -title: Logger Enum Types -sidebar_position: 3 ---- - - -### Logger_Logger_LogLevel - -```graphql -enum Logger_Logger_LogLevel { - DEBUG - INFO - WARN - ERROR -} -``` - diff --git a/packages/test-cases/cases/cli/docgen/004-app/docs/Logger_module.md b/packages/test-cases/cases/cli/docgen/004-app/docs/Logger_module.md deleted file mode 100644 index c483edc248..0000000000 --- a/packages/test-cases/cases/cli/docgen/004-app/docs/Logger_module.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -id: Logger_module -title: Logger Module -sidebar_position: 1 ---- - -### log - -```graphql -log( - level: Logger_Logger_LogLevel! - message: String! -): Boolean! -``` - diff --git a/packages/test-cases/cases/cli/docgen/005-wasm/docs/module.md b/packages/test-cases/cases/cli/docgen/005-wasm/docs/module.md deleted file mode 100644 index a2abb12a0a..0000000000 --- a/packages/test-cases/cases/cli/docgen/005-wasm/docs/module.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -id: module -title: Module -sidebar_position: 1 ---- - -### method - -```graphql -method( - arg: String! -): String! -``` - diff --git a/packages/test-cases/cases/cli/docgen/005-wasm/docs/objects.md b/packages/test-cases/cases/cli/docgen/005-wasm/docs/objects.md deleted file mode 100644 index 656ab28e09..0000000000 --- a/packages/test-cases/cases/cli/docgen/005-wasm/docs/objects.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -id: objects -title: Object Types -sidebar_position: 2 ---- - - -### Object - -```graphql -type Object { - uint: UInt! - bools: Boolean[]! - bites: Bytes -} -``` - diff --git a/packages/test-cases/cases/cli/docgen/006-plugin/docs/env.md b/packages/test-cases/cases/cli/docgen/006-plugin/docs/env.md deleted file mode 100644 index 277239ca0a..0000000000 --- a/packages/test-cases/cases/cli/docgen/006-plugin/docs/env.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -id: env -title: Env Type -sidebar_position: 4 ---- - - -### Env - -```graphql -type Env { - arg1: String! -} -``` - diff --git a/packages/test-cases/cases/cli/docgen/006-plugin/docs/module.md b/packages/test-cases/cases/cli/docgen/006-plugin/docs/module.md deleted file mode 100644 index 678ec7c901..0000000000 --- a/packages/test-cases/cases/cli/docgen/006-plugin/docs/module.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: module -title: Module -sidebar_position: 1 ---- - -### methodOne - -```graphql -methodOne( - str: String! - optStr: String -): Object! -``` - -### methodTwo - -```graphql -methodTwo( - arg: UInt32! -): String! -``` - diff --git a/packages/test-cases/cases/cli/docgen/006-plugin/docs/objects.md b/packages/test-cases/cases/cli/docgen/006-plugin/docs/objects.md deleted file mode 100644 index 794ce00c0a..0000000000 --- a/packages/test-cases/cases/cli/docgen/006-plugin/docs/objects.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -id: objects -title: Object Types -sidebar_position: 2 ---- - - -### Object - -```graphql -type Object { - u: UInt! - array: Boolean[]! - bytes: Bytes -} -``` - diff --git a/packages/test-cases/cases/cli/docgen/007-docusaurus/docs/enums.md b/packages/test-cases/cases/cli/docgen/007-docusaurus/docs/enums.md deleted file mode 100644 index f5467760a0..0000000000 --- a/packages/test-cases/cases/cli/docgen/007-docusaurus/docs/enums.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -id: enums -title: Enum Types -sidebar_position: 3 ---- - - -### test - -```graphql -enum test { - ARG1 - ARG2 -} -``` - diff --git a/packages/test-cases/cases/cli/docgen/007-docusaurus/docs/module.md b/packages/test-cases/cases/cli/docgen/007-docusaurus/docs/module.md deleted file mode 100644 index d194ca9215..0000000000 --- a/packages/test-cases/cases/cli/docgen/007-docusaurus/docs/module.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -id: module -title: Module -sidebar_position: 1 ---- - -### method - -```graphql -method( - str: String! - optStr: String -): Object! -``` - diff --git a/packages/test-cases/cases/cli/docgen/007-docusaurus/docs/objects.md b/packages/test-cases/cases/cli/docgen/007-docusaurus/docs/objects.md deleted file mode 100644 index 96a0bbdbc9..0000000000 --- a/packages/test-cases/cases/cli/docgen/007-docusaurus/docs/objects.md +++ /dev/null @@ -1,39 +0,0 @@ ---- -id: objects -title: Object Types -sidebar_position: 2 ---- - - -### Object - -```graphql -type Object { - u: UInt! - array: Boolean[]! - bytes: Bytes -} -``` - -### Object2 - -_Test Comment_ - -```graphql -type Object2 { - u: UInt! # Test Comment - array: Boolean[]! # Test Comment - bytes: Bytes # Test Comment -} -``` - -### Object3 - -```graphql -type Object3 { - u: UInt! - array: Boolean[]! - bytes: Bytes -} -``` - diff --git a/packages/test-cases/cases/cli/docgen/008-jsdoc/docs/enums.js b/packages/test-cases/cases/cli/docgen/008-jsdoc/docs/enums.js deleted file mode 100644 index 81d229be22..0000000000 --- a/packages/test-cases/cases/cli/docgen/008-jsdoc/docs/enums.js +++ /dev/null @@ -1,10 +0,0 @@ -/** -* Enum Types -* @module enums -*/ - -/** -* -* @typedef { } module:enums.test -*/ - diff --git a/packages/test-cases/cases/cli/docgen/008-jsdoc/docs/module.js b/packages/test-cases/cases/cli/docgen/008-jsdoc/docs/module.js deleted file mode 100644 index 1cea6bda95..0000000000 --- a/packages/test-cases/cases/cli/docgen/008-jsdoc/docs/module.js +++ /dev/null @@ -1,14 +0,0 @@ -/** -* Module -* @module module -* -*/ - -/** -* -* @function module:method.method -* @param { String } str -* @param { String | null } optStr -* @returns { Object } -*/ - diff --git a/packages/test-cases/cases/cli/docgen/008-jsdoc/docs/objects.js b/packages/test-cases/cases/cli/docgen/008-jsdoc/docs/objects.js deleted file mode 100644 index 5ebf119cd0..0000000000 --- a/packages/test-cases/cases/cli/docgen/008-jsdoc/docs/objects.js +++ /dev/null @@ -1,32 +0,0 @@ -/** -* Object Types -* @module objects -*/ - -/** -* -* @typedef {Object} module:objects.Object -* -* @property { UInt } u -* @property { Boolean[] } array -* @property { Bytes } bytes -*/ - -/** -* Test Comment -* @typedef {Object} module:objects.Object2 -* -* @property { UInt } u Test Comment -* @property { Boolean[] } array Test Comment -* @property { Bytes } bytes Test Comment -*/ - -/** -* -* @typedef {Object} module:objects.Object3 -* -* @property { UInt } u -* @property { Boolean[] } array -* @property { Bytes } bytes -*/ - diff --git a/packages/test-cases/cases/cli/docgen/009-schema/docs/generated-schema.graphql b/packages/test-cases/cases/cli/docgen/009-schema/docs/generated-schema.graphql deleted file mode 100644 index 398f33cac6..0000000000 --- a/packages/test-cases/cases/cli/docgen/009-schema/docs/generated-schema.graphql +++ /dev/null @@ -1,436 +0,0 @@ -### Polywrap Header START ### -scalar UInt -scalar UInt8 -scalar UInt16 -scalar UInt32 -scalar Int -scalar Int8 -scalar Int16 -scalar Int32 -scalar Bytes -scalar BigInt -scalar BigNumber -scalar JSON -scalar Map - -directive @imported( - uri: String! - namespace: String! - nativeType: String! -) on OBJECT | ENUM - -directive @imports( - types: [String!]! -) on OBJECT - -directive @capability( - type: String! - uri: String! - namespace: String! -) repeatable on OBJECT - -directive @enabled_interface on OBJECT - -directive @annotate(type: String!) on FIELD - -directive @env(required: Boolean!) on FIELD_DEFINITION - -### Polywrap Header END ### - -type Module @imports( - types: [ - "Ethereum_Module", - "Ethereum_Connection", - "Ethereum_TxOptions", - "Ethereum_StaticTxResult", - "Ethereum_Eip1559FeesEstimate", - "Ethereum_TxRequest", - "Ethereum_AccessItem", - "Ethereum_TxReceipt", - "Ethereum_Log", - "Ethereum_TxResponse" - ] -) { - method( - str: String! - optStr: String - ): Object! -} - -type Object { - u: UInt! - array: [Boolean!]! - bytes: Bytes -} - -""" -Test Comment -""" -type Object2 { - """ - Test Comment - """ - u: UInt! - """ - Test Comment - """ - array: [Boolean!]! - """ - Test Comment - """ - bytes: Bytes -} - -type Object3 { - u: UInt! - array: [Boolean!]! - bytes: Bytes -} - -enum test { - ARG1 - ARG2 -} - -### Imported Modules START ### - -type Ethereum_Module @imported( - uri: "ens/wraps.eth:ethereum@1.0.0", - namespace: "Ethereum", - nativeType: "Module" -) { - getChainId( - connection: Ethereum_Connection - ): String! - - callContractView( - address: String! - method: String! - args: [String!] - connection: Ethereum_Connection - ): String! - - callContractStatic( - address: String! - method: String! - args: [String!] - options: Ethereum_TxOptions - connection: Ethereum_Connection - ): Ethereum_StaticTxResult! - - encodeParams( - types: [String!]! - values: [String!]! - connection: Ethereum_Connection - ): String! - - encodeFunction( - method: String! - args: [String!] - connection: Ethereum_Connection - ): String! - - decodeFunction( - method: String! - data: String! - connection: Ethereum_Connection - ): [String!]! - - getSignerAddress( - connection: Ethereum_Connection - ): String! - - getSignerBalance( - blockTag: BigInt - connection: Ethereum_Connection - ): BigInt! - - getBalance( - address: String! - blockTag: BigInt - connection: Ethereum_Connection - ): BigInt! - - getGasPrice( - connection: Ethereum_Connection - ): BigInt! - - estimateEip1559Fees( - connection: Ethereum_Connection - ): Ethereum_Eip1559FeesEstimate! - - sendRpc( - method: String! - params: [String!]! - connection: Ethereum_Connection - ): String! - - getSignerTransactionCount( - blockTag: BigInt - connection: Ethereum_Connection - ): BigInt! - - checkAddress( - address: String! - connection: Ethereum_Connection - ): Boolean! - - toWei( - eth: String! - ): String! - - toEth( - wei: String! - ): String! - - estimateTransactionGas( - tx: Ethereum_TxRequest! - connection: Ethereum_Connection - ): BigInt! - - awaitTransaction( - txHash: String! - connection: Ethereum_Connection - ): Ethereum_TxReceipt! - - sendTransaction( - tx: Ethereum_TxRequest! - connection: Ethereum_Connection - ): Ethereum_TxResponse! - - sendTransactionAndWait( - tx: Ethereum_TxRequest! - connection: Ethereum_Connection - ): Ethereum_TxReceipt! - - deployContract( - abi: String! - bytecode: String! - args: [String!] - options: Ethereum_TxOptions - connection: Ethereum_Connection - ): String! - - estimateContractCallGas( - address: String! - method: String! - args: [String!] - options: Ethereum_TxOptions - connection: Ethereum_Connection - ): BigInt! - - callContractMethod( - address: String! - method: String! - args: [String!] - options: Ethereum_TxOptions - connection: Ethereum_Connection - ): Ethereum_TxResponse! - - callContractMethodAndWait( - address: String! - method: String! - args: [String!] - options: Ethereum_TxOptions - connection: Ethereum_Connection - ): Ethereum_TxReceipt! - - signMessage( - message: String! - connection: Ethereum_Connection - ): String! - - signMessageBytes( - bytes: Bytes! - connection: Ethereum_Connection - ): String! -} - -### Imported Modules END ### - -### Imported Objects START ### - -type Ethereum_Connection @imported( - uri: "ens/wraps.eth:ethereum@1.0.0", - namespace: "Ethereum", - nativeType: "Connection" -) { - node: String - networkNameOrChainId: String -} - -type Ethereum_TxOptions @imported( - uri: "ens/wraps.eth:ethereum@1.0.0", - namespace: "Ethereum", - nativeType: "TxOptions" -) { - """ - Gas supplied for the transaction - """ - gasLimit: BigInt - """ - The max total fee to pay per unit of gas. -The difference between maxFeePerGas and baseFeePerGas + maxPriorityFeePerGas is “refunded” to the user. -This property is ignored when gasPrice is not null. - """ - maxFeePerGas: BigInt - """ - The gas price paid is baseFeePerGas + maxPriorityFeePerGas. -The difference between maxFeePerGas and baseFeePerGas + maxPriorityFeePerGas is “refunded” to the user. -This property is ignored when gasPrice is not null. - """ - maxPriorityFeePerGas: BigInt - """ - The gas price for legacy transactions. -If this property is not null, a legacy transaction will be sent and maxFeePerGas and maxPriorityFeePerGas will be ignored. - """ - gasPrice: BigInt - """ - Ether value sent with transaction - """ - value: BigInt - """ - Override default nonce - """ - nonce: UInt32 -} - -type Ethereum_StaticTxResult @imported( - uri: "ens/wraps.eth:ethereum@1.0.0", - namespace: "Ethereum", - nativeType: "StaticTxResult" -) { - result: String! - error: Boolean! -} - -type Ethereum_Eip1559FeesEstimate @imported( - uri: "ens/wraps.eth:ethereum@1.0.0", - namespace: "Ethereum", - nativeType: "Eip1559FeesEstimate" -) { - maxFeePerGas: BigInt! - maxPriorityFeePerGas: BigInt! -} - -type Ethereum_TxRequest @imported( - uri: "ens/wraps.eth:ethereum@1.0.0", - namespace: "Ethereum", - nativeType: "TxRequest" -) { - to: String - from: String - data: String - type: UInt32 - chainId: BigInt - accessList: [Ethereum_AccessItem!] - """ - Gas supplied for the transaction - """ - gasLimit: BigInt - """ - The max total fee to pay per unit of gas. -The difference between maxFeePerGas and baseFeePerGas + maxPriorityFeePerGas is “refunded” to the user. -This property is ignored when gasPrice is not null. - """ - maxFeePerGas: BigInt - """ - The gas price paid is baseFeePerGas + maxPriorityFeePerGas. -The difference between maxFeePerGas and baseFeePerGas + maxPriorityFeePerGas is “refunded” to the user. -This property is ignored when gasPrice is not null. - """ - maxPriorityFeePerGas: BigInt - """ - The gas price for legacy transactions. -If this property is not null, a legacy transaction will be sent and maxFeePerGas and maxPriorityFeePerGas will be ignored. - """ - gasPrice: BigInt - """ - Ether value sent with transaction - """ - value: BigInt - """ - Override default nonce - """ - nonce: UInt32 -} - -type Ethereum_AccessItem @imported( - uri: "ens/wraps.eth:ethereum@1.0.0", - namespace: "Ethereum", - nativeType: "AccessItem" -) { - address: String! - storageKeys: [String!]! -} - -type Ethereum_TxReceipt @imported( - uri: "ens/wraps.eth:ethereum@1.0.0", - namespace: "Ethereum", - nativeType: "TxReceipt" -) { - to: String! - from: String! - contractAddress: String! - transactionIndex: UInt32! - root: String - gasUsed: BigInt! - logsBloom: String! - transactionHash: String! - logs: [Ethereum_Log!]! - blockNumber: BigInt! - blockHash: String! - confirmations: UInt32! - cumulativeGasUsed: BigInt! - effectiveGasPrice: BigInt! - type: UInt32! - status: UInt32 -} - -type Ethereum_Log @imported( - uri: "ens/wraps.eth:ethereum@1.0.0", - namespace: "Ethereum", - nativeType: "Log" -) { - blockNumber: BigInt! - blockHash: String! - transactionIndex: UInt32! - removed: Boolean! - address: String! - data: String! - topics: [String!]! - transactionHash: String! - logIndex: UInt32! -} - -type Ethereum_TxResponse @imported( - uri: "ens/wraps.eth:ethereum@1.0.0", - namespace: "Ethereum", - nativeType: "TxResponse" -) { - hash: String! - to: String - from: String! - nonce: UInt32! - gasLimit: BigInt! - maxFeePerGas: BigInt - maxPriorityFeePerGas: BigInt - gasPrice: BigInt - value: BigInt! - chainId: BigInt! - blockNumber: BigInt - blockHash: String - timestamp: UInt32 - r: String - s: String - v: UInt32 - type: UInt32 - accessList: [Ethereum_AccessItem!] -} - -### Imported Objects END ### - -### Imported Envs START ### - -### Imported Envs END ### - diff --git a/yarn.lock b/yarn.lock index 077a866301..2185460b6b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -113,52 +113,52 @@ dependencies: "@babel/highlight" "^7.22.5" -"@babel/compat-data@^7.22.6": - version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.6.tgz#15606a20341de59ba02cd2fcc5086fcbe73bf544" - integrity sha512-29tfsWTq2Ftu7MXmimyC0C5FDZv5DYxOZkh3XD3+QW4V/BYuv/LyEsjj3c0hqedEaDt6DBfDvexMKU8YevdqFg== +"@babel/compat-data@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.9.tgz#71cdb00a1ce3a329ce4cbec3a44f9fef35669730" + integrity sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ== "@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.7.5": - version "7.22.8" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.8.tgz#386470abe884302db9c82e8e5e87be9e46c86785" - integrity sha512-75+KxFB4CZqYRXjx4NlR4J7yGvKumBuZTmV4NV6v09dVXXkuYVYLT68N6HCzLvfJ+fWCxQsntNzKwwIXL4bHnw== + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.9.tgz#bd96492c68822198f33e8a256061da3cf391f58f" + integrity sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w== dependencies: "@ampproject/remapping" "^2.2.0" "@babel/code-frame" "^7.22.5" - "@babel/generator" "^7.22.7" - "@babel/helper-compilation-targets" "^7.22.6" - "@babel/helper-module-transforms" "^7.22.5" + "@babel/generator" "^7.22.9" + "@babel/helper-compilation-targets" "^7.22.9" + "@babel/helper-module-transforms" "^7.22.9" "@babel/helpers" "^7.22.6" "@babel/parser" "^7.22.7" "@babel/template" "^7.22.5" "@babel/traverse" "^7.22.8" "@babel/types" "^7.22.5" - "@nicolo-ribaudo/semver-v6" "^6.3.3" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.2" + semver "^6.3.1" -"@babel/generator@^7.22.7": - version "7.22.7" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.7.tgz#a6b8152d5a621893f2c9dacf9a4e286d520633d5" - integrity sha512-p+jPjMG+SI8yvIaxGgeW24u7q9+5+TGpZh8/CuB7RhBKd7RCy8FayNEFNNKrNK/eUcY/4ExQqLmyrvBXKsIcwQ== +"@babel/generator@^7.22.7", "@babel/generator@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.9.tgz#572ecfa7a31002fa1de2a9d91621fd895da8493d" + integrity sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw== dependencies: "@babel/types" "^7.22.5" "@jridgewell/gen-mapping" "^0.3.2" "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" -"@babel/helper-compilation-targets@^7.22.6": - version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.6.tgz#e30d61abe9480aa5a83232eb31c111be922d2e52" - integrity sha512-534sYEqWD9VfUm3IPn2SLcH4Q3P86XL+QvqdC7ZsFrzyyPF3T4XGiVghF6PTYNdWg6pXuoqXxNQAhbYeEInTzA== +"@babel/helper-compilation-targets@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz#f9d0a7aaaa7cd32a3f31c9316a69f5a9bcacb892" + integrity sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw== dependencies: - "@babel/compat-data" "^7.22.6" + "@babel/compat-data" "^7.22.9" "@babel/helper-validator-option" "^7.22.5" - "@nicolo-ribaudo/semver-v6" "^6.3.3" browserslist "^4.21.9" lru-cache "^5.1.1" + semver "^6.3.1" "@babel/helper-environment-visitor@^7.22.5": version "7.22.5" @@ -187,19 +187,16 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-module-transforms@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz#0f65daa0716961b6e96b164034e737f60a80d2ef" - integrity sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw== +"@babel/helper-module-transforms@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz#92dfcb1fbbb2bc62529024f72d942a8c97142129" + integrity sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ== dependencies: "@babel/helper-environment-visitor" "^7.22.5" "@babel/helper-module-imports" "^7.22.5" "@babel/helper-simple-access" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" "@babel/helper-validator-identifier" "^7.22.5" - "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.5" - "@babel/types" "^7.22.5" "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.8.0": version "7.22.5" @@ -213,7 +210,7 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-split-export-declaration@^7.22.5", "@babel/helper-split-export-declaration@^7.22.6": +"@babel/helper-split-export-declaration@^7.22.6": version "7.22.6" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== @@ -351,7 +348,7 @@ "@babel/parser" "^7.22.5" "@babel/types" "^7.22.5" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.22.5", "@babel/traverse@^7.22.6", "@babel/traverse@^7.22.8": +"@babel/traverse@^7.1.0", "@babel/traverse@^7.22.6", "@babel/traverse@^7.22.8": version "7.22.8" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.8.tgz#4d4451d31bc34efeae01eac222b514a77aa4000e" integrity sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw== @@ -1858,11 +1855,6 @@ resolved "https://registry.yarnpkg.com/@msgpack/msgpack/-/msgpack-2.7.2.tgz#f34b8aa0c49f0dd55eb7eba577081299cbf3f90b" integrity sha512-rYEi46+gIzufyYUAoHDnRzkWGxajpD9vVXFQ3g1vbjrBm6P7MBmm+s/fqPa46sxa+8FOUdEuRQKaugo5a4JWpw== -"@nicolo-ribaudo/semver-v6@^6.3.3": - version "6.3.3" - resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz#ea6d23ade78a325f7a52750aab1526b02b628c29" - integrity sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg== - "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -3671,9 +3663,9 @@ camelcase@^6.0.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001503: - version "1.0.30001514" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001514.tgz#e2a7e184a23affc9367b7c8d734e7ec4628c1309" - integrity sha512-ENcIpYBmwAAOm/V2cXgM7rZUrKKaqisZl4ZAI520FIkqGXUxJjmaIssbRW5HVVR5tyV6ygTLIm15aU8LUmQSaQ== + version "1.0.30001515" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001515.tgz#418aefeed9d024cd3129bfae0ccc782d4cb8f12b" + integrity sha512-eEFDwUOZbE24sb+Ecsx3+OvNETqjWIdabMy52oOkIgcUtAsQifjUG9q4U9dgTHJM2mfk4uEPxc0+xuFdJ629QA== capture-exit@^2.0.0: version "2.0.0" @@ -4448,9 +4440,9 @@ ecc-jsbn@~0.1.1: safer-buffer "^2.1.0" electron-to-chromium@^1.4.431: - version "1.4.455" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.455.tgz#81fe4353ac970eb971c07088c8da8b7f6280ddc9" - integrity sha512-8tgdX0Odl24LtmLwxotpJCVjIndN559AvaOtd67u+2mo+IDsgsTF580NB+uuDCqsHw8yFg53l5+imFV9Fw3cbA== + version "1.4.457" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.457.tgz#3fdc7b4f97d628ac6b51e8b4b385befb362fe343" + integrity sha512-/g3UyNDmDd6ebeWapmAoiyy+Sy2HyJ+/X8KyvNeHfKRFfHaA2W8oF5fxD5F3tjBDcjpwo0iek6YNgxNXDBoEtA== elliptic@6.5.4: version "6.5.4" @@ -8911,7 +8903,7 @@ semver@7.x, semver@^7.1.1, semver@^7.1.3, semver@^7.2.1, semver@^7.3.2, semver@^ dependencies: lru-cache "^6.0.0" -semver@^6.0.0, semver@^6.3.0: +semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: version "6.3.1" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== From f735dfba5ce9bb6f80166a92c833ce4666fb732f Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Wed, 12 Jul 2023 21:11:26 +0200 Subject: [PATCH 53/65] chore: update to latest docker image --- .../cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts | 2 +- .../build-strategies/wasm/golang/image/Dockerfile.mustache | 2 +- .../defaults/build-strategies/wasm/golang/vm/vm-script.mustache | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts b/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts index 72a532f73b..5ed76e6903 100644 --- a/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts +++ b/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts @@ -46,7 +46,7 @@ const CONFIGS: Record = { "wasm/golang": { defaultIncludes: ["go.mod", "go.sum"], baseImage: "polywrap/vm-base-go", - version: "0.1.2", + version: "0.1.4", }, }; diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/image/Dockerfile.mustache b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/image/Dockerfile.mustache index 4385711874..7f4870de73 100644 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/image/Dockerfile.mustache +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/image/Dockerfile.mustache @@ -1,4 +1,4 @@ -FROM polywrap/vm-base-go:0.1.0 +FROM polywrap/vm-base-go:0.1.4 WORKDIR /project diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/vm-script.mustache b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/vm-script.mustache index 390359e144..715d7b3eb7 100644 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/vm-script.mustache +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/vm-script.mustache @@ -8,4 +8,4 @@ tinygo build -o main.wasm -target wasm-target ./module/wrap/main/main.go rm -rf ./build mkdir ./build -wasm-snip ./main.wasm -o ./build/wrap.wasm -p fd_write clock_time_get args_sizes_get args_get \ No newline at end of file +wasm-snip ./main.wasm -o ./build/wrap.wasm -p fd_write clock_time_get args_sizes_get args_get From d8cae0e5a7b4110232c99420c2ca46bdc4d164d4 Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Wed, 12 Jul 2023 21:12:03 +0200 Subject: [PATCH 54/65] chore: update bindings to latest go-wrap repo --- .../schema/bind/src/bindings/golang/functions.ts | 2 +- .../wasm/templates/env-type/Env%type%-go.mustache | 2 +- .../env-type/Env%type%Serialization-go.mustache | 2 +- .../imported/env-type/Env%type%-go.mustache | 2 +- .../env-type/Env%type%Serialization-go.mustache | 2 +- .../imported/interface-type/%type%-go.mustache | 4 ++-- .../module-type/%type%Serialization-go.mustache | 2 +- .../imported/module-type/%type%Wrapped-go.mustache | 6 +++--- .../imported/object-type/Object%type%-go.mustache | 2 +- .../Object%type%Serialization-go.mustache | 2 +- .../templates/interface-type/%type%-go.mustache | 4 ++-- .../golang/wasm/templates/main/main-go.mustache | 8 ++++---- .../module_wrapped/%type%Serialization-go.mustache | 2 +- .../module_wrapped/%type%Wrapped-go.mustache | 4 ++-- .../templates/object-type/Object%type%-go.mustache | 2 +- .../Object%type%Serialization-go.mustache | 2 +- .../imported/test_import/env_test_import__env.go | 2 +- .../env_test_import__env_serialization.go | 2 +- .../object_test_import__another_object.go | 2 +- ...ct_test_import__another_object_serialization.go | 2 +- .../test_import/object_test_import__object.go | 2 +- .../object_test_import__object_serialization.go | 2 +- .../test_import__module_serialization.go | 2 +- .../test_import/test_import__module_wrapped.go | 8 ++++---- .../output/wasm-go/interfaces/test_import.go | 4 ++-- .../cases/bind/sanity/output/wasm-go/main/main.go | 14 +++++++------- .../wasm-go/module_wrapped/module_serialization.go | 2 +- .../wasm-go/module_wrapped/module_wrapped.go | 6 +++--- .../output/wasm-go/types/object_another_type.go | 2 +- .../types/object_another_type_serialization.go | 2 +- .../wasm-go/types/object_custom_map_value.go | 2 +- .../types/object_custom_map_value_serialization.go | 2 +- .../output/wasm-go/types/object_custom_type.go | 4 ++-- .../types/object_custom_type_serialization.go | 4 ++-- .../bind/sanity/output/wasm-go/types/object_env.go | 2 +- .../wasm-go/types/object_env_serialization.go | 2 +- .../bind/sanity/output/wasm-go/types/objectelse.go | 2 +- .../wasm-go/types/objectelse_serialization.go | 2 +- 38 files changed, 60 insertions(+), 60 deletions(-) diff --git a/packages/schema/bind/src/bindings/golang/functions.ts b/packages/schema/bind/src/bindings/golang/functions.ts index 25fab09a04..9aacbeaf7b 100644 --- a/packages/schema/bind/src/bindings/golang/functions.ts +++ b/packages/schema/bind/src/bindings/golang/functions.ts @@ -103,7 +103,7 @@ export const makeImports: MustacheFn = () => { t = t.trim(); if (t.endsWith("big.Int")) { exist[ - "github.com/polywrap/go-wrap/polywrap/msgpack/big" + "github.com/polywrap/go-wrap/msgpack/big" ] = true; } else if (t.endsWith("fastjson.Value")) { exist["github.com/valyala/fastjson"] = true; diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%-go.mustache index 2fbba933cb..0810ab36de 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%-go.mustache @@ -1,6 +1,6 @@ package types -{{#makeImports}}github.com/polywrap/go-wrap/polywrap/msgpack,{{#properties}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/properties}}{{/makeImports}} +{{#makeImports}}github.com/polywrap/go-wrap/msgpack,{{#properties}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/properties}}{{/makeImports}} type {{#toUpper}}{{type}}{{/toUpper}} struct { {{#stuctProps}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%Serialization-go.mustache index bb107d2031..03f0b548fa 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%Serialization-go.mustache @@ -1,6 +1,6 @@ package types -{{#makeImports}}github.com/polywrap/go-wrap/polywrap/msgpack,{{#properties}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/properties}}{{/makeImports}} +{{#makeImports}}github.com/polywrap/go-wrap/msgpack,{{#properties}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/properties}}{{/makeImports}} func serialize{{#toUpper}}{{type}}{{/toUpper}}(value *{{#toUpper}}{{type}}{{/toUpper}}) []byte { ctx := msgpack.NewContext("Serializing (encoding) env-type: {{#toUpper}}{{type}}{{/toUpper}}") diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%-go.mustache index 9901f3f3a7..3c230b9f9a 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%-go.mustache @@ -1,6 +1,6 @@ package {{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}} {{#makeImports}} - github.com/polywrap/go-wrap/polywrap/msgpack, + github.com/polywrap/go-wrap/msgpack, {{#properties}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}} {{/properties}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%Serialization-go.mustache index 1157ba4df3..0b03fc04e1 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%Serialization-go.mustache @@ -1,6 +1,6 @@ package {{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}} {{#makeImports}} - github.com/polywrap/go-wrap/polywrap/msgpack, + github.com/polywrap/go-wrap/msgpack, {{#properties}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}} {{/properties}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/interface-type/%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/interface-type/%type%-go.mustache index 48534a0418..bc55d77962 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/interface-type/%type%-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/interface-type/%type%-go.mustache @@ -3,7 +3,7 @@ package {{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}} {{#capabilities}} {{#getImplementations}} {{#enabled}} -import "github.com/polywrap/go-wrap/polywrap" +import "github.com/polywrap/go-wrap/wrap" {{/enabled}} {{/getImplementations}} {{/capabilities}} @@ -12,7 +12,7 @@ import "github.com/polywrap/go-wrap/polywrap" {{#getImplementations}} {{#enabled}} func {{#toUpper}}{{namespace}}{{/toUpper}}Implementations() []string { - return polywrap.WrapGetImplementations("{{uri}}") + return wrap.WrapGetImplementations("{{uri}}") } {{/enabled}} {{/getImplementations}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Serialization-go.mustache index 039023a802..fefba92470 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Serialization-go.mustache @@ -1,6 +1,6 @@ package {{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}} {{#makeImports}} - github.com/polywrap/go-wrap/polywrap/msgpack, + github.com/polywrap/go-wrap/msgpack, {{#arguments}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}} {{/arguments}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Wrapped-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Wrapped-go.mustache index 6354293f91..b098e0a36f 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Wrapped-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Wrapped-go.mustache @@ -2,7 +2,7 @@ package {{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}} {{#methods.length}} import ( - "github.com/polywrap/go-wrap/polywrap" + "github.com/polywrap/go-wrap/wrap" ) {{/methods.length}} @@ -15,7 +15,7 @@ func {{#toUpper}}{{type}}{{/toUpper}}{{#toUpper}}{{name}}{{/toUpper}}(args *Args raw []byte data {{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}} ) - raw, err = polywrap.WrapSubinvoke("{{uri}}", "{{name}}", argsBuf) + raw, err = wrap.WrapSubinvoke("{{uri}}", "{{name}}", argsBuf) if err == nil { data = Deserialize{{#toUpper}}{{name}}{{/toUpper}}Result(raw) } @@ -35,7 +35,7 @@ func {{#toUpper}}{{type}}{{/toUpper}}{{#toUpper}}{{name}}{{/toUpper}}(uri string raw []byte data {{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}} ) - raw, err = polywrap.WrapSubinvokeImplementation("{{uri}}", uri, "{{name}}", argsBuf) + raw, err = wrap.WrapSubinvokeImplementation("{{uri}}", uri, "{{name}}", argsBuf) if err == nil { data = Deserialize{{#toUpper}}{{name}}{{/toUpper}}Result(raw) } diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%-go.mustache index 9901f3f3a7..3c230b9f9a 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%-go.mustache @@ -1,6 +1,6 @@ package {{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}} {{#makeImports}} - github.com/polywrap/go-wrap/polywrap/msgpack, + github.com/polywrap/go-wrap/msgpack, {{#properties}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}} {{/properties}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%Serialization-go.mustache index a3c8df5fbb..4620a8e956 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%Serialization-go.mustache @@ -1,6 +1,6 @@ package {{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}} {{#makeImports}} - github.com/polywrap/go-wrap/polywrap/msgpack, + github.com/polywrap/go-wrap/msgpack, {{#properties}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}} {{/properties}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/interface-type/%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/interface-type/%type%-go.mustache index 4e32c4aeea..a3fa1c1a68 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/interface-type/%type%-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/interface-type/%type%-go.mustache @@ -3,7 +3,7 @@ package interfaces {{#capabilities}} {{#getImplementations}} {{#enabled}} -import "github.com/polywrap/go-wrap/polywrap" +import "github.com/polywrap/go-wrap/wrap" {{/enabled}} {{/getImplementations}} {{/capabilities}} @@ -12,7 +12,7 @@ import "github.com/polywrap/go-wrap/polywrap" {{#getImplementations}} {{#enabled}} func {{#toUpper}}{{namespace}}{{/toUpper}}Implementations() []string { - return polywrap.WrapGetImplementations("{{uri}}") + return wrap.WrapGetImplementations("{{uri}}") } {{/enabled}} {{/getImplementations}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/main/main-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/main/main-go.mustache index dfd495835a..583f70dacd 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/main/main-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/main/main-go.mustache @@ -2,21 +2,21 @@ package main import ( "{{goImport}}/module/wrap/module_wrapped" - "github.com/polywrap/go-wrap/polywrap" + "github.com/polywrap/go-wrap/wrap" ) //export _wrap_invoke func _wrap_invoke(methodSize, argsSize, envSize uint32) bool { - args := polywrap.WrapInvokeArgs(methodSize, argsSize) + args := wrap.WrapInvokeArgs(methodSize, argsSize) switch args.Method { {{#moduleType}} {{#methods}} case "{{name}}": - return polywrap.WrapInvoke(args, envSize, module_wrapped.{{#toUpper}}{{name}}{{/toUpper}}Wrapped) + return wrap.WrapInvoke(args, envSize, module_wrapped.{{#toUpper}}{{name}}{{/toUpper}}Wrapped) {{/methods}} {{/moduleType}} default: - return polywrap.WrapInvoke(args, envSize, nil) + return wrap.WrapInvoke(args, envSize, nil) } } diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Serialization-go.mustache index 552612599a..9bb91ba9a8 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Serialization-go.mustache @@ -1,6 +1,6 @@ package module_wrapped {{#makeImports}} - github.com/polywrap/go-wrap/polywrap/msgpack, + github.com/polywrap/go-wrap/msgpack, . {{goImport}}/module/wrap/types, {{#importedTypes}} . {{goImport}}/module/wrap/imported/{{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}}, diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Wrapped-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Wrapped-go.mustache index 24ac51d231..9e19e28d88 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Wrapped-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Wrapped-go.mustache @@ -1,6 +1,6 @@ package module_wrapped {{#makeImports}} - {{#methods}}{{#env}}github.com/polywrap/go-wrap/polywrap,. {{goImport}}/module/wrap/types,{{/env}}{{/methods}} + {{#methods}}{{#env}}github.com/polywrap/go-wrap/wrap,. {{goImport}}/module/wrap/types,{{/env}}{{/methods}} {{goImport}}/module as methods, {{/makeImports}} {{#methods}} @@ -13,7 +13,7 @@ func {{#toUpper}}{{name}}{{/toUpper}}Wrapped(argsBuf []byte, envSize uint32) []b } {{/required}} if envSize > 0 { - envBuf := polywrap.WrapLoadEnv(envSize) + envBuf := wrap.WrapLoadEnv(envSize) env = EnvFromBuffer(envBuf) } {{/env}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%-go.mustache index 6485d72865..e9576bcbc9 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%-go.mustache @@ -1,6 +1,6 @@ package types {{#makeImports}} - github.com/polywrap/go-wrap/polywrap/msgpack, + github.com/polywrap/go-wrap/msgpack, {{#properties}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}} {{/properties}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%Serialization-go.mustache index 0531e1f9a2..b858842c79 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%Serialization-go.mustache @@ -1,6 +1,6 @@ package types {{#makeImports}} - github.com/polywrap/go-wrap/polywrap/msgpack, + github.com/polywrap/go-wrap/msgpack, {{#properties}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}} {{/properties}} diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env.go index fea45b5c0f..81cdbc86bc 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env.go @@ -1,7 +1,7 @@ package test_import import ( - "github.com/polywrap/go-wrap/polywrap/msgpack" + "github.com/polywrap/go-wrap/msgpack" ) type TestImport_Env struct { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env_serialization.go index d4cbc7936e..03532e9d99 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env_serialization.go @@ -1,7 +1,7 @@ package test_import import ( - "github.com/polywrap/go-wrap/polywrap/msgpack" + "github.com/polywrap/go-wrap/msgpack" ) func serializeTestImport_Env(value *TestImport_Env) []byte { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object.go index 027a991bc5..1f524b3ac0 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object.go @@ -1,7 +1,7 @@ package test_import import ( - "github.com/polywrap/go-wrap/polywrap/msgpack" + "github.com/polywrap/go-wrap/msgpack" ) type TestImport_AnotherObject struct { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object_serialization.go index 3cfa4e63db..a92be912ea 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object_serialization.go @@ -1,7 +1,7 @@ package test_import import ( - "github.com/polywrap/go-wrap/polywrap/msgpack" + "github.com/polywrap/go-wrap/msgpack" ) func serializeTestImport_AnotherObject(value *TestImport_AnotherObject) []byte { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object.go index c4c6cafbc6..1df2cf8297 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object.go @@ -1,7 +1,7 @@ package test_import import ( - "github.com/polywrap/go-wrap/polywrap/msgpack" + "github.com/polywrap/go-wrap/msgpack" ) type TestImport_Object struct { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object_serialization.go index f2c7c52ae6..e35e49689b 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object_serialization.go @@ -1,7 +1,7 @@ package test_import import ( - "github.com/polywrap/go-wrap/polywrap/msgpack" + "github.com/polywrap/go-wrap/msgpack" ) func serializeTestImport_Object(value *TestImport_Object) []byte { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_serialization.go index 032f87aa14..d1456a2036 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_serialization.go @@ -1,7 +1,7 @@ package test_import import ( - "github.com/polywrap/go-wrap/polywrap/msgpack" + "github.com/polywrap/go-wrap/msgpack" ) type ArgsImportedMethod struct { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_wrapped.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_wrapped.go index bb1cefafe8..b35afbfa71 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_wrapped.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_wrapped.go @@ -1,7 +1,7 @@ package test_import import ( - "github.com/polywrap/go-wrap/polywrap" + "github.com/polywrap/go-wrap/wrap" ) func MethodImportedMethod(uri string, args *ArgsImportedMethod) (*TestImport_Object, error) { @@ -11,7 +11,7 @@ func MethodImportedMethod(uri string, args *ArgsImportedMethod) (*TestImport_Obj raw []byte data *TestImport_Object ) - raw, err = polywrap.WrapSubinvokeImplementation("testimport.uri.eth", uri, "importedMethod", argsBuf) + raw, err = wrap.WrapSubinvokeImplementation("testimport.uri.eth", uri, "importedMethod", argsBuf) if err == nil { data = DeserializeImportedMethodResult(raw) } @@ -25,7 +25,7 @@ func MethodAnotherMethod(uri string, args *ArgsAnotherMethod) (int32, error) { raw []byte data int32 ) - raw, err = polywrap.WrapSubinvokeImplementation("testimport.uri.eth", uri, "anotherMethod", argsBuf) + raw, err = wrap.WrapSubinvokeImplementation("testimport.uri.eth", uri, "anotherMethod", argsBuf) if err == nil { data = DeserializeAnotherMethodResult(raw) } @@ -39,7 +39,7 @@ func MethodReturnsArrayOfEnums(uri string, args *ArgsReturnsArrayOfEnums) ([]*Te raw []byte data []*TestImport_Enum_Return ) - raw, err = polywrap.WrapSubinvokeImplementation("testimport.uri.eth", uri, "returnsArrayOfEnums", argsBuf) + raw, err = wrap.WrapSubinvokeImplementation("testimport.uri.eth", uri, "returnsArrayOfEnums", argsBuf) if err == nil { data = DeserializeReturnsArrayOfEnumsResult(raw) } diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/interfaces/test_import.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/interfaces/test_import.go index 405f79c9a7..7ae06bfb28 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/interfaces/test_import.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/interfaces/test_import.go @@ -1,7 +1,7 @@ package interfaces -import "github.com/polywrap/go-wrap/polywrap" +import "github.com/polywrap/go-wrap/wrap" func TestImportImplementations() []string { - return polywrap.WrapGetImplementations("testimport.uri.eth") + return wrap.WrapGetImplementations("testimport.uri.eth") } diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/main/main.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/main/main.go index 4c9f9939cf..46bbee1c6d 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/main/main.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/main/main.go @@ -2,23 +2,23 @@ package main import ( "github.com/testorg/testrepo/module/wrap/module_wrapped" - "github.com/polywrap/go-wrap/polywrap" + "github.com/polywrap/go-wrap/wrap" ) //export _wrap_invoke func _wrap_invoke(methodSize, argsSize, envSize uint32) bool { - args := polywrap.WrapInvokeArgs(methodSize, argsSize) + args := wrap.WrapInvokeArgs(methodSize, argsSize) switch args.Method { case "moduleMethod": - return polywrap.WrapInvoke(args, envSize, module_wrapped.ModuleMethodWrapped) + return wrap.WrapInvoke(args, envSize, module_wrapped.ModuleMethodWrapped) case "objectMethod": - return polywrap.WrapInvoke(args, envSize, module_wrapped.ObjectMethodWrapped) + return wrap.WrapInvoke(args, envSize, module_wrapped.ObjectMethodWrapped) case "optionalEnvMethod": - return polywrap.WrapInvoke(args, envSize, module_wrapped.OptionalEnvMethodWrapped) + return wrap.WrapInvoke(args, envSize, module_wrapped.OptionalEnvMethodWrapped) case "if": - return polywrap.WrapInvoke(args, envSize, module_wrapped.IfWrapped) + return wrap.WrapInvoke(args, envSize, module_wrapped.IfWrapped) default: - return polywrap.WrapInvoke(args, envSize, nil) + return wrap.WrapInvoke(args, envSize, nil) } } diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/module_wrapped/module_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/module_wrapped/module_serialization.go index 19b7b664c0..920d1f45b0 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/module_wrapped/module_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/module_wrapped/module_serialization.go @@ -2,7 +2,7 @@ package module_wrapped import ( . "github.com/testorg/testrepo/module/wrap/types" - "github.com/polywrap/go-wrap/polywrap/msgpack" + "github.com/polywrap/go-wrap/msgpack" ) func DeserializeModuleMethodArgs(argsBuf []byte) *MethodArgsModuleMethod { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/module_wrapped/module_wrapped.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/module_wrapped/module_wrapped.go index 69e5da455d..037cab3ab6 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/module_wrapped/module_wrapped.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/module_wrapped/module_wrapped.go @@ -2,7 +2,7 @@ package module_wrapped import ( . "github.com/testorg/testrepo/module/wrap/types" - "github.com/polywrap/go-wrap/polywrap" + "github.com/polywrap/go-wrap/wrap" methods "github.com/testorg/testrepo/module" ) @@ -20,7 +20,7 @@ func ObjectMethodWrapped(argsBuf []byte, envSize uint32) []byte { panic("Environment is not set, and it is required by method 'objectMethod'") } if envSize > 0 { - envBuf := polywrap.WrapLoadEnv(envSize) + envBuf := wrap.WrapLoadEnv(envSize) env = EnvFromBuffer(envBuf) } @@ -33,7 +33,7 @@ func ObjectMethodWrapped(argsBuf []byte, envSize uint32) []byte { func OptionalEnvMethodWrapped(argsBuf []byte, envSize uint32) []byte { var env *Env if envSize > 0 { - envBuf := polywrap.WrapLoadEnv(envSize) + envBuf := wrap.WrapLoadEnv(envSize) env = EnvFromBuffer(envBuf) } diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_another_type.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_another_type.go index 7b41639530..d09cb425a6 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_another_type.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_another_type.go @@ -1,7 +1,7 @@ package types import ( - "github.com/polywrap/go-wrap/polywrap/msgpack" + "github.com/polywrap/go-wrap/msgpack" ) type AnotherType struct { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_another_type_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_another_type_serialization.go index eb860e0ff7..9379d11e42 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_another_type_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_another_type_serialization.go @@ -1,7 +1,7 @@ package types import ( - "github.com/polywrap/go-wrap/polywrap/msgpack" + "github.com/polywrap/go-wrap/msgpack" ) func serializeAnotherType(value *AnotherType) []byte { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value.go index 881760040a..d27437e07f 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value.go @@ -1,7 +1,7 @@ package types import ( - "github.com/polywrap/go-wrap/polywrap/msgpack" + "github.com/polywrap/go-wrap/msgpack" ) type CustomMapValue struct { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value_serialization.go index babbd72f89..056eb66e5d 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value_serialization.go @@ -1,7 +1,7 @@ package types import ( - "github.com/polywrap/go-wrap/polywrap/msgpack" + "github.com/polywrap/go-wrap/msgpack" ) func serializeCustomMapValue(value *CustomMapValue) []byte { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type.go index 280ee1c01d..2b3a0b7050 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type.go @@ -1,8 +1,8 @@ package types import ( - "github.com/polywrap/go-wrap/polywrap/msgpack" - "github.com/polywrap/go-wrap/polywrap/msgpack/big" + "github.com/polywrap/go-wrap/msgpack" + "github.com/polywrap/go-wrap/msgpack/big" "github.com/valyala/fastjson" ) diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go index 7485b1d615..b8b8b230a7 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go @@ -1,8 +1,8 @@ package types import ( - "github.com/polywrap/go-wrap/polywrap/msgpack" - "github.com/polywrap/go-wrap/polywrap/msgpack/big" + "github.com/polywrap/go-wrap/msgpack" + "github.com/polywrap/go-wrap/msgpack/big" "github.com/valyala/fastjson" ) diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_env.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_env.go index 469e63df31..627de4f432 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_env.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_env.go @@ -1,7 +1,7 @@ package types import ( - "github.com/polywrap/go-wrap/polywrap/msgpack" + "github.com/polywrap/go-wrap/msgpack" ) type Env struct { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_env_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_env_serialization.go index abbdb35b71..9d12746234 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_env_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_env_serialization.go @@ -1,7 +1,7 @@ package types import ( - "github.com/polywrap/go-wrap/polywrap/msgpack" + "github.com/polywrap/go-wrap/msgpack" ) func serializeEnv(value *Env) []byte { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse.go index 1bfac78946..23e470aad4 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse.go @@ -1,7 +1,7 @@ package types import ( - "github.com/polywrap/go-wrap/polywrap/msgpack" + "github.com/polywrap/go-wrap/msgpack" ) type Else struct { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse_serialization.go index 0d5add817f..a89c8e047d 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse_serialization.go @@ -1,7 +1,7 @@ package types import ( - "github.com/polywrap/go-wrap/polywrap/msgpack" + "github.com/polywrap/go-wrap/msgpack" ) func serializeElse(value *Else) []byte { From f7184e88dde224c92a95d423b13541ff9b73625d Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Wed, 12 Jul 2023 21:16:21 +0200 Subject: [PATCH 55/65] chore: remove todo --- todo | 7 ------- 1 file changed, 7 deletions(-) delete mode 100644 todo diff --git a/todo b/todo deleted file mode 100644 index a82ed17f37..0000000000 --- a/todo +++ /dev/null @@ -1,7 +0,0 @@ -jordan notes: -- file names w/ '%'? -- objectelse -> object_else.go? Same with enumwhile.go -- create a template project -- missing test-cases? (bignumber, large-types, reserved-words, env-types) -- finish the go-ci workflow -- - setup submodule for wasm/go runtime \ No newline at end of file From fb7bdf7521eda76d6e6ddc8de21e8c9656dff98f Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Wed, 12 Jul 2023 22:45:35 +0200 Subject: [PATCH 56/65] chore: lint fix --- .../cli/src/lib/build-strategies/BuildOverrides.ts | 4 +--- .../cli/src/lib/build-strategies/BuildStrategy.ts | 4 +--- .../build-strategies/strategies/DockerVMStrategy.ts | 5 +---- packages/cli/src/lib/codegen/CodeGenerator.ts | 13 ++++++++----- .../language-overrides/wasm/golang/index.ts | 2 +- .../defaults/language-overrides/wasm/rust/index.ts | 4 ++-- .../schema/bind/src/bindings/golang/functions.ts | 4 +--- packages/schema/bind/src/bindings/golang/types.ts | 1 + .../schema/bind/src/bindings/golang/wasm/index.ts | 4 +++- 9 files changed, 19 insertions(+), 22 deletions(-) diff --git a/packages/cli/src/lib/build-strategies/BuildOverrides.ts b/packages/cli/src/lib/build-strategies/BuildOverrides.ts index 38f0609917..8ba5de7c82 100644 --- a/packages/cli/src/lib/build-strategies/BuildOverrides.ts +++ b/packages/cli/src/lib/build-strategies/BuildOverrides.ts @@ -5,9 +5,7 @@ import path from "path"; import fs from "fs"; export interface BuildOverrides { - validateManifest?: ( - manifest: PolywrapManifest - ) => Promise; + validateManifest?: (manifest: PolywrapManifest) => Promise; sourcesSubDirectory?: string; } diff --git a/packages/cli/src/lib/build-strategies/BuildStrategy.ts b/packages/cli/src/lib/build-strategies/BuildStrategy.ts index 8d521238ab..3792cddc5c 100644 --- a/packages/cli/src/lib/build-strategies/BuildStrategy.ts +++ b/packages/cli/src/lib/build-strategies/BuildStrategy.ts @@ -49,9 +49,7 @@ export abstract class BuildStrategy { // If they do, ensure the manifest if valid before build starts if (this.overrides && this.overrides.validateManifest) { - await this.overrides.validateManifest( - await this.project.getManifest() - ); + await this.overrides.validateManifest(await this.project.getManifest()); } return this.buildSources(); diff --git a/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts b/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts index 5ed76e6903..7ec5c4e895 100644 --- a/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts +++ b/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts @@ -144,10 +144,7 @@ export class DockerVMBuildStrategy extends BuildStrategy { fse.copySync( path.join(manifestDir, sourcesSubDirectory), - path.join( - this._volumePaths.project, - sourcesSubDirectory - ) + path.join(this._volumePaths.project, sourcesSubDirectory) ); const scriptTemplate = fse.readFileSync( diff --git a/packages/cli/src/lib/codegen/CodeGenerator.ts b/packages/cli/src/lib/codegen/CodeGenerator.ts index 1fd3a14da2..46a16e8bf8 100644 --- a/packages/cli/src/lib/codegen/CodeGenerator.ts +++ b/packages/cli/src/lib/codegen/CodeGenerator.ts @@ -16,11 +16,11 @@ import { } from "../project"; import { resetDir } from "../system"; import { SchemaComposer } from "../SchemaComposer"; +import { CodegenOverrides, tryGetCodegenOverrides } from "./CodegenOverrides"; import path from "path"; import { BindLanguage } from "@polywrap/schema-bind"; import { writeDirectorySync } from "@polywrap/os-js"; -import { CodegenOverrides, tryGetCodegenOverrides } from "./CodegenOverrides"; export interface CodeGeneratorConfig { project: Project; @@ -69,7 +69,10 @@ export class CodeGenerator { } } - protected async runCodegen(_: BindLanguage, overrides?: CodegenOverrides): Promise { + protected async runCodegen( + _: BindLanguage, + overrides?: CodegenOverrides + ): Promise { // TODO: move codegen dir overrides into the new "language-overrides" const codegenDir = this._config.codegenDirAbs ? path.relative( @@ -78,9 +81,9 @@ export class CodeGenerator { ) : undefined; - const bindConfig = overrides ? await overrides.getSchemaBindConfig( - this._config.project - ) : {}; + const bindConfig = overrides + ? await overrides.getSchemaBindConfig(this._config.project) + : {}; const abi = await this._config.schemaComposer.getComposedAbis(); const binding = await this._config.project.generateSchemaBindings( diff --git a/packages/cli/src/lib/defaults/language-overrides/wasm/golang/index.ts b/packages/cli/src/lib/defaults/language-overrides/wasm/golang/index.ts index 3c745d1f8a..16f31636c1 100644 --- a/packages/cli/src/lib/defaults/language-overrides/wasm/golang/index.ts +++ b/packages/cli/src/lib/defaults/language-overrides/wasm/golang/index.ts @@ -13,7 +13,7 @@ export function getBuildOverrides(): BuildOverrides { getGoModulePath(manifest); return Promise.resolve(); }, - sourcesSubDirectory: "module" + sourcesSubDirectory: "module", }; } diff --git a/packages/cli/src/lib/defaults/language-overrides/wasm/rust/index.ts b/packages/cli/src/lib/defaults/language-overrides/wasm/rust/index.ts index 656c1c0807..948da95d1a 100644 --- a/packages/cli/src/lib/defaults/language-overrides/wasm/rust/index.ts +++ b/packages/cli/src/lib/defaults/language-overrides/wasm/rust/index.ts @@ -14,6 +14,6 @@ export function getBuildOverrides(): BuildOverrides { return Promise.resolve(); }, - sourcesSubDirectory: "src" - } + sourcesSubDirectory: "src", + }; } diff --git a/packages/schema/bind/src/bindings/golang/functions.ts b/packages/schema/bind/src/bindings/golang/functions.ts index 9aacbeaf7b..11d2d8e32b 100644 --- a/packages/schema/bind/src/bindings/golang/functions.ts +++ b/packages/schema/bind/src/bindings/golang/functions.ts @@ -102,9 +102,7 @@ export const makeImports: MustacheFn = () => { for (let t of types) { t = t.trim(); if (t.endsWith("big.Int")) { - exist[ - "github.com/polywrap/go-wrap/msgpack/big" - ] = true; + exist["github.com/polywrap/go-wrap/msgpack/big"] = true; } else if (t.endsWith("fastjson.Value")) { exist["github.com/valyala/fastjson"] = true; } else if (/([^/\s]+\/)(.*)/.test(t)) { diff --git a/packages/schema/bind/src/bindings/golang/types.ts b/packages/schema/bind/src/bindings/golang/types.ts index a46ca959d0..a205fa65ab 100644 --- a/packages/schema/bind/src/bindings/golang/types.ts +++ b/packages/schema/bind/src/bindings/golang/types.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/naming-convention */ const types = { u8: "u8", u16: "u16", diff --git a/packages/schema/bind/src/bindings/golang/wasm/index.ts b/packages/schema/bind/src/bindings/golang/wasm/index.ts index bbc85a03e3..46e053f322 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/index.ts +++ b/packages/schema/bind/src/bindings/golang/wasm/index.ts @@ -45,7 +45,9 @@ export const generateBinding: GenerateBindingFn = ( const goImport = options.config?.goModuleName; if (!goImport) { - throw Error("wasm/golang bindings requires the config property 'goModuleName' to be set"); + throw Error( + "wasm/golang bindings requires the config property 'goModuleName' to be set" + ); } // Generate object type folders From 4941dc82485cddc5772d5fb21fe6670839d7afd8 Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Wed, 12 Jul 2023 23:26:23 +0200 Subject: [PATCH 57/65] chore: update base-vm-go image version & go-wrap branch --- .../src/lib/build-strategies/strategies/DockerVMStrategy.ts | 2 +- .../build-strategies/wasm/golang/image/Dockerfile.mustache | 2 +- .../cases/cli/build-cmd/wasm/golang/001-sanity/go.mod | 2 +- .../cases/cli/build-cmd/wasm/golang/001-sanity/go.sum | 4 ++-- .../cases/cli/codegen/wasm/008-sanity-golang/go.mod | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts b/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts index 7ec5c4e895..8f7df32b85 100644 --- a/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts +++ b/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts @@ -46,7 +46,7 @@ const CONFIGS: Record = { "wasm/golang": { defaultIncludes: ["go.mod", "go.sum"], baseImage: "polywrap/vm-base-go", - version: "0.1.4", + version: "0.1.5", }, }; diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/image/Dockerfile.mustache b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/image/Dockerfile.mustache index 7f4870de73..08c0ade400 100644 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/image/Dockerfile.mustache +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/image/Dockerfile.mustache @@ -1,4 +1,4 @@ -FROM polywrap/vm-base-go:0.1.4 +FROM polywrap/vm-base-go:0.1.5 WORKDIR /project diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/golang/001-sanity/go.mod b/packages/test-cases/cases/cli/build-cmd/wasm/golang/001-sanity/go.mod index 06586f28bb..ef679eeb1b 100644 --- a/packages/test-cases/cases/cli/build-cmd/wasm/golang/001-sanity/go.mod +++ b/packages/test-cases/cases/cli/build-cmd/wasm/golang/001-sanity/go.mod @@ -2,6 +2,6 @@ module example.com/go-wrap-test go 1.18 -require github.com/polywrap/go-wrap v0.0.0-20230706013513-29691688fe81 +require github.com/polywrap/go-wrap wrap-0.1 require github.com/valyala/fastjson v1.6.3 // indirect diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/golang/001-sanity/go.sum b/packages/test-cases/cases/cli/build-cmd/wasm/golang/001-sanity/go.sum index 4c9c458017..35d9e89726 100644 --- a/packages/test-cases/cases/cli/build-cmd/wasm/golang/001-sanity/go.sum +++ b/packages/test-cases/cases/cli/build-cmd/wasm/golang/001-sanity/go.sum @@ -1,4 +1,4 @@ -github.com/polywrap/go-wrap v0.0.0-20230706013513-29691688fe81 h1:6aeLyP7nvw2xD7rteUCFE+iB/3kvtRoqUuVcLaMLaW0= -github.com/polywrap/go-wrap v0.0.0-20230706013513-29691688fe81/go.mod h1:rxqhIFKUzn/M46+zjnA1RHlCzLGQn2BiLWalezhLj/k= +github.com/polywrap/go-wrap v0.0.0-20230712183729-e3684b1430f1 h1:fhJVAD+8CcssXc7g/F39AQdDHiV3li35mUyHeHp5/Dk= +github.com/polywrap/go-wrap v0.0.0-20230712183729-e3684b1430f1/go.mod h1:rxqhIFKUzn/M46+zjnA1RHlCzLGQn2BiLWalezhLj/k= github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= diff --git a/packages/test-cases/cases/cli/codegen/wasm/008-sanity-golang/go.mod b/packages/test-cases/cases/cli/codegen/wasm/008-sanity-golang/go.mod index 06586f28bb..ef679eeb1b 100644 --- a/packages/test-cases/cases/cli/codegen/wasm/008-sanity-golang/go.mod +++ b/packages/test-cases/cases/cli/codegen/wasm/008-sanity-golang/go.mod @@ -2,6 +2,6 @@ module example.com/go-wrap-test go 1.18 -require github.com/polywrap/go-wrap v0.0.0-20230706013513-29691688fe81 +require github.com/polywrap/go-wrap wrap-0.1 require github.com/valyala/fastjson v1.6.3 // indirect From 7b773464f45c363d1e2f4158d91d235f5709ba44 Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Thu, 13 Jul 2023 01:33:54 +0200 Subject: [PATCH 58/65] chore: fix empty argument serialization --- .../imported/module-type/%type%Serialization-go.mustache | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Serialization-go.mustache index fefba92470..86491f7932 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Serialization-go.mustache @@ -24,6 +24,10 @@ func Serialize{{#toUpper}}{{name}}{{/toUpper}}Args(value *Args{{#toUpper}}{{name func Write{{#toUpper}}{{name}}{{/toUpper}}Args(writer msgpack.Write, value *Args{{#toUpper}}{{name}}{{/toUpper}}) { {{#arguments.length}} writer.WriteMapLength({{arguments.length}}) + {{/arguments.length}} + {{^arguments}} + writer.WriteMapLength(0) + {{/arguments}} {{#arguments}} writer.Context().Push("{{name}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") writer.WriteString("{{name}}") @@ -48,7 +52,6 @@ func Write{{#toUpper}}{{name}}{{/toUpper}}Args(writer msgpack.Write, value *Args {{/enum}} writer.Context().Pop() {{/arguments}} - {{/arguments.length}} } func Deserialize{{#toUpper}}{{name}}{{/toUpper}}Result(argsBuf []byte) {{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}} { From f9e1c4de23be0074e2d8178fb8c3ea08a9190563 Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Thu, 13 Jul 2023 01:49:15 +0200 Subject: [PATCH 59/65] chore: fix array serialization --- .../src/bindings/golang/wasm/templates/$serialize_array.mustache | 1 + .../golang/wasm/templates/$value_serialize_array.mustache | 1 + 2 files changed, 2 insertions(+) diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/$serialize_array.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/$serialize_array.mustache index cc83c569de..0607326928 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/$serialize_array.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/$serialize_array.mustache @@ -3,6 +3,7 @@ if value.{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}{ } else if len(value.{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}{{#lastFullIter}}i{{/lastFullIter}}) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}{{#lastFullIter}}i{{/lastFullIter}}))) for {{#nextIter}}i{{/nextIter}} := range value.{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}{{#prevFullIter}}i{{/prevFullIter}} { {{#scalar}} {{> serialize_scalar}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/$value_serialize_array.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/$value_serialize_array.mustache index 8dd12bb4f4..e70e40e7cf 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/$value_serialize_array.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/$value_serialize_array.mustache @@ -3,6 +3,7 @@ if value{{#lastFullIter}}i{{/lastFullIter}} == nil { } else if len(value{{#lastFullIter}}i{{/lastFullIter}}) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value{{#lastFullIter}}i{{/lastFullIter}}))) for {{#nextIter}}i{{/nextIter}} := range value{{#prevFullIter}}i{{/prevFullIter}} { {{#scalar}} {{> value_serialize_scalar}} From 0af14c94d34a48079c53ab35c94bc8c2023a687f Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Thu, 13 Jul 2023 03:00:47 +0200 Subject: [PATCH 60/65] chore: fix bindings --- .../golang/transforms/propertyDeps.ts | 6 +--- .../schema/bind/src/bindings/golang/types.ts | 29 +++++++++++-------- .../%type%Serialization-go.mustache | 2 ++ .../module_wrapped/%type%Wrapped-go.mustache | 2 +- .../env_test_import__env_serialization.go | 4 +++ ...bject_test_import__object_serialization.go | 4 +++ .../test_import__module_serialization.go | 7 +++++ .../types/object_custom_type_serialization.go | 21 ++++++++++++++ 8 files changed, 57 insertions(+), 18 deletions(-) diff --git a/packages/schema/bind/src/bindings/golang/transforms/propertyDeps.ts b/packages/schema/bind/src/bindings/golang/transforms/propertyDeps.ts index 5a6a5d20ba..1a499d6707 100644 --- a/packages/schema/bind/src/bindings/golang/transforms/propertyDeps.ts +++ b/packages/schema/bind/src/bindings/golang/transforms/propertyDeps.ts @@ -14,7 +14,6 @@ import { import { AbiTransforms } from "@polywrap/schema-parse"; interface PropertyDep { - crate: string; type: string; isEnum: boolean; } @@ -60,7 +59,6 @@ export function propertyDeps(): AbiTransforms { state.propertyDeps = []; if (state.abiEnvDefinition) { state.propertyDeps.push({ - crate: "crate", type: "Env", isEnum: false, }); @@ -86,7 +84,7 @@ export function propertyDeps(): AbiTransforms { const appendUnique = (item: PropertyDep) => { if ( array.findIndex( - (i) => i.crate === item.crate && i.type === item.type + (i) => i.type === item.type ) === -1 ) { array.push(item); @@ -102,7 +100,6 @@ export function propertyDeps(): AbiTransforms { const valueName = def.map?.object?.type ?? def.map?.enum?.type; if (valueName && !isKnownType(valueName)) { appendUnique({ - crate: "crate", type: valueName, isEnum: valueName === def.map?.enum?.type, }); @@ -118,7 +115,6 @@ export function propertyDeps(): AbiTransforms { } appendUnique({ - crate: "crate", type: typeName, isEnum: !!def.enum || !!def.array?.enum, }); diff --git a/packages/schema/bind/src/bindings/golang/types.ts b/packages/schema/bind/src/bindings/golang/types.ts index a205fa65ab..bb55137c47 100644 --- a/packages/schema/bind/src/bindings/golang/types.ts +++ b/packages/schema/bind/src/bindings/golang/types.ts @@ -1,21 +1,26 @@ /* eslint-disable @typescript-eslint/naming-convention */ -const types = { - u8: "u8", - u16: "u16", - u32: "u32", - i8: "i8", - i16: "i16", - i32: "i32", - string: "string", - bool: "bool", +const baseTypes = { + UInt: "UInt", + UInt8: "UInt8", + UInt16: "UInt16", + UInt32: "UInt32", + UInt64: "UInt64", + Int: "Int", + Int8: "Int8", + Int16: "Int16", + Int32: "Int32", + Int64: "Int64", + String: "String", + Boolean: "Boolean", + Bytes: "Bytes", }; -export type BaseTypes = typeof types; +export type BaseTypes = typeof baseTypes; export type BaseType = keyof BaseTypes; export function isBaseType(type: string): type is BaseType { - return type in types; + return type in baseTypes; } const builtInTypes = { @@ -30,4 +35,4 @@ export type BuiltInType = keyof BuiltInTypes; export function isBuiltInType(type: string): type is BuiltInType { return type in builtInTypes; -} +} \ No newline at end of file diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Serialization-go.mustache index 9bb91ba9a8..75a562868b 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Serialization-go.mustache @@ -1,7 +1,9 @@ package module_wrapped {{#makeImports}} github.com/polywrap/go-wrap/msgpack, + {{#propertyDeps.length}} . {{goImport}}/module/wrap/types, + {{/propertyDeps.length}} {{#importedTypes}} . {{goImport}}/module/wrap/imported/{{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}}, {{/importedTypes}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Wrapped-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Wrapped-go.mustache index 9e19e28d88..2f30a2d94c 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Wrapped-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Wrapped-go.mustache @@ -1,6 +1,6 @@ package module_wrapped {{#makeImports}} - {{#methods}}{{#env}}github.com/polywrap/go-wrap/wrap,. {{goImport}}/module/wrap/types,{{/env}}{{/methods}} + {{#methods}}{{#env}}github.com/polywrap/go-wrap/wrap,{{#propertyDeps.length}}. {{goImport}}/module/wrap/types,{{/propertyDeps.length}}{{/env}}{{/methods}} {{goImport}}/module as methods, {{/makeImports}} {{#methods}} diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env_serialization.go index 03532e9d99..4d9e11029c 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env_serialization.go @@ -34,6 +34,7 @@ func writeTestImport_Env(writer msgpack.Write, value *TestImport_Env) { } else if len(value.ObjectArray) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.ObjectArray))) for i0 := range value.ObjectArray { { v := value.ObjectArray[i0] @@ -49,6 +50,7 @@ func writeTestImport_Env(writer msgpack.Write, value *TestImport_Env) { } else if len(value.OptObjectArray) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.OptObjectArray))) for i0 := range value.OptObjectArray { { v := value.OptObjectArray[i0] @@ -82,6 +84,7 @@ func writeTestImport_Env(writer msgpack.Write, value *TestImport_Env) { } else if len(value.EnumArray) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.EnumArray))) for i0 := range value.EnumArray { { v := value.EnumArray[i0] @@ -97,6 +100,7 @@ func writeTestImport_Env(writer msgpack.Write, value *TestImport_Env) { } else if len(value.OptEnumArray) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.OptEnumArray))) for i0 := range value.OptEnumArray { { v := value.OptEnumArray[i0] diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object_serialization.go index e35e49689b..14a99ed24e 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object_serialization.go @@ -34,6 +34,7 @@ func writeTestImport_Object(writer msgpack.Write, value *TestImport_Object) { } else if len(value.ObjectArray) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.ObjectArray))) for i0 := range value.ObjectArray { { v := value.ObjectArray[i0] @@ -49,6 +50,7 @@ func writeTestImport_Object(writer msgpack.Write, value *TestImport_Object) { } else if len(value.OptObjectArray) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.OptObjectArray))) for i0 := range value.OptObjectArray { { v := value.OptObjectArray[i0] @@ -82,6 +84,7 @@ func writeTestImport_Object(writer msgpack.Write, value *TestImport_Object) { } else if len(value.EnumArray) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.EnumArray))) for i0 := range value.EnumArray { { v := value.EnumArray[i0] @@ -97,6 +100,7 @@ func writeTestImport_Object(writer msgpack.Write, value *TestImport_Object) { } else if len(value.OptEnumArray) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.OptEnumArray))) for i0 := range value.OptEnumArray { { v := value.OptEnumArray[i0] diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_serialization.go index d1456a2036..0a26bbdac3 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_serialization.go @@ -72,12 +72,14 @@ func WriteImportedMethodArgs(writer msgpack.Write, value *ArgsImportedMethod) { } else if len(value.UArrayArray) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.UArrayArray))) for i0 := range value.UArrayArray { if value.UArrayArray[i0] == nil { writer.WriteNil() } else if len(value.UArrayArray[i0]) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.UArrayArray[i0]))) for i1 := range value.UArrayArray[i0] { { v := value.UArrayArray[i0][i1] @@ -113,6 +115,7 @@ func WriteImportedMethodArgs(writer msgpack.Write, value *ArgsImportedMethod) { } else if len(value.ObjectArray) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.ObjectArray))) for i0 := range value.ObjectArray { { v := value.ObjectArray[i0] @@ -128,6 +131,7 @@ func WriteImportedMethodArgs(writer msgpack.Write, value *ArgsImportedMethod) { } else if len(value.OptObjectArray) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.OptObjectArray))) for i0 := range value.OptObjectArray { { v := value.OptObjectArray[i0] @@ -161,6 +165,7 @@ func WriteImportedMethodArgs(writer msgpack.Write, value *ArgsImportedMethod) { } else if len(value.EnumArray) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.EnumArray))) for i0 := range value.EnumArray { { v := value.EnumArray[i0] @@ -176,6 +181,7 @@ func WriteImportedMethodArgs(writer msgpack.Write, value *ArgsImportedMethod) { } else if len(value.OptEnumArray) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.OptEnumArray))) for i0 := range value.OptEnumArray { { v := value.OptEnumArray[i0] @@ -223,6 +229,7 @@ func WriteAnotherMethodArgs(writer msgpack.Write, value *ArgsAnotherMethod) { } else if len(value.Arg) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.Arg))) for i0 := range value.Arg { { v := value.Arg[i0] diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go index b8b8b230a7..78d4df2834 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go @@ -197,6 +197,7 @@ func writeCustomType(writer msgpack.Write, value *CustomType) { } else if len(value.U_array) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.U_array))) for i0 := range value.U_array { { v := value.U_array[i0] @@ -212,6 +213,7 @@ func writeCustomType(writer msgpack.Write, value *CustomType) { } else if len(value.UOpt_array) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.UOpt_array))) for i0 := range value.UOpt_array { { v := value.UOpt_array[i0] @@ -227,6 +229,7 @@ func writeCustomType(writer msgpack.Write, value *CustomType) { } else if len(value._opt_uOptArray) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value._opt_uOptArray))) for i0 := range value._opt_uOptArray { { v := value._opt_uOptArray[i0] @@ -246,6 +249,7 @@ func writeCustomType(writer msgpack.Write, value *CustomType) { } else if len(value.OptStrOptArray) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.OptStrOptArray))) for i0 := range value.OptStrOptArray { { v := value.OptStrOptArray[i0] @@ -265,12 +269,14 @@ func writeCustomType(writer msgpack.Write, value *CustomType) { } else if len(value.UArrayArray) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.UArrayArray))) for i0 := range value.UArrayArray { if value.UArrayArray[i0] == nil { writer.WriteNil() } else if len(value.UArrayArray[i0]) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.UArrayArray[i0]))) for i1 := range value.UArrayArray[i0] { { v := value.UArrayArray[i0][i1] @@ -288,12 +294,14 @@ func writeCustomType(writer msgpack.Write, value *CustomType) { } else if len(value.UOptArrayOptArray) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.UOptArrayOptArray))) for i0 := range value.UOptArrayOptArray { if value.UOptArrayOptArray[i0] == nil { writer.WriteNil() } else if len(value.UOptArrayOptArray[i0]) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.UOptArrayOptArray[i0]))) for i1 := range value.UOptArrayOptArray[i0] { { v := value.UOptArrayOptArray[i0][i1] @@ -315,18 +323,21 @@ func writeCustomType(writer msgpack.Write, value *CustomType) { } else if len(value.UArrayOptArrayArray) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.UArrayOptArrayArray))) for i0 := range value.UArrayOptArrayArray { if value.UArrayOptArrayArray[i0] == nil { writer.WriteNil() } else if len(value.UArrayOptArrayArray[i0]) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.UArrayOptArrayArray[i0]))) for i1 := range value.UArrayOptArrayArray[i0] { if value.UArrayOptArrayArray[i0][i1] == nil { writer.WriteNil() } else if len(value.UArrayOptArrayArray[i0][i1]) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.UArrayOptArrayArray[i0][i1]))) for i2 := range value.UArrayOptArrayArray[i0][i1] { { v := value.UArrayOptArrayArray[i0][i1][i2] @@ -346,24 +357,28 @@ func writeCustomType(writer msgpack.Write, value *CustomType) { } else if len(value.CrazyArray) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.CrazyArray))) for i0 := range value.CrazyArray { if value.CrazyArray[i0] == nil { writer.WriteNil() } else if len(value.CrazyArray[i0]) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.CrazyArray[i0]))) for i1 := range value.CrazyArray[i0] { if value.CrazyArray[i0][i1] == nil { writer.WriteNil() } else if len(value.CrazyArray[i0][i1]) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.CrazyArray[i0][i1]))) for i2 := range value.CrazyArray[i0][i1] { if value.CrazyArray[i0][i1][i2] == nil { writer.WriteNil() } else if len(value.CrazyArray[i0][i1][i2]) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.CrazyArray[i0][i1][i2]))) for i3 := range value.CrazyArray[i0][i1][i2] { { v := value.CrazyArray[i0][i1][i2][i3] @@ -399,6 +414,7 @@ func writeCustomType(writer msgpack.Write, value *CustomType) { } else if len(value.ObjectArray) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.ObjectArray))) for i0 := range value.ObjectArray { { v := value.ObjectArray[i0] @@ -414,6 +430,7 @@ func writeCustomType(writer msgpack.Write, value *CustomType) { } else if len(value.OptObjectArray) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.OptObjectArray))) for i0 := range value.OptObjectArray { { v := value.OptObjectArray[i0] @@ -447,6 +464,7 @@ func writeCustomType(writer msgpack.Write, value *CustomType) { } else if len(value.EnumArray) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.EnumArray))) for i0 := range value.EnumArray { { v := value.EnumArray[i0] @@ -462,6 +480,7 @@ func writeCustomType(writer msgpack.Write, value *CustomType) { } else if len(value.OptEnumArray) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.OptEnumArray))) for i0 := range value.OptEnumArray { { v := value.OptEnumArray[i0] @@ -504,6 +523,7 @@ func writeCustomType(writer msgpack.Write, value *CustomType) { } else if len(value.MapOfArr[i0]) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.MapOfArr[i0]))) for i1 := range value.MapOfArr[i0] { { v := value.MapOfArr[i0][i1] @@ -544,6 +564,7 @@ func writeCustomType(writer msgpack.Write, value *CustomType) { } else if len(value.MapOfArrOfObj[i0]) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.MapOfArrOfObj[i0]))) for i1 := range value.MapOfArrOfObj[i0] { { v := value.MapOfArrOfObj[i0][i1] From 362b9c89165e0b569121472d18bf5dc04b11ba5e Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Thu, 13 Jul 2023 03:27:54 +0200 Subject: [PATCH 61/65] chore: fix json binding --- .../templates/env-type/Env%type%-go.mustache | 2 +- .../imported/env-type/Env%type%-go.mustache | 2 +- .../%type%Serialization-go.mustache | 2 +- .../object-type/Object%type%-go.mustache | 2 +- .../module-type/types/%type%Args-go.mustache | 2 +- .../object-type/Object%type%-go.mustache | 2 +- .../test_import/env_test_import__env.go | 16 ++-- .../object_test_import__another_object.go | 2 +- .../test_import/object_test_import__object.go | 16 ++-- .../test_import__module_serialization.go | 30 +++---- .../output/wasm-go/types/module_args.go | 40 ++++----- .../wasm-go/types/object_another_type.go | 6 +- .../wasm-go/types/object_custom_map_value.go | 2 +- .../wasm-go/types/object_custom_type.go | 84 +++++++++---------- .../sanity/output/wasm-go/types/object_env.go | 6 +- .../sanity/output/wasm-go/types/objectelse.go | 2 +- 16 files changed, 108 insertions(+), 108 deletions(-) diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%-go.mustache index 0810ab36de..a64e346848 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%-go.mustache @@ -5,7 +5,7 @@ package types type {{#toUpper}}{{type}}{{/toUpper}} struct { {{#stuctProps}} {{#properties}} - {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} + {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} `json:"{{name}}"` {{/properties}} {{/stuctProps}} } diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%-go.mustache index 3c230b9f9a..70cc14ba31 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%-go.mustache @@ -8,7 +8,7 @@ package {{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}} type {{#toUpper}}{{type}}{{/toUpper}} struct { {{#stuctProps}} {{#properties}} -{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} +{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} `json:"{{name}}"` {{/properties}} {{/stuctProps}} } diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Serialization-go.mustache index 86491f7932..24e8033ed4 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Serialization-go.mustache @@ -9,7 +9,7 @@ package {{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}} type Args{{#toUpper}}{{name}}{{/toUpper}} struct { {{#stuctProps}} {{#arguments}} -{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} +{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} `json:"{{name}}"` {{/arguments}} {{/stuctProps}} } diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%-go.mustache index 3c230b9f9a..70cc14ba31 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%-go.mustache @@ -8,7 +8,7 @@ package {{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}} type {{#toUpper}}{{type}}{{/toUpper}} struct { {{#stuctProps}} {{#properties}} -{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} +{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} `json:"{{name}}"` {{/properties}} {{/stuctProps}} } diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache index d20db1c755..cf5cc65316 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache @@ -14,7 +14,7 @@ package types type MethodArgs{{#toUpper}}{{name}}{{/toUpper}} struct { {{#stuctProps}} {{#arguments}} -{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} +{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} `json:"{{name}}"` {{/arguments}} {{/stuctProps}} } diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%-go.mustache index e9576bcbc9..fbd7e01f18 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%-go.mustache @@ -8,7 +8,7 @@ package types type {{#toUpper}}{{type}}{{/toUpper}} struct { {{#stuctProps}} {{#properties}} -{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} +{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} `json:"{{name}}"` {{/properties}} {{/stuctProps}} } diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env.go index 81cdbc86bc..5478dd8ab9 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env.go @@ -5,14 +5,14 @@ import ( ) type TestImport_Env struct { - Object TestImport_AnotherObject - OptObject *TestImport_AnotherObject - ObjectArray []TestImport_AnotherObject - OptObjectArray []*TestImport_AnotherObject - En TestImport_Enum - OptEnum *TestImport_Enum - EnumArray []TestImport_Enum - OptEnumArray []*TestImport_Enum + Object TestImport_AnotherObject `json:"object"` + OptObject *TestImport_AnotherObject `json:"optObject"` + ObjectArray []TestImport_AnotherObject `json:"objectArray"` + OptObjectArray []*TestImport_AnotherObject `json:"optObjectArray"` + En TestImport_Enum `json:"en"` + OptEnum *TestImport_Enum `json:"optEnum"` + EnumArray []TestImport_Enum `json:"enumArray"` + OptEnumArray []*TestImport_Enum `json:"optEnumArray"` } func TestImport_EnvToBuffer(value *TestImport_Env) []byte { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object.go index 1f524b3ac0..f01380602e 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object.go @@ -5,7 +5,7 @@ import ( ) type TestImport_AnotherObject struct { - Prop string + Prop string `json:"prop"` } func TestImport_AnotherObjectToBuffer(value *TestImport_AnotherObject) []byte { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object.go index 1df2cf8297..1fc1c743a3 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object.go @@ -5,14 +5,14 @@ import ( ) type TestImport_Object struct { - Object TestImport_AnotherObject - OptObject *TestImport_AnotherObject - ObjectArray []TestImport_AnotherObject - OptObjectArray []*TestImport_AnotherObject - En TestImport_Enum - OptEnum *TestImport_Enum - EnumArray []TestImport_Enum - OptEnumArray []*TestImport_Enum + Object TestImport_AnotherObject `json:"object"` + OptObject *TestImport_AnotherObject `json:"optObject"` + ObjectArray []TestImport_AnotherObject `json:"objectArray"` + OptObjectArray []*TestImport_AnotherObject `json:"optObjectArray"` + En TestImport_Enum `json:"en"` + OptEnum *TestImport_Enum `json:"optEnum"` + EnumArray []TestImport_Enum `json:"enumArray"` + OptEnumArray []*TestImport_Enum `json:"optEnumArray"` } func TestImport_ObjectToBuffer(value *TestImport_Object) []byte { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_serialization.go index 0a26bbdac3..461da72dff 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_serialization.go @@ -5,19 +5,19 @@ import ( ) type ArgsImportedMethod struct { - Str string - OptStr *string - U uint32 - OptU *uint32 - UArrayArray [][]*uint32 - Object TestImport_Object - OptObject *TestImport_Object - ObjectArray []TestImport_Object - OptObjectArray []*TestImport_Object - En TestImport_Enum - OptEnum *TestImport_Enum - EnumArray []TestImport_Enum - OptEnumArray []*TestImport_Enum + Str string `json:"str"` + OptStr *string `json:"optStr"` + U uint32 `json:"u"` + OptU *uint32 `json:"optU"` + UArrayArray [][]*uint32 `json:"uArrayArray"` + Object TestImport_Object `json:"object"` + OptObject *TestImport_Object `json:"optObject"` + ObjectArray []TestImport_Object `json:"objectArray"` + OptObjectArray []*TestImport_Object `json:"optObjectArray"` + En TestImport_Enum `json:"en"` + OptEnum *TestImport_Enum `json:"optEnum"` + EnumArray []TestImport_Enum `json:"enumArray"` + OptEnumArray []*TestImport_Enum `json:"optEnumArray"` } func SerializeImportedMethodArgs(value *ArgsImportedMethod) []byte { @@ -210,7 +210,7 @@ func DeserializeImportedMethodResult(argsBuf []byte) *TestImport_Object { } type ArgsAnotherMethod struct { - Arg []string + Arg []string `json:"arg"` } func SerializeAnotherMethodArgs(value *ArgsAnotherMethod) []byte { @@ -252,7 +252,7 @@ func DeserializeAnotherMethodResult(argsBuf []byte) int32 { } type ArgsReturnsArrayOfEnums struct { - Arg string + Arg string `json:"arg"` } func SerializeReturnsArrayOfEnumsArgs(value *ArgsReturnsArrayOfEnums) []byte { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_args.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_args.go index 118f13d50e..31f8ea4d83 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_args.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_args.go @@ -1,33 +1,33 @@ package types type MethodArgsModuleMethod struct { - Str string - OptStr *string - En CustomEnum - OptEnum *CustomEnum - EnumArray []CustomEnum - OptEnumArray []*CustomEnum - M_map map[string]int32 - MapOfArr map[string][]int32 - MapOfMap map[string]map[string]int32 - MapOfObj map[string]AnotherType - MapOfArrOfObj map[string][]AnotherType + Str string `json:"str"` + OptStr *string `json:"optStr"` + En CustomEnum `json:"en"` + OptEnum *CustomEnum `json:"optEnum"` + EnumArray []CustomEnum `json:"enumArray"` + OptEnumArray []*CustomEnum `json:"optEnumArray"` + M_map map[string]int32 `json:"map"` + MapOfArr map[string][]int32 `json:"mapOfArr"` + MapOfMap map[string]map[string]int32 `json:"mapOfMap"` + MapOfObj map[string]AnotherType `json:"mapOfObj"` + MapOfArrOfObj map[string][]AnotherType `json:"mapOfArrOfObj"` } type MethodArgsObjectMethod struct { - Object AnotherType - OptObject *AnotherType - ObjectArray []AnotherType - OptObjectArray []*AnotherType + Object AnotherType `json:"object"` + OptObject *AnotherType `json:"optObject"` + ObjectArray []AnotherType `json:"objectArray"` + OptObjectArray []*AnotherType `json:"optObjectArray"` } type MethodArgsOptionalEnvMethod struct { - Object AnotherType - OptObject *AnotherType - ObjectArray []AnotherType - OptObjectArray []*AnotherType + Object AnotherType `json:"object"` + OptObject *AnotherType `json:"optObject"` + ObjectArray []AnotherType `json:"objectArray"` + OptObjectArray []*AnotherType `json:"optObjectArray"` } type MethodArgsIf struct { - M_if Else + M_if Else `json:"if"` } diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_another_type.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_another_type.go index d09cb425a6..92d48c4722 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_another_type.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_another_type.go @@ -5,9 +5,9 @@ import ( ) type AnotherType struct { - Prop *string - Circular *CustomType - M_const *string + Prop *string `json:"prop"` + Circular *CustomType `json:"circular"` + M_const *string `json:"const"` } func AnotherTypeToBuffer(value *AnotherType) []byte { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value.go index d27437e07f..49729b0e00 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value.go @@ -5,7 +5,7 @@ import ( ) type CustomMapValue struct { - Foo string + Foo string `json:"foo"` } func CustomMapValueToBuffer(value *CustomMapValue) []byte { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type.go index 2b3a0b7050..6c97ef1ba9 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type.go @@ -7,48 +7,48 @@ import ( ) type CustomType struct { - Str string - OptStr *string - U uint32 - OptU *uint32 - M_u8 uint8 - M_u16 uint16 - M_u32 uint32 - I int32 - M_i8 int8 - M_i16 int16 - M_i32 int32 - Bigint *big.Int - OptBigint *big.Int - Bignumber *big.Int - OptBignumber *big.Int - Json *fastjson.Value - OptJson *fastjson.Value - Bytes []byte - OptBytes []byte - M_boolean bool - OptBoolean *bool - U_array []uint32 - UOpt_array []uint32 - _opt_uOptArray []*uint32 - OptStrOptArray []*string - UArrayArray [][]uint32 - UOptArrayOptArray [][]*uint32 - UArrayOptArrayArray [][][]uint32 - CrazyArray [][][][]uint32 - Object AnotherType - OptObject *AnotherType - ObjectArray []AnotherType - OptObjectArray []*AnotherType - En CustomEnum - OptEnum *CustomEnum - EnumArray []CustomEnum - OptEnumArray []*CustomEnum - M_map map[string]int32 - MapOfArr map[string][]int32 - MapOfObj map[string]AnotherType - MapOfArrOfObj map[string][]AnotherType - MapCustomValue map[string]*CustomMapValue + Str string `json:"str"` + OptStr *string `json:"optStr"` + U uint32 `json:"u"` + OptU *uint32 `json:"optU"` + M_u8 uint8 `json:"u8"` + M_u16 uint16 `json:"u16"` + M_u32 uint32 `json:"u32"` + I int32 `json:"i"` + M_i8 int8 `json:"i8"` + M_i16 int16 `json:"i16"` + M_i32 int32 `json:"i32"` + Bigint *big.Int `json:"bigint"` + OptBigint *big.Int `json:"optBigint"` + Bignumber *big.Int `json:"bignumber"` + OptBignumber *big.Int `json:"optBignumber"` + Json *fastjson.Value `json:"json"` + OptJson *fastjson.Value `json:"optJson"` + Bytes []byte `json:"bytes"` + OptBytes []byte `json:"optBytes"` + M_boolean bool `json:"boolean"` + OptBoolean *bool `json:"optBoolean"` + U_array []uint32 `json:"u_array"` + UOpt_array []uint32 `json:"uOpt_array"` + _opt_uOptArray []*uint32 `json:"_opt_uOptArray"` + OptStrOptArray []*string `json:"optStrOptArray"` + UArrayArray [][]uint32 `json:"uArrayArray"` + UOptArrayOptArray [][]*uint32 `json:"uOptArrayOptArray"` + UArrayOptArrayArray [][][]uint32 `json:"uArrayOptArrayArray"` + CrazyArray [][][][]uint32 `json:"crazyArray"` + Object AnotherType `json:"object"` + OptObject *AnotherType `json:"optObject"` + ObjectArray []AnotherType `json:"objectArray"` + OptObjectArray []*AnotherType `json:"optObjectArray"` + En CustomEnum `json:"en"` + OptEnum *CustomEnum `json:"optEnum"` + EnumArray []CustomEnum `json:"enumArray"` + OptEnumArray []*CustomEnum `json:"optEnumArray"` + M_map map[string]int32 `json:"map"` + MapOfArr map[string][]int32 `json:"mapOfArr"` + MapOfObj map[string]AnotherType `json:"mapOfObj"` + MapOfArrOfObj map[string][]AnotherType `json:"mapOfArrOfObj"` + MapCustomValue map[string]*CustomMapValue `json:"mapCustomValue"` } func CustomTypeToBuffer(value *CustomType) []byte { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_env.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_env.go index 627de4f432..14f90adbc6 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_env.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_env.go @@ -5,9 +5,9 @@ import ( ) type Env struct { - Prop string - OptProp *string - OptMap map[string]*int32 + Prop string `json:"prop"` + OptProp *string `json:"optProp"` + OptMap map[string]*int32 `json:"optMap"` } func EnvToBuffer(value *Env) []byte { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse.go index 23e470aad4..930eb8f8e3 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse.go @@ -5,7 +5,7 @@ import ( ) type Else struct { - M_else string + M_else string `json:"else"` } func ElseToBuffer(value *Else) []byte { From 2f1b66a6c21754d1479a1fc3fc30ddd23917317b Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Thu, 13 Jul 2023 04:58:32 +0200 Subject: [PATCH 62/65] chore: fix bindings --- .../src/bindings/golang/transforms/index.ts | 2 +- .../golang/transforms/moduleNeedsTypes.ts | 55 +++++ .../golang/transforms/propertyDeps.ts | 203 ------------------ .../bind/src/bindings/golang/wasm/index.ts | 2 +- .../module-type/%type%Wrapped-go.mustache | 4 +- .../%type%Serialization-go.mustache | 8 +- .../module_wrapped/%type%Wrapped-go.mustache | 2 +- .../module-type/types/%type%Args-go.mustache | 2 +- .../test_import__module_wrapped.go | 6 +- .../module_wrapped/module_serialization.go | 16 +- .../output/wasm-go/types/module_args.go | 8 +- .../wasm/golang/001-sanity/module/module.go | 2 +- .../wasm/008-sanity-golang/module/module.go | 2 +- 13 files changed, 82 insertions(+), 230 deletions(-) create mode 100644 packages/schema/bind/src/bindings/golang/transforms/moduleNeedsTypes.ts delete mode 100644 packages/schema/bind/src/bindings/golang/transforms/propertyDeps.ts diff --git a/packages/schema/bind/src/bindings/golang/transforms/index.ts b/packages/schema/bind/src/bindings/golang/transforms/index.ts index 45b46dccaa..7533ca0186 100644 --- a/packages/schema/bind/src/bindings/golang/transforms/index.ts +++ b/packages/schema/bind/src/bindings/golang/transforms/index.ts @@ -1 +1 @@ -export * from "./propertyDeps"; +export * from "./moduleNeedsTypes"; diff --git a/packages/schema/bind/src/bindings/golang/transforms/moduleNeedsTypes.ts b/packages/schema/bind/src/bindings/golang/transforms/moduleNeedsTypes.ts new file mode 100644 index 0000000000..6e429f58ca --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/transforms/moduleNeedsTypes.ts @@ -0,0 +1,55 @@ +import { + MethodDefinition, + ModuleDefinition, +} from "@polywrap/wrap-manifest-types-js"; +import { AbiTransforms } from "@polywrap/schema-parse"; + +import { isBaseType, isBuiltInType } from "../types"; + +interface ModuleNeedsTypesState { + moduleDefinition?: ModuleDefinition; + needsTypes?: boolean; +} + +export function moduleNeedsTypes(): AbiTransforms { + const state: ModuleNeedsTypesState = {}; + + return { + enter: { + ModuleDefinition: (def: ModuleDefinition) => { + console.log("ENTER", def.type) + state.moduleDefinition = def; + state.needsTypes = false; + return def; + }, + MethodDefinition: (def: MethodDefinition) => { + console.log("METHOD", def.name); + if (def.arguments && def.arguments.length > 0) { + console.log("NEEDS cause args") + state.needsTypes = true; + } + + if (def.return) { + const returnType = def.return.type; + if (!isBaseType(returnType) && !isBuiltInType(returnType)) { + console.log("NEEDS cause ret") + state.needsTypes = true; + } + } + return def; + } + }, + leave: { + ModuleDefinition: (def: ModuleDefinition) => { + console.log("LEAVE", def.name) + const needsTypes = state.needsTypes + state.moduleDefinition = undefined; + state.needsTypes = undefined; + return { + ...def, + needsTypes, + }; + } + }, + }; +} diff --git a/packages/schema/bind/src/bindings/golang/transforms/propertyDeps.ts b/packages/schema/bind/src/bindings/golang/transforms/propertyDeps.ts deleted file mode 100644 index 1a499d6707..0000000000 --- a/packages/schema/bind/src/bindings/golang/transforms/propertyDeps.ts +++ /dev/null @@ -1,203 +0,0 @@ -/* eslint-disable @typescript-eslint/naming-convention */ -/* eslint-disable no-useless-escape */ -import { isBaseType, isBuiltInType } from "../types"; - -import { - ImportedModuleDefinition, - ObjectDefinition, - AnyDefinition, - ModuleDefinition, - EnvDefinition, - Abi, - ImportedEnvDefinition, -} from "@polywrap/wrap-manifest-types-js"; -import { AbiTransforms } from "@polywrap/schema-parse"; - -interface PropertyDep { - type: string; - isEnum: boolean; -} - -interface PropertyDepsState { - abiEnvDefinition?: EnvDefinition; - envDefinition?: EnvDefinition; - importedEnvDefinition?: ImportedEnvDefinition; - objectDefinition?: ObjectDefinition; - moduleDefinition?: ModuleDefinition; - importedModuleDefinition?: ImportedModuleDefinition; - propertyDeps?: PropertyDep[]; -} - -export function propertyDeps(): AbiTransforms { - const state: PropertyDepsState = {}; - - return { - enter: { - Abi: (abi: Abi) => { - if (abi.envType) { - state.abiEnvDefinition = abi.envType; - } - return abi; - }, - EnvDefinition: (def: EnvDefinition) => { - state.envDefinition = def; - state.propertyDeps = []; - return def; - }, - ImportedEnvDefinition: (def: ImportedEnvDefinition) => { - state.envDefinition = def; - state.propertyDeps = []; - return def; - }, - ObjectDefinition: (def: ObjectDefinition) => { - state.objectDefinition = def; - state.propertyDeps = []; - return def; - }, - ModuleDefinition: (def: ModuleDefinition) => { - state.moduleDefinition = def; - state.propertyDeps = []; - if (state.abiEnvDefinition) { - state.propertyDeps.push({ - type: "Env", - isEnum: false, - }); - } - return def; - }, - ImportedModuleDefinition: (def: ImportedModuleDefinition) => { - state.importedModuleDefinition = def; - state.propertyDeps = []; - return def; - }, - AnyDefinition: (def: AnyDefinition) => { - const appendPropertyDep = ( - rootType: string, - array: PropertyDep[] - ): PropertyDep[] => { - let typeName = def.type; - - if (typeName.indexOf("[") === 0) { - typeName = typeName.replace(/\[|\]|\!|\?/g, ""); - } - - const appendUnique = (item: PropertyDep) => { - if ( - array.findIndex( - (i) => i.type === item.type - ) === -1 - ) { - array.push(item); - } - }; - - const isKnownType = (name: string) => - isBaseType(name) || isBuiltInType(name) || name === rootType; - - // if type is map and the value is custom, - // we need to add it into property dependency - if (typeName.startsWith("Map<")) { - const valueName = def.map?.object?.type ?? def.map?.enum?.type; - if (valueName && !isKnownType(valueName)) { - appendUnique({ - type: valueName, - isEnum: valueName === def.map?.enum?.type, - }); - - return array; - } - - return array; - } - - if (isKnownType(typeName)) { - return array; - } - - appendUnique({ - type: typeName, - isEnum: !!def.enum || !!def.array?.enum, - }); - - return array; - }; - - if (state.envDefinition && state.propertyDeps) { - state.propertyDeps = appendPropertyDep( - state.envDefinition.type, - state.propertyDeps - ); - } else if (state.importedEnvDefinition && state.propertyDeps) { - state.propertyDeps = appendPropertyDep( - state.importedEnvDefinition.type, - state.propertyDeps - ); - } else if (state.objectDefinition && state.propertyDeps) { - state.propertyDeps = appendPropertyDep( - state.objectDefinition.type, - state.propertyDeps - ); - } else if (state.moduleDefinition && state.propertyDeps) { - state.propertyDeps = appendPropertyDep( - state.moduleDefinition.type, - state.propertyDeps - ); - } else if (state.importedModuleDefinition && state.propertyDeps) { - state.propertyDeps = appendPropertyDep( - state.importedModuleDefinition.type, - state.propertyDeps - ); - } - - return def; - }, - }, - leave: { - EnvDefinition: (def: EnvDefinition) => { - const propertyDeps = state.propertyDeps; - state.propertyDeps = undefined; - state.envDefinition = undefined; - return { - ...def, - propertyDeps, - }; - }, - ImportedEnvDefinition: (def: ImportedEnvDefinition) => { - const propertyDeps = state.propertyDeps; - state.propertyDeps = undefined; - state.importedEnvDefinition = undefined; - return { - ...def, - propertyDeps, - }; - }, - ObjectDefinition: (def: ObjectDefinition) => { - const propertyDeps = state.propertyDeps; - state.propertyDeps = undefined; - state.objectDefinition = undefined; - return { - ...def, - propertyDeps, - }; - }, - ModuleDefinition: (def: ModuleDefinition) => { - const propertyDeps = state.propertyDeps; - state.propertyDeps = undefined; - state.moduleDefinition = undefined; - return { - ...def, - propertyDeps, - }; - }, - ImportedModuleDefinition: (def: ImportedModuleDefinition) => { - const propertyDeps = state.propertyDeps; - state.propertyDeps = undefined; - state.importedModuleDefinition = undefined; - return { - ...def, - propertyDeps, - }; - }, - }, - }; -} diff --git a/packages/schema/bind/src/bindings/golang/wasm/index.ts b/packages/schema/bind/src/bindings/golang/wasm/index.ts index 46e053f322..5aee1e7ebf 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/index.ts +++ b/packages/schema/bind/src/bindings/golang/wasm/index.ts @@ -271,7 +271,7 @@ function applyTransforms(abi: Abi): Abi { extendType(Functions), addFirstLast, toPrefixedGraphQLType, - Transforms.propertyDeps(), + Transforms.moduleNeedsTypes(), ]; for (const transform of transforms) { diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Wrapped-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Wrapped-go.mustache index b098e0a36f..72c3adf3c3 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Wrapped-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Wrapped-go.mustache @@ -8,7 +8,7 @@ import ( {{^isInterface}} {{#methods}} -func {{#toUpper}}{{type}}{{/toUpper}}{{#toUpper}}{{name}}{{/toUpper}}(args *Args{{#toUpper}}{{name}}{{/toUpper}}) ({{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}, error) { +func {{#toUpper}}{{name}}{{/toUpper}}(args *Args{{#toUpper}}{{name}}{{/toUpper}}) ({{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}, error) { argsBuf := Serialize{{#toUpper}}{{name}}{{/toUpper}}Args(args) var ( err error @@ -28,7 +28,7 @@ func {{#toUpper}}{{type}}{{/toUpper}}{{#toUpper}}{{name}}{{/toUpper}}(args *Args {{/isInterface}} {{#isInterface}} {{#methods}} -func {{#toUpper}}{{type}}{{/toUpper}}{{#toUpper}}{{name}}{{/toUpper}}(uri string, args *Args{{#toUpper}}{{name}}{{/toUpper}}) ({{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}, error) { +func {{#toUpper}}{{name}}{{/toUpper}}(uri string, args *Args{{#toUpper}}{{name}}{{/toUpper}}) ({{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}, error) { argsBuf := Serialize{{#toUpper}}{{name}}{{/toUpper}}Args(args) var ( err error diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Serialization-go.mustache index 75a562868b..9f6defac57 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Serialization-go.mustache @@ -1,9 +1,9 @@ package module_wrapped {{#makeImports}} github.com/polywrap/go-wrap/msgpack, - {{#propertyDeps.length}} + {{#needsTypes}} . {{goImport}}/module/wrap/types, - {{/propertyDeps.length}} + {{/needsTypes}} {{#importedTypes}} . {{goImport}}/module/wrap/imported/{{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}}, {{/importedTypes}} @@ -13,7 +13,7 @@ package module_wrapped {{/makeImports}} {{#methods}} {{#arguments.length}} -func Deserialize{{#toUpper}}{{name}}{{/toUpper}}Args(argsBuf []byte) *MethodArgs{{#toUpper}}{{name}}{{/toUpper}} { +func Deserialize{{#toUpper}}{{name}}{{/toUpper}}Args(argsBuf []byte) *Args{{#toUpper}}{{name}}{{/toUpper}} { ctx := msgpack.NewContext("Deserializing module-type: {{#toUpper}}{{name}}{{/toUpper}}") reader := msgpack.NewReadDecoder(ctx, argsBuf) @@ -71,7 +71,7 @@ func Deserialize{{#toUpper}}{{name}}{{/toUpper}}Args(argsBuf []byte) *MethodArgs {{/required}} {{/arguments}} - return &MethodArgs{{#toUpper}}{{name}}{{/toUpper}}{ + return &Args{{#toUpper}}{{name}}{{/toUpper}}{ {{#stuctProps}} {{#arguments}} {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}: _{{name}}, diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Wrapped-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Wrapped-go.mustache index 2f30a2d94c..cd6794431f 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Wrapped-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Wrapped-go.mustache @@ -1,6 +1,6 @@ package module_wrapped {{#makeImports}} - {{#methods}}{{#env}}github.com/polywrap/go-wrap/wrap,{{#propertyDeps.length}}. {{goImport}}/module/wrap/types,{{/propertyDeps.length}}{{/env}}{{/methods}} + {{#methods}}{{#env}}github.com/polywrap/go-wrap/wrap,{{#needsTypes}}. {{goImport}}/module/wrap/types,{{/needsTypes}}{{/env}}{{/methods}} {{goImport}}/module as methods, {{/makeImports}} {{#methods}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache index cf5cc65316..4d7a27be0f 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache @@ -11,7 +11,7 @@ package types {{/makeImports}} {{#methods}} {{#arguments.length}} -type MethodArgs{{#toUpper}}{{name}}{{/toUpper}} struct { +type Args{{#toUpper}}{{name}}{{/toUpper}} struct { {{#stuctProps}} {{#arguments}} {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} `json:"{{name}}"` diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_wrapped.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_wrapped.go index b35afbfa71..54e30e516a 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_wrapped.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_wrapped.go @@ -4,7 +4,7 @@ import ( "github.com/polywrap/go-wrap/wrap" ) -func MethodImportedMethod(uri string, args *ArgsImportedMethod) (*TestImport_Object, error) { +func ImportedMethod(uri string, args *ArgsImportedMethod) (*TestImport_Object, error) { argsBuf := SerializeImportedMethodArgs(args) var ( err error @@ -18,7 +18,7 @@ func MethodImportedMethod(uri string, args *ArgsImportedMethod) (*TestImport_Obj return data, err } -func MethodAnotherMethod(uri string, args *ArgsAnotherMethod) (int32, error) { +func AnotherMethod(uri string, args *ArgsAnotherMethod) (int32, error) { argsBuf := SerializeAnotherMethodArgs(args) var ( err error @@ -32,7 +32,7 @@ func MethodAnotherMethod(uri string, args *ArgsAnotherMethod) (int32, error) { return data, err } -func MethodReturnsArrayOfEnums(uri string, args *ArgsReturnsArrayOfEnums) ([]*TestImport_Enum_Return, error) { +func ReturnsArrayOfEnums(uri string, args *ArgsReturnsArrayOfEnums) ([]*TestImport_Enum_Return, error) { argsBuf := SerializeReturnsArrayOfEnumsArgs(args) var ( err error diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/module_wrapped/module_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/module_wrapped/module_serialization.go index 920d1f45b0..346056af85 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/module_wrapped/module_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/module_wrapped/module_serialization.go @@ -5,7 +5,7 @@ import ( "github.com/polywrap/go-wrap/msgpack" ) -func DeserializeModuleMethodArgs(argsBuf []byte) *MethodArgsModuleMethod { +func DeserializeModuleMethodArgs(argsBuf []byte) *ArgsModuleMethod { ctx := msgpack.NewContext("Deserializing module-type: ModuleMethod") reader := msgpack.NewReadDecoder(ctx, argsBuf) @@ -219,7 +219,7 @@ func DeserializeModuleMethodArgs(argsBuf []byte) *MethodArgsModuleMethod { panic(reader.Context().PrintWithContext("Missing required property: 'mapOfArrOfObj: Map'")) } - return &MethodArgsModuleMethod{ + return &ArgsModuleMethod{ Str: _str, OptStr: _optStr, En: _en, @@ -250,7 +250,7 @@ func WriteModuleMethodResult(writer msgpack.Write, value int32) { writer.Context().Pop() } -func DeserializeObjectMethodArgs(argsBuf []byte) *MethodArgsObjectMethod { +func DeserializeObjectMethodArgs(argsBuf []byte) *ArgsObjectMethod { ctx := msgpack.NewContext("Deserializing module-type: ObjectMethod") reader := msgpack.NewReadDecoder(ctx, argsBuf) @@ -320,7 +320,7 @@ func DeserializeObjectMethodArgs(argsBuf []byte) *MethodArgsObjectMethod { panic(reader.Context().PrintWithContext("Missing required property: 'objectArray: [AnotherType]'")) } - return &MethodArgsObjectMethod{ + return &ArgsObjectMethod{ Object: _object, OptObject: _optObject, ObjectArray: _objectArray, @@ -344,7 +344,7 @@ func WriteObjectMethodResult(writer msgpack.Write, value *AnotherType) { writer.Context().Pop() } -func DeserializeOptionalEnvMethodArgs(argsBuf []byte) *MethodArgsOptionalEnvMethod { +func DeserializeOptionalEnvMethodArgs(argsBuf []byte) *ArgsOptionalEnvMethod { ctx := msgpack.NewContext("Deserializing module-type: OptionalEnvMethod") reader := msgpack.NewReadDecoder(ctx, argsBuf) @@ -414,7 +414,7 @@ func DeserializeOptionalEnvMethodArgs(argsBuf []byte) *MethodArgsOptionalEnvMeth panic(reader.Context().PrintWithContext("Missing required property: 'objectArray: [AnotherType]'")) } - return &MethodArgsOptionalEnvMethod{ + return &ArgsOptionalEnvMethod{ Object: _object, OptObject: _optObject, ObjectArray: _objectArray, @@ -438,7 +438,7 @@ func WriteOptionalEnvMethodResult(writer msgpack.Write, value *AnotherType) { writer.Context().Pop() } -func DeserializeIfArgs(argsBuf []byte) *MethodArgsIf { +func DeserializeIfArgs(argsBuf []byte) *ArgsIf { ctx := msgpack.NewContext("Deserializing module-type: If") reader := msgpack.NewReadDecoder(ctx, argsBuf) @@ -466,7 +466,7 @@ func DeserializeIfArgs(argsBuf []byte) *MethodArgsIf { panic(reader.Context().PrintWithContext("Missing required property: 'if: else'")) } - return &MethodArgsIf{ + return &ArgsIf{ M_if: _if, } } diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_args.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_args.go index 31f8ea4d83..eb228b6267 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_args.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_args.go @@ -1,6 +1,6 @@ package types -type MethodArgsModuleMethod struct { +type ArgsModuleMethod struct { Str string `json:"str"` OptStr *string `json:"optStr"` En CustomEnum `json:"en"` @@ -14,20 +14,20 @@ type MethodArgsModuleMethod struct { MapOfArrOfObj map[string][]AnotherType `json:"mapOfArrOfObj"` } -type MethodArgsObjectMethod struct { +type ArgsObjectMethod struct { Object AnotherType `json:"object"` OptObject *AnotherType `json:"optObject"` ObjectArray []AnotherType `json:"objectArray"` OptObjectArray []*AnotherType `json:"optObjectArray"` } -type MethodArgsOptionalEnvMethod struct { +type ArgsOptionalEnvMethod struct { Object AnotherType `json:"object"` OptObject *AnotherType `json:"optObject"` ObjectArray []AnotherType `json:"objectArray"` OptObjectArray []*AnotherType `json:"optObjectArray"` } -type MethodArgsIf struct { +type ArgsIf struct { M_if Else `json:"if"` } diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/golang/001-sanity/module/module.go b/packages/test-cases/cases/cli/build-cmd/wasm/golang/001-sanity/module/module.go index 5517c49168..67c8df4810 100644 --- a/packages/test-cases/cases/cli/build-cmd/wasm/golang/001-sanity/module/module.go +++ b/packages/test-cases/cases/cli/build-cmd/wasm/golang/001-sanity/module/module.go @@ -2,6 +2,6 @@ package module import "example.com/go-wrap-test/module/wrap/types" -func Method(args *types.MethodArgsMethod) string { +func Method(args *types.ArgsMethod) string { return args.Arg } diff --git a/packages/test-cases/cases/cli/codegen/wasm/008-sanity-golang/module/module.go b/packages/test-cases/cases/cli/codegen/wasm/008-sanity-golang/module/module.go index 5517c49168..67c8df4810 100644 --- a/packages/test-cases/cases/cli/codegen/wasm/008-sanity-golang/module/module.go +++ b/packages/test-cases/cases/cli/codegen/wasm/008-sanity-golang/module/module.go @@ -2,6 +2,6 @@ package module import "example.com/go-wrap-test/module/wrap/types" -func Method(args *types.MethodArgsMethod) string { +func Method(args *types.ArgsMethod) string { return args.Arg } From 420114d999bbb1600413a099c522480341a200d2 Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Thu, 13 Jul 2023 05:28:14 +0200 Subject: [PATCH 63/65] chore: fix lint --- .../golang/transforms/moduleNeedsTypes.ts | 19 ++++++++++--------- .../schema/bind/src/bindings/golang/types.ts | 2 +- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/packages/schema/bind/src/bindings/golang/transforms/moduleNeedsTypes.ts b/packages/schema/bind/src/bindings/golang/transforms/moduleNeedsTypes.ts index 6e429f58ca..bf8b9db80e 100644 --- a/packages/schema/bind/src/bindings/golang/transforms/moduleNeedsTypes.ts +++ b/packages/schema/bind/src/bindings/golang/transforms/moduleNeedsTypes.ts @@ -1,11 +1,12 @@ +/* eslint-disable @typescript-eslint/naming-convention */ +import { isBaseType, isBuiltInType } from "../types"; + import { MethodDefinition, ModuleDefinition, } from "@polywrap/wrap-manifest-types-js"; import { AbiTransforms } from "@polywrap/schema-parse"; -import { isBaseType, isBuiltInType } from "../types"; - interface ModuleNeedsTypesState { moduleDefinition?: ModuleDefinition; needsTypes?: boolean; @@ -17,7 +18,7 @@ export function moduleNeedsTypes(): AbiTransforms { return { enter: { ModuleDefinition: (def: ModuleDefinition) => { - console.log("ENTER", def.type) + console.log("ENTER", def.type); state.moduleDefinition = def; state.needsTypes = false; return def; @@ -25,31 +26,31 @@ export function moduleNeedsTypes(): AbiTransforms { MethodDefinition: (def: MethodDefinition) => { console.log("METHOD", def.name); if (def.arguments && def.arguments.length > 0) { - console.log("NEEDS cause args") + console.log("NEEDS cause args"); state.needsTypes = true; } if (def.return) { const returnType = def.return.type; if (!isBaseType(returnType) && !isBuiltInType(returnType)) { - console.log("NEEDS cause ret") + console.log("NEEDS cause ret"); state.needsTypes = true; } } return def; - } + }, }, leave: { ModuleDefinition: (def: ModuleDefinition) => { - console.log("LEAVE", def.name) - const needsTypes = state.needsTypes + console.log("LEAVE", def.name); + const needsTypes = state.needsTypes; state.moduleDefinition = undefined; state.needsTypes = undefined; return { ...def, needsTypes, }; - } + }, }, }; } diff --git a/packages/schema/bind/src/bindings/golang/types.ts b/packages/schema/bind/src/bindings/golang/types.ts index bb55137c47..8c2087252d 100644 --- a/packages/schema/bind/src/bindings/golang/types.ts +++ b/packages/schema/bind/src/bindings/golang/types.ts @@ -35,4 +35,4 @@ export type BuiltInType = keyof BuiltInTypes; export function isBuiltInType(type: string): type is BuiltInType { return type in builtInTypes; -} \ No newline at end of file +} From 76847b78f162ad7bfbe89fbd6345890cbeb9b488 Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Thu, 13 Jul 2023 05:39:49 +0200 Subject: [PATCH 64/65] chore: remove old test-cases --- .../asyncify/abis/memory-storage.graphql | 5 - .../cases/wrappers/wasm-go/asyncify/go.mod | 7 -- .../cases/wrappers/wasm-go/asyncify/go.sum | 4 - .../wasm-go/asyncify/module/method.go | 107 ------------------ .../wasm-go/asyncify/polywrap.build.yaml | 5 - .../wrappers/wasm-go/asyncify/polywrap.yaml | 12 -- .../wrappers/wasm-go/asyncify/schema.graphql | 62 ---------- .../cases/wrappers/wasm-go/bigint-type/go.mod | 7 -- .../cases/wrappers/wasm-go/bigint-type/go.sum | 4 - .../wasm-go/bigint-type/module/method.go | 21 ---- .../wasm-go/bigint-type/polywrap.build.yaml | 5 - .../wasm-go/bigint-type/polywrap.yaml | 9 -- .../wasm-go/bigint-type/schema.graphql | 12 -- .../cases/wrappers/wasm-go/bytes-type/go.mod | 7 -- .../cases/wrappers/wasm-go/bytes-type/go.sum | 4 - .../wasm-go/bytes-type/module/bytesMethod.go | 18 --- .../wasm-go/bytes-type/polywrap.build.yaml | 6 - .../wrappers/wasm-go/bytes-type/polywrap.yaml | 9 -- .../wasm-go/bytes-type/schema.graphql | 9 -- .../cases/wrappers/wasm-go/enum-types/go.mod | 7 -- .../cases/wrappers/wasm-go/enum-types/go.sum | 4 - .../wasm-go/enum-types/module/module.go | 13 --- .../wasm-go/enum-types/polywrap.build.yaml | 4 - .../wrappers/wasm-go/enum-types/polywrap.yaml | 9 -- .../wasm-go/enum-types/schema.graphql | 17 --- .../wasm-go/env-types/external/go.mod | 7 -- .../wasm-go/env-types/external/go.sum | 4 - .../env-types/external/module/module.go | 8 -- .../env-types/external/polywrap.build.yaml | 4 - .../wasm-go/env-types/external/polywrap.yaml | 9 -- .../wasm-go/env-types/external/schema.graphql | 8 -- .../test-interface/polywrap.yaml | 6 - .../test-interface/schema.graphql | 13 --- .../implementations/test-use-getImpl/go.mod | 7 -- .../implementations/test-use-getImpl/go.sum | 4 - .../test-use-getImpl/module/module.go | 20 ---- .../test-use-getImpl/polywrap.build.yaml | 5 - .../test-use-getImpl/polywrap.yaml | 12 -- .../test-use-getImpl/schema.graphql | 13 --- .../implementations/test-wrapper/go.mod | 7 -- .../implementations/test-wrapper/go.sum | 4 - .../test-wrapper/module/module.go | 15 --- .../test-wrapper/polywrap.build.yaml | 3 - .../test-wrapper/polywrap.yaml | 12 -- .../test-wrapper/schema.graphql | 11 -- .../wrappers/wasm-go/invalid-types/go.mod | 7 -- .../wrappers/wasm-go/invalid-types/go.sum | 4 - .../wasm-go/invalid-types/module/module.go | 26 ----- .../wasm-go/invalid-types/polywrap.build.yaml | 3 - .../wasm-go/invalid-types/polywrap.yaml | 9 -- .../wasm-go/invalid-types/schema.graphql | 21 ---- .../cases/wrappers/wasm-go/json-type/go.mod | 8 -- .../cases/wrappers/wasm-go/json-type/go.sum | 4 - .../wasm-go/json-type/module/module.go | 40 ------- .../wasm-go/json-type/polywrap.build.yaml | 3 - .../wrappers/wasm-go/json-type/polywrap.yaml | 9 -- .../wrappers/wasm-go/json-type/schema.graphql | 24 ---- .../cases/wrappers/wasm-go/map-type/go.mod | 7 -- .../cases/wrappers/wasm-go/map-type/go.sum | 4 - .../wasm-go/map-type/module/module.go | 17 --- .../wasm-go/map-type/polywrap.build.yaml | 3 - .../wrappers/wasm-go/map-type/polywrap.yaml | 9 -- .../wrappers/wasm-go/map-type/schema.graphql | 18 --- .../wrappers/wasm-go/number-types/go.mod | 7 -- .../wrappers/wasm-go/number-types/go.sum | 4 - .../wasm-go/number-types/module/module.go | 29 ----- .../wasm-go/number-types/polywrap.build.yaml | 3 - .../wasm-go/number-types/polywrap.yaml | 9 -- .../wasm-go/number-types/schema.graphql | 32 ------ .../wrappers/wasm-go/object-types/go.mod | 7 -- .../wrappers/wasm-go/object-types/go.sum | 4 - .../wasm-go/object-types/module/module.go | 55 --------- .../wasm-go/object-types/polywrap.build.yaml | 3 - .../wasm-go/object-types/polywrap.yaml | 9 -- .../wasm-go/object-types/schema.graphql | 45 -------- 75 files changed, 962 deletions(-) delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/asyncify/abis/memory-storage.graphql delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/asyncify/go.mod delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/asyncify/go.sum delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/asyncify/module/method.go delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/asyncify/polywrap.build.yaml delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/asyncify/polywrap.yaml delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/asyncify/schema.graphql delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/bigint-type/go.mod delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/bigint-type/go.sum delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/bigint-type/module/method.go delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/bigint-type/polywrap.build.yaml delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/bigint-type/polywrap.yaml delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/bigint-type/schema.graphql delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/bytes-type/go.mod delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/bytes-type/go.sum delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/bytes-type/module/bytesMethod.go delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/bytes-type/polywrap.build.yaml delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/bytes-type/polywrap.yaml delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/bytes-type/schema.graphql delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/enum-types/go.mod delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/enum-types/go.sum delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/enum-types/module/module.go delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/enum-types/polywrap.build.yaml delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/enum-types/polywrap.yaml delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/enum-types/schema.graphql delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/env-types/external/go.mod delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/env-types/external/go.sum delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/env-types/external/module/module.go delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/env-types/external/polywrap.build.yaml delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/env-types/external/polywrap.yaml delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/env-types/external/schema.graphql delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/implementations/test-interface/polywrap.yaml delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/implementations/test-interface/schema.graphql delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/go.mod delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/go.sum delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/module/module.go delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/polywrap.build.yaml delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/polywrap.yaml delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/schema.graphql delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/go.mod delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/go.sum delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/module/module.go delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/polywrap.build.yaml delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/polywrap.yaml delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/schema.graphql delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/invalid-types/go.mod delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/invalid-types/go.sum delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/invalid-types/module/module.go delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/invalid-types/polywrap.build.yaml delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/invalid-types/polywrap.yaml delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/invalid-types/schema.graphql delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/json-type/go.mod delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/json-type/go.sum delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/json-type/module/module.go delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/json-type/polywrap.build.yaml delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/json-type/polywrap.yaml delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/json-type/schema.graphql delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/map-type/go.mod delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/map-type/go.sum delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/map-type/module/module.go delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/map-type/polywrap.build.yaml delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/map-type/polywrap.yaml delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/map-type/schema.graphql delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/number-types/go.mod delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/number-types/go.sum delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/number-types/module/module.go delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/number-types/polywrap.build.yaml delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/number-types/polywrap.yaml delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/number-types/schema.graphql delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/object-types/go.mod delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/object-types/go.sum delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/object-types/module/module.go delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/object-types/polywrap.build.yaml delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/object-types/polywrap.yaml delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/object-types/schema.graphql diff --git a/packages/test-cases/cases/wrappers/wasm-go/asyncify/abis/memory-storage.graphql b/packages/test-cases/cases/wrappers/wasm-go/asyncify/abis/memory-storage.graphql deleted file mode 100644 index c10ae67370..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/asyncify/abis/memory-storage.graphql +++ /dev/null @@ -1,5 +0,0 @@ -type Module { - getData: Int32! - - setData(value: Int32!): Boolean! -} diff --git a/packages/test-cases/cases/wrappers/wasm-go/asyncify/go.mod b/packages/test-cases/cases/wrappers/wasm-go/asyncify/go.mod deleted file mode 100644 index dbfd3f2ddf..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/asyncify/go.mod +++ /dev/null @@ -1,7 +0,0 @@ -module github.com/testorg/testrepo - -go 1.17 - -require github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba - -require github.com/valyala/fastjson v1.6.3 // indirect diff --git a/packages/test-cases/cases/wrappers/wasm-go/asyncify/go.sum b/packages/test-cases/cases/wrappers/wasm-go/asyncify/go.sum deleted file mode 100644 index 89ffed76d2..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/asyncify/go.sum +++ /dev/null @@ -1,4 +0,0 @@ -github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba h1:zalC+tj7u2wwOA53sJPvPwrIr6bgQF/5KiULuAi0tcE= -github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba/go.mod h1:IHk2chh2cl2rACqPLh5sE1LKTooxw19biP+zzYOiULg= -github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= -github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= diff --git a/packages/test-cases/cases/wrappers/wasm-go/asyncify/module/method.go b/packages/test-cases/cases/wrappers/wasm-go/asyncify/module/method.go deleted file mode 100644 index 636b37e9be..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/asyncify/module/method.go +++ /dev/null @@ -1,107 +0,0 @@ -package module - -import ( - "strconv" - - "github.com/testorg/testrepo/wrap/imported/storage" - "github.com/testorg/testrepo/wrap/types" -) - -//go:generate polywrap build -v -m ../polywrap.yaml -o ../build - -func GetData() uint32 { - res, err := storage.MethodGetData(nil) - if err != nil { - panic(err) - } - return uint32(res) -} - -func ReturnTrue() bool { - return true -} - -func SetDataWithLargeArgs(args *types.MethodArgsSetDataWithLargeArgs) string { - largeString := args.Value - num, err := strconv.ParseInt(largeString, 10, 32) - if err != nil { - panic(err) - } - _, err = storage.MethodSetData(&storage.ArgsSetData{Value: int32(num)}) - if err != nil { - panic(err) - } - return largeString -} - -func SetDataWithManyArgs(args *types.MethodArgsSetDataWithManyArgs) string { - argsA := args.ValueA - argsB := args.ValueB - argsC := args.ValueC - argsD := args.ValueD - argsE := args.ValueE - argsF := args.ValueF - argsG := args.ValueG - argsH := args.ValueH - argsI := args.ValueI - argsJ := args.ValueJ - argsK := args.ValueK - argsL := args.ValueL - - _, err := storage.MethodSetData(&storage.ArgsSetData{Value: 55}) - if err != nil { - panic(err) - } - - return argsA + argsB + argsC + argsD + argsE + argsF + argsG + argsH + argsI + argsJ + argsK + argsL -} - -func SetDataWithManyStructuredArgs(args *types.MethodArgsSetDataWithManyStructuredArgs) bool { - _, err := storage.MethodSetData(&storage.ArgsSetData{Value: 44}) - if err != nil { - panic(err) - } - return true -} - -func LocalVarMethod() bool { - functionArg := false - functionArg = ReturnTrue() - - _, err := storage.MethodSetData(&storage.ArgsSetData{Value: 88}) - if err != nil { - panic(err) - } - - return functionArg -} - -var globalValue bool = false - -func GlobalVarMethod() bool { - globalValue = true - - _, err := storage.MethodSetData(&storage.ArgsSetData{Value: 77}) - if err != nil { - panic(err) - } - - return globalValue -} - -func SubsequentInvokes(args *types.MethodArgsSubsequentInvokes) []string { - result := make([]string, args.NumberOfTimes) - for i := int32(0); i < args.NumberOfTimes; i++ { - _, err := storage.MethodSetData(&storage.ArgsSetData{Value: i}) - if err != nil { - panic(err) - } - res, err := storage.MethodGetData(nil) - if err != nil { - panic(err) - } - result[i] = strconv.FormatInt(int64(res), 10) - } - - return result -} diff --git a/packages/test-cases/cases/wrappers/wasm-go/asyncify/polywrap.build.yaml b/packages/test-cases/cases/wrappers/wasm-go/asyncify/polywrap.build.yaml deleted file mode 100644 index e768939364..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/asyncify/polywrap.build.yaml +++ /dev/null @@ -1,5 +0,0 @@ -format: 0.1.0 -docker: - name: asyncify-wasm-go -config: - node_version: "16.13.0" diff --git a/packages/test-cases/cases/wrappers/wasm-go/asyncify/polywrap.yaml b/packages/test-cases/cases/wrappers/wasm-go/asyncify/polywrap.yaml deleted file mode 100644 index 374d0c2aae..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/asyncify/polywrap.yaml +++ /dev/null @@ -1,12 +0,0 @@ -format: 0.2.0 -project: - name: Asyncify - type: wasm/golang -source: - schema: ./schema.graphql - module: ./go.mod - import_abis: - - uri: "ens/memory-storage.polywrap.eth" - abi: ./abis/memory-storage.graphql -extensions: - build: ./polywrap.build.yaml \ No newline at end of file diff --git a/packages/test-cases/cases/wrappers/wasm-go/asyncify/schema.graphql b/packages/test-cases/cases/wrappers/wasm-go/asyncify/schema.graphql deleted file mode 100644 index 2660ba2f06..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/asyncify/schema.graphql +++ /dev/null @@ -1,62 +0,0 @@ -#import { Module } into Storage from "wrap://ens/memory-storage.polywrap.eth" - -type Module { - getData: UInt32! - - setDataWithLargeArgs( - value: String! - ): String! - - setDataWithManyArgs( - valueA: String! - valueB: String! - valueC: String! - valueD: String! - valueE: String! - valueF: String! - valueG: String! - valueH: String! - valueI: String! - valueJ: String! - valueK: String! - valueL: String! - ): String! - - setDataWithManyStructuredArgs( - valueA: BigObj! - valueB: BigObj! - valueC: BigObj! - valueD: BigObj! - valueE: BigObj! - valueF: BigObj! - valueG: BigObj! - valueH: BigObj! - valueI: BigObj! - valueJ: BigObj! - valueK: BigObj! - valueL: BigObj! - ): Boolean! - - localVarMethod: Boolean! - - globalVarMethod: Boolean! - - subsequentInvokes( - numberOfTimes: Int! - ): [String!]! -} - -type BigObj { - propA: String! - propB: String! - propC: String! - propD: String! - propE: String! - propF: String! - propG: String! - propH: String! - propI: String! - propJ: String! - propK: String! - propL: String! -} diff --git a/packages/test-cases/cases/wrappers/wasm-go/bigint-type/go.mod b/packages/test-cases/cases/wrappers/wasm-go/bigint-type/go.mod deleted file mode 100644 index dbfd3f2ddf..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/bigint-type/go.mod +++ /dev/null @@ -1,7 +0,0 @@ -module github.com/testorg/testrepo - -go 1.17 - -require github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba - -require github.com/valyala/fastjson v1.6.3 // indirect diff --git a/packages/test-cases/cases/wrappers/wasm-go/bigint-type/go.sum b/packages/test-cases/cases/wrappers/wasm-go/bigint-type/go.sum deleted file mode 100644 index 89ffed76d2..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/bigint-type/go.sum +++ /dev/null @@ -1,4 +0,0 @@ -github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba h1:zalC+tj7u2wwOA53sJPvPwrIr6bgQF/5KiULuAi0tcE= -github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba/go.mod h1:IHk2chh2cl2rACqPLh5sE1LKTooxw19biP+zzYOiULg= -github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= -github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= diff --git a/packages/test-cases/cases/wrappers/wasm-go/bigint-type/module/method.go b/packages/test-cases/cases/wrappers/wasm-go/bigint-type/module/method.go deleted file mode 100644 index 0b0b81b7d4..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/bigint-type/module/method.go +++ /dev/null @@ -1,21 +0,0 @@ -package module - -import ( - "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" - "github.com/testorg/testrepo/wrap/types" -) - -//go:generate polywrap build -v -m ../polywrap.yaml -o ../build -func Method(args *types.MethodArgsMethod) *big.Int { - result := new(big.Int).Mul(args.Arg1, args.Obj.Prop1) - - if args.Arg2 != nil { - result = result.Mul(result, args.Arg2) - } - - if args.Obj.Prop2 != nil { - result = result.Mul(result, args.Obj.Prop2) - } - - return result -} diff --git a/packages/test-cases/cases/wrappers/wasm-go/bigint-type/polywrap.build.yaml b/packages/test-cases/cases/wrappers/wasm-go/bigint-type/polywrap.build.yaml deleted file mode 100644 index 46c036809b..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/bigint-type/polywrap.build.yaml +++ /dev/null @@ -1,5 +0,0 @@ -format: 0.1.0 -docker: - name: bigint-type-wasm-go -config: - node_version: "16.13.0" diff --git a/packages/test-cases/cases/wrappers/wasm-go/bigint-type/polywrap.yaml b/packages/test-cases/cases/wrappers/wasm-go/bigint-type/polywrap.yaml deleted file mode 100644 index bea7b6b71b..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/bigint-type/polywrap.yaml +++ /dev/null @@ -1,9 +0,0 @@ -format: 0.2.0 -project: - name: BigInt - type: wasm/golang -source: - schema: ./schema.graphql - module: ./go.mod -extensions: - build: ./polywrap.build.yaml \ No newline at end of file diff --git a/packages/test-cases/cases/wrappers/wasm-go/bigint-type/schema.graphql b/packages/test-cases/cases/wrappers/wasm-go/bigint-type/schema.graphql deleted file mode 100644 index 7696ac2202..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/bigint-type/schema.graphql +++ /dev/null @@ -1,12 +0,0 @@ -type Module { - method( - arg1: BigInt! - arg2: BigInt - obj: BigIntArg! - ): BigInt! -} - -type BigIntArg { - prop1: BigInt! - prop2: BigInt -} diff --git a/packages/test-cases/cases/wrappers/wasm-go/bytes-type/go.mod b/packages/test-cases/cases/wrappers/wasm-go/bytes-type/go.mod deleted file mode 100644 index dbfd3f2ddf..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/bytes-type/go.mod +++ /dev/null @@ -1,7 +0,0 @@ -module github.com/testorg/testrepo - -go 1.17 - -require github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba - -require github.com/valyala/fastjson v1.6.3 // indirect diff --git a/packages/test-cases/cases/wrappers/wasm-go/bytes-type/go.sum b/packages/test-cases/cases/wrappers/wasm-go/bytes-type/go.sum deleted file mode 100644 index 89ffed76d2..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/bytes-type/go.sum +++ /dev/null @@ -1,4 +0,0 @@ -github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba h1:zalC+tj7u2wwOA53sJPvPwrIr6bgQF/5KiULuAi0tcE= -github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba/go.mod h1:IHk2chh2cl2rACqPLh5sE1LKTooxw19biP+zzYOiULg= -github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= -github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= diff --git a/packages/test-cases/cases/wrappers/wasm-go/bytes-type/module/bytesMethod.go b/packages/test-cases/cases/wrappers/wasm-go/bytes-type/module/bytesMethod.go deleted file mode 100644 index c57eba5f50..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/bytes-type/module/bytesMethod.go +++ /dev/null @@ -1,18 +0,0 @@ -package module - -import ( - "bytes" - - "github.com/testorg/testrepo/wrap/types" -) - -//go:generate polywrap build -v -m ../polywrap.yaml -o ../build -func BytesMethod(args *types.MethodArgsBytesMethod) []byte { - return bytes.Join( - [][]byte{ - args.Arg.Prop, - []byte("Sanity!"), - }, - []byte(" "), - ) -} diff --git a/packages/test-cases/cases/wrappers/wasm-go/bytes-type/polywrap.build.yaml b/packages/test-cases/cases/wrappers/wasm-go/bytes-type/polywrap.build.yaml deleted file mode 100644 index 2657f101fd..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/bytes-type/polywrap.build.yaml +++ /dev/null @@ -1,6 +0,0 @@ -format: 0.1.0 -docker: - name: bytes-type-wasm-go -config: - node_version: "16.13.0" - diff --git a/packages/test-cases/cases/wrappers/wasm-go/bytes-type/polywrap.yaml b/packages/test-cases/cases/wrappers/wasm-go/bytes-type/polywrap.yaml deleted file mode 100644 index 292392bba4..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/bytes-type/polywrap.yaml +++ /dev/null @@ -1,9 +0,0 @@ -format: 0.2.0 -project: - name: BytesType - type: wasm/golang -source: - schema: ./schema.graphql - module: ./go.mod -extensions: - build: ./polywrap.build.yaml \ No newline at end of file diff --git a/packages/test-cases/cases/wrappers/wasm-go/bytes-type/schema.graphql b/packages/test-cases/cases/wrappers/wasm-go/bytes-type/schema.graphql deleted file mode 100644 index 44dc183585..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/bytes-type/schema.graphql +++ /dev/null @@ -1,9 +0,0 @@ -type Module { - bytesMethod( - arg: Args! - ): Bytes! -} - -type Args { - prop: Bytes! -} diff --git a/packages/test-cases/cases/wrappers/wasm-go/enum-types/go.mod b/packages/test-cases/cases/wrappers/wasm-go/enum-types/go.mod deleted file mode 100644 index dbfd3f2ddf..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/enum-types/go.mod +++ /dev/null @@ -1,7 +0,0 @@ -module github.com/testorg/testrepo - -go 1.17 - -require github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba - -require github.com/valyala/fastjson v1.6.3 // indirect diff --git a/packages/test-cases/cases/wrappers/wasm-go/enum-types/go.sum b/packages/test-cases/cases/wrappers/wasm-go/enum-types/go.sum deleted file mode 100644 index 89ffed76d2..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/enum-types/go.sum +++ /dev/null @@ -1,4 +0,0 @@ -github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba h1:zalC+tj7u2wwOA53sJPvPwrIr6bgQF/5KiULuAi0tcE= -github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba/go.mod h1:IHk2chh2cl2rACqPLh5sE1LKTooxw19biP+zzYOiULg= -github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= -github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= diff --git a/packages/test-cases/cases/wrappers/wasm-go/enum-types/module/module.go b/packages/test-cases/cases/wrappers/wasm-go/enum-types/module/module.go deleted file mode 100644 index 9e91033414..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/enum-types/module/module.go +++ /dev/null @@ -1,13 +0,0 @@ -package module - -import "github.com/testorg/testrepo/wrap/types" - -//go:generate polywrap build -v -m ../polywrap.yaml -o ../build - -func Method1(args *types.MethodArgsMethod1) types.SanityEnum { - return args.En -} - -func Method2(args *types.MethodArgsMethod2) []types.SanityEnum { - return args.EnumArray -} diff --git a/packages/test-cases/cases/wrappers/wasm-go/enum-types/polywrap.build.yaml b/packages/test-cases/cases/wrappers/wasm-go/enum-types/polywrap.build.yaml deleted file mode 100644 index f41ac3765e..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/enum-types/polywrap.build.yaml +++ /dev/null @@ -1,4 +0,0 @@ -format: 0.1.0 -config: - node_version: "16.13.0" - diff --git a/packages/test-cases/cases/wrappers/wasm-go/enum-types/polywrap.yaml b/packages/test-cases/cases/wrappers/wasm-go/enum-types/polywrap.yaml deleted file mode 100644 index 49939f942e..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/enum-types/polywrap.yaml +++ /dev/null @@ -1,9 +0,0 @@ -format: 0.2.0 -project: - name: EnumTypes - type: wasm/golang -source: - schema: ./schema.graphql - module: ./go.mod -extensions: - build: ./polywrap.build.yaml \ No newline at end of file diff --git a/packages/test-cases/cases/wrappers/wasm-go/enum-types/schema.graphql b/packages/test-cases/cases/wrappers/wasm-go/enum-types/schema.graphql deleted file mode 100644 index 3bfbc465be..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/enum-types/schema.graphql +++ /dev/null @@ -1,17 +0,0 @@ -type Module { - method1( - en: SanityEnum! - optEnum: SanityEnum - ): SanityEnum! - - method2( - enumArray: [SanityEnum!]! - optEnumArray: [SanityEnum] - ): [SanityEnum!]! -} - -enum SanityEnum { - OPTION1 - OPTION2 - OPTION3 -} diff --git a/packages/test-cases/cases/wrappers/wasm-go/env-types/external/go.mod b/packages/test-cases/cases/wrappers/wasm-go/env-types/external/go.mod deleted file mode 100644 index dbfd3f2ddf..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/env-types/external/go.mod +++ /dev/null @@ -1,7 +0,0 @@ -module github.com/testorg/testrepo - -go 1.17 - -require github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba - -require github.com/valyala/fastjson v1.6.3 // indirect diff --git a/packages/test-cases/cases/wrappers/wasm-go/env-types/external/go.sum b/packages/test-cases/cases/wrappers/wasm-go/env-types/external/go.sum deleted file mode 100644 index 89ffed76d2..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/env-types/external/go.sum +++ /dev/null @@ -1,4 +0,0 @@ -github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba h1:zalC+tj7u2wwOA53sJPvPwrIr6bgQF/5KiULuAi0tcE= -github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba/go.mod h1:IHk2chh2cl2rACqPLh5sE1LKTooxw19biP+zzYOiULg= -github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= -github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= diff --git a/packages/test-cases/cases/wrappers/wasm-go/env-types/external/module/module.go b/packages/test-cases/cases/wrappers/wasm-go/env-types/external/module/module.go deleted file mode 100644 index 63caecec92..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/env-types/external/module/module.go +++ /dev/null @@ -1,8 +0,0 @@ -package module - -import "github.com/testorg/testrepo/wrap/types" - -//go:generate polywrap build -v -m ../polywrap.yaml -o ../build -func ExternalEnvMethod(env *types.Env) types.Env { - return *env -} diff --git a/packages/test-cases/cases/wrappers/wasm-go/env-types/external/polywrap.build.yaml b/packages/test-cases/cases/wrappers/wasm-go/env-types/external/polywrap.build.yaml deleted file mode 100644 index f41ac3765e..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/env-types/external/polywrap.build.yaml +++ /dev/null @@ -1,4 +0,0 @@ -format: 0.1.0 -config: - node_version: "16.13.0" - diff --git a/packages/test-cases/cases/wrappers/wasm-go/env-types/external/polywrap.yaml b/packages/test-cases/cases/wrappers/wasm-go/env-types/external/polywrap.yaml deleted file mode 100644 index 065819aec2..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/env-types/external/polywrap.yaml +++ /dev/null @@ -1,9 +0,0 @@ -format: 0.2.0 -project: - name: EnvTypeExternal - type: wasm/golang -source: - schema: ./schema.graphql - module: ./go.mod -extensions: - build: ./polywrap.build.yaml \ No newline at end of file diff --git a/packages/test-cases/cases/wrappers/wasm-go/env-types/external/schema.graphql b/packages/test-cases/cases/wrappers/wasm-go/env-types/external/schema.graphql deleted file mode 100644 index d2325113e2..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/env-types/external/schema.graphql +++ /dev/null @@ -1,8 +0,0 @@ -type Env { - externalArray: [UInt32!]! - externalString: String! -} - -type Module { - externalEnvMethod: Env! @env(required: true) -} diff --git a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-interface/polywrap.yaml b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-interface/polywrap.yaml deleted file mode 100644 index b2e18e3c2f..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-interface/polywrap.yaml +++ /dev/null @@ -1,6 +0,0 @@ -format: 0.2.0 -project: - name: TestInterface - type: interface -source: - schema: ./schema.graphql diff --git a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-interface/schema.graphql b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-interface/schema.graphql deleted file mode 100644 index b80a6e620b..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-interface/schema.graphql +++ /dev/null @@ -1,13 +0,0 @@ -type Module { - abstractModuleMethod( - arg: Argument! - ): String! -} - -type Argument { - str: String! -} - -type InterfaceType { - uint8: UInt8! -} \ No newline at end of file diff --git a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/go.mod b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/go.mod deleted file mode 100644 index dbfd3f2ddf..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/go.mod +++ /dev/null @@ -1,7 +0,0 @@ -module github.com/testorg/testrepo - -go 1.17 - -require github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba - -require github.com/valyala/fastjson v1.6.3 // indirect diff --git a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/go.sum b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/go.sum deleted file mode 100644 index 89ffed76d2..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/go.sum +++ /dev/null @@ -1,4 +0,0 @@ -github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba h1:zalC+tj7u2wwOA53sJPvPwrIr6bgQF/5KiULuAi0tcE= -github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba/go.mod h1:IHk2chh2cl2rACqPLh5sE1LKTooxw19biP+zzYOiULg= -github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= -github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= diff --git a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/module/module.go b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/module/module.go deleted file mode 100644 index 9e4d85a0b2..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/module/module.go +++ /dev/null @@ -1,20 +0,0 @@ -package module - -import ( - "github.com/testorg/testrepo/wrap/interfaces" - "github.com/testorg/testrepo/wrap/types" -) - -//go:generate polywrap build -v -m ../polywrap.yaml -o ../build - -func ModuleImplementations() []string { - return interfaces.InterfaceImplementations() -} - -func ModuleMethod(args *types.MethodArgsModuleMethod) types.ImplementationType { - return args.Arg -} - -func AbstractModuleMethod(args *types.MethodArgsAbstractModuleMethod) string { - return args.Arg.Str -} diff --git a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/polywrap.build.yaml b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/polywrap.build.yaml deleted file mode 100644 index a7ca19eefa..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/polywrap.build.yaml +++ /dev/null @@ -1,5 +0,0 @@ -format: 0.1.0 -docker: - name: test-use-get-impl-wasm-as -config: - node_version: "16.13.0" diff --git a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/polywrap.yaml b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/polywrap.yaml deleted file mode 100644 index 7d275c3de4..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/polywrap.yaml +++ /dev/null @@ -1,12 +0,0 @@ -format: 0.2.0 -project: - name: TestUseGetImpl - type: wasm/golang -source: - schema: ./schema.graphql - module: ./go.mod - import_abis: - - uri: wrap://ens/interface.eth - abi: ../test-interface/build/wrap.info -extensions: - build: ./polywrap.build.yaml diff --git a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/schema.graphql b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/schema.graphql deleted file mode 100644 index bd51ae7828..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/schema.graphql +++ /dev/null @@ -1,13 +0,0 @@ -#import { Module, InterfaceType } into Interface from "wrap://ens/interface.eth" -#use { getImplementations } for Interface - -type Module implements Interface_Module { - moduleImplementations: [String!]! - moduleMethod( - arg: ImplementationType! - ): ImplementationType! -} - -type ImplementationType implements Interface_InterfaceType { - str: String! -} \ No newline at end of file diff --git a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/go.mod b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/go.mod deleted file mode 100644 index dbfd3f2ddf..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/go.mod +++ /dev/null @@ -1,7 +0,0 @@ -module github.com/testorg/testrepo - -go 1.17 - -require github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba - -require github.com/valyala/fastjson v1.6.3 // indirect diff --git a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/go.sum b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/go.sum deleted file mode 100644 index 89ffed76d2..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/go.sum +++ /dev/null @@ -1,4 +0,0 @@ -github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba h1:zalC+tj7u2wwOA53sJPvPwrIr6bgQF/5KiULuAi0tcE= -github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba/go.mod h1:IHk2chh2cl2rACqPLh5sE1LKTooxw19biP+zzYOiULg= -github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= -github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= diff --git a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/module/module.go b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/module/module.go deleted file mode 100644 index 53dcaeb681..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/module/module.go +++ /dev/null @@ -1,15 +0,0 @@ -package module - -import ( - "github.com/testorg/testrepo/wrap/types" -) - -//go:generate polywrap build -v -m ../polywrap.yaml -o ../build - -func ModuleMethod(args *types.MethodArgsModuleMethod) types.ImplementationType { - return args.Arg -} - -func AbstractModuleMethod(args *types.MethodArgsAbstractModuleMethod) string { - return args.Arg.Str -} diff --git a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/polywrap.build.yaml b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/polywrap.build.yaml deleted file mode 100644 index aa5f7201ed..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/polywrap.build.yaml +++ /dev/null @@ -1,3 +0,0 @@ -format: 0.1.0 -config: - node_version: "16.13.0" diff --git a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/polywrap.yaml b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/polywrap.yaml deleted file mode 100644 index c9fafb06d2..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/polywrap.yaml +++ /dev/null @@ -1,12 +0,0 @@ -format: 0.2.0 -project: - name: TestWrapper - type: wasm/golang -source: - schema: ./schema.graphql - module: ./go.mod - import_abis: - - uri: wrap://ens/interface.eth - abi: ../test-interface/build/wrap.info -extensions: - build: ./polywrap.build.yaml diff --git a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/schema.graphql b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/schema.graphql deleted file mode 100644 index 0b28cfb495..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/schema.graphql +++ /dev/null @@ -1,11 +0,0 @@ -#import { Module, InterfaceType } into Interface from "wrap://ens/interface.eth" - -type Module implements Interface_Module { - moduleMethod( - arg: ImplementationType! - ): ImplementationType! -} - -type ImplementationType implements Interface_InterfaceType { - str: String! -} \ No newline at end of file diff --git a/packages/test-cases/cases/wrappers/wasm-go/invalid-types/go.mod b/packages/test-cases/cases/wrappers/wasm-go/invalid-types/go.mod deleted file mode 100644 index dbfd3f2ddf..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/invalid-types/go.mod +++ /dev/null @@ -1,7 +0,0 @@ -module github.com/testorg/testrepo - -go 1.17 - -require github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba - -require github.com/valyala/fastjson v1.6.3 // indirect diff --git a/packages/test-cases/cases/wrappers/wasm-go/invalid-types/go.sum b/packages/test-cases/cases/wrappers/wasm-go/invalid-types/go.sum deleted file mode 100644 index 89ffed76d2..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/invalid-types/go.sum +++ /dev/null @@ -1,4 +0,0 @@ -github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba h1:zalC+tj7u2wwOA53sJPvPwrIr6bgQF/5KiULuAi0tcE= -github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba/go.mod h1:IHk2chh2cl2rACqPLh5sE1LKTooxw19biP+zzYOiULg= -github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= -github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= diff --git a/packages/test-cases/cases/wrappers/wasm-go/invalid-types/module/module.go b/packages/test-cases/cases/wrappers/wasm-go/invalid-types/module/module.go deleted file mode 100644 index 5981ee38b3..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/invalid-types/module/module.go +++ /dev/null @@ -1,26 +0,0 @@ -package module - -import ( - "github.com/testorg/testrepo/wrap/types" -) - -//go:generate polywrap build -v -m ../polywrap.yaml -o ../build -func BoolMethod(args *types.MethodArgsBoolMethod) bool { - return args.Arg -} - -func IntMethod(args *types.MethodArgsIntMethod) int32 { - return args.Arg -} - -func UIntMethod(args *types.MethodArgsUIntMethod) uint32 { - return args.Arg -} - -func BytesMethod(args *types.MethodArgsBytesMethod) []byte { - return args.Arg -} - -func ArrayMethod(args *types.MethodArgsArrayMethod) []string { - return args.Arg -} diff --git a/packages/test-cases/cases/wrappers/wasm-go/invalid-types/polywrap.build.yaml b/packages/test-cases/cases/wrappers/wasm-go/invalid-types/polywrap.build.yaml deleted file mode 100644 index aa5f7201ed..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/invalid-types/polywrap.build.yaml +++ /dev/null @@ -1,3 +0,0 @@ -format: 0.1.0 -config: - node_version: "16.13.0" diff --git a/packages/test-cases/cases/wrappers/wasm-go/invalid-types/polywrap.yaml b/packages/test-cases/cases/wrappers/wasm-go/invalid-types/polywrap.yaml deleted file mode 100644 index 5b2b05d01b..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/invalid-types/polywrap.yaml +++ /dev/null @@ -1,9 +0,0 @@ -format: 0.2.0 -project: - name: InvalidTypes - type: wasm/golang -source: - schema: ./schema.graphql - module: ./go.mod -extensions: - build: ./polywrap.build.yaml diff --git a/packages/test-cases/cases/wrappers/wasm-go/invalid-types/schema.graphql b/packages/test-cases/cases/wrappers/wasm-go/invalid-types/schema.graphql deleted file mode 100644 index 5df1ac9c73..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/invalid-types/schema.graphql +++ /dev/null @@ -1,21 +0,0 @@ -type Module { - boolMethod( - arg: Boolean! - ): Boolean! - - intMethod( - arg: Int32! - ): Int32! - - uIntMethod( - arg: UInt32! - ): UInt32! - - bytesMethod( - arg: Bytes! - ): Bytes! - - arrayMethod( - arg: [String!]! - ): [String!] -} diff --git a/packages/test-cases/cases/wrappers/wasm-go/json-type/go.mod b/packages/test-cases/cases/wrappers/wasm-go/json-type/go.mod deleted file mode 100644 index 6018d3c1c5..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/json-type/go.mod +++ /dev/null @@ -1,8 +0,0 @@ -module github.com/testorg/testrepo - -go 1.17 - -require ( - github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba - github.com/valyala/fastjson v1.6.3 -) diff --git a/packages/test-cases/cases/wrappers/wasm-go/json-type/go.sum b/packages/test-cases/cases/wrappers/wasm-go/json-type/go.sum deleted file mode 100644 index 89ffed76d2..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/json-type/go.sum +++ /dev/null @@ -1,4 +0,0 @@ -github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba h1:zalC+tj7u2wwOA53sJPvPwrIr6bgQF/5KiULuAi0tcE= -github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba/go.mod h1:IHk2chh2cl2rACqPLh5sE1LKTooxw19biP+zzYOiULg= -github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= -github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= diff --git a/packages/test-cases/cases/wrappers/wasm-go/json-type/module/module.go b/packages/test-cases/cases/wrappers/wasm-go/json-type/module/module.go deleted file mode 100644 index 62ab2b2d04..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/json-type/module/module.go +++ /dev/null @@ -1,40 +0,0 @@ -package module - -import ( - "github.com/testorg/testrepo/wrap/types" - "github.com/valyala/fastjson" -) - -//go:generate polywrap build -v -m ../polywrap.yaml -o ../build - -func Parse(args *types.MethodArgsParse) *fastjson.Value { - return fastjson.MustParse(args.Value) -} - -func Stringify(args *types.MethodArgsStringify) string { - str := "" - for i := range args.Values { - str += args.Values[i].String() - } - return str -} - -func StringifyObject(args *types.MethodArgsStringifyObject) string { - str := "" - str += args.Object.JsonA.String() - str += args.Object.JsonB.String() - return str -} - -func MethodJSON(args *types.MethodArgsMethodJSON) *fastjson.Value { - arena := new(fastjson.Arena) - result := arena.NewObject() - result.Set("valueA", arena.NewNumberInt(int(args.ValueA))) - result.Set("valueB", arena.NewString(args.ValueB)) - if args.ValueC { - result.Set("valueC", arena.NewTrue()) - } else { - result.Set("valueC", arena.NewFalse()) - } - return result -} diff --git a/packages/test-cases/cases/wrappers/wasm-go/json-type/polywrap.build.yaml b/packages/test-cases/cases/wrappers/wasm-go/json-type/polywrap.build.yaml deleted file mode 100644 index aa5f7201ed..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/json-type/polywrap.build.yaml +++ /dev/null @@ -1,3 +0,0 @@ -format: 0.1.0 -config: - node_version: "16.13.0" diff --git a/packages/test-cases/cases/wrappers/wasm-go/json-type/polywrap.yaml b/packages/test-cases/cases/wrappers/wasm-go/json-type/polywrap.yaml deleted file mode 100644 index 91efb8d20a..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/json-type/polywrap.yaml +++ /dev/null @@ -1,9 +0,0 @@ -format: 0.2.0 -project: - name: JsonType - type: wasm/golang -source: - schema: ./schema.graphql - module: ./go.mod -extensions: - build: ./polywrap.build.yaml diff --git a/packages/test-cases/cases/wrappers/wasm-go/json-type/schema.graphql b/packages/test-cases/cases/wrappers/wasm-go/json-type/schema.graphql deleted file mode 100644 index cb60b87271..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/json-type/schema.graphql +++ /dev/null @@ -1,24 +0,0 @@ -type Module { - parse( - value: String! - ): JSON! - - stringify( - values: [JSON!]! - ): String! - - stringifyObject( - object: Object! - ): String! - - methodJSON( - valueA: Int! - valueB: String! - valueC: Boolean! - ): JSON! -} - -type Object { - jsonA: JSON! - jsonB: JSON! -} \ No newline at end of file diff --git a/packages/test-cases/cases/wrappers/wasm-go/map-type/go.mod b/packages/test-cases/cases/wrappers/wasm-go/map-type/go.mod deleted file mode 100644 index dbfd3f2ddf..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/map-type/go.mod +++ /dev/null @@ -1,7 +0,0 @@ -module github.com/testorg/testrepo - -go 1.17 - -require github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba - -require github.com/valyala/fastjson v1.6.3 // indirect diff --git a/packages/test-cases/cases/wrappers/wasm-go/map-type/go.sum b/packages/test-cases/cases/wrappers/wasm-go/map-type/go.sum deleted file mode 100644 index 89ffed76d2..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/map-type/go.sum +++ /dev/null @@ -1,4 +0,0 @@ -github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba h1:zalC+tj7u2wwOA53sJPvPwrIr6bgQF/5KiULuAi0tcE= -github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba/go.mod h1:IHk2chh2cl2rACqPLh5sE1LKTooxw19biP+zzYOiULg= -github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= -github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= diff --git a/packages/test-cases/cases/wrappers/wasm-go/map-type/module/module.go b/packages/test-cases/cases/wrappers/wasm-go/map-type/module/module.go deleted file mode 100644 index 511395f40e..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/map-type/module/module.go +++ /dev/null @@ -1,17 +0,0 @@ -package module - -import "github.com/testorg/testrepo/wrap/types" - -//go:generate polywrap build -v -m ../polywrap.yaml -o ../build - -func GetKey(args *types.MethodArgsGetKey) int32 { - return args.Foo.M_map[args.Key] -} - -func ReturnMap(args *types.MethodArgsReturnMap) map[string]int32 { - return args.M_map -} - -func ReturnCustomMap(args *types.MethodArgsReturnCustomMap) types.CustomMap { - return args.Foo -} diff --git a/packages/test-cases/cases/wrappers/wasm-go/map-type/polywrap.build.yaml b/packages/test-cases/cases/wrappers/wasm-go/map-type/polywrap.build.yaml deleted file mode 100644 index aa5f7201ed..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/map-type/polywrap.build.yaml +++ /dev/null @@ -1,3 +0,0 @@ -format: 0.1.0 -config: - node_version: "16.13.0" diff --git a/packages/test-cases/cases/wrappers/wasm-go/map-type/polywrap.yaml b/packages/test-cases/cases/wrappers/wasm-go/map-type/polywrap.yaml deleted file mode 100644 index 292392bba4..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/map-type/polywrap.yaml +++ /dev/null @@ -1,9 +0,0 @@ -format: 0.2.0 -project: - name: BytesType - type: wasm/golang -source: - schema: ./schema.graphql - module: ./go.mod -extensions: - build: ./polywrap.build.yaml \ No newline at end of file diff --git a/packages/test-cases/cases/wrappers/wasm-go/map-type/schema.graphql b/packages/test-cases/cases/wrappers/wasm-go/map-type/schema.graphql deleted file mode 100644 index b79ca553c5..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/map-type/schema.graphql +++ /dev/null @@ -1,18 +0,0 @@ -type Module { - getKey( - key: String! - foo: CustomMap! - ): Int! - - returnMap( - map: Map! @annotate(type: "Map!") - ): Map! @annotate(type: "Map!") - - returnCustomMap( - foo: CustomMap! - ): CustomMap! -} - -type CustomMap { - map: Map! @annotate(type: "Map!") -} diff --git a/packages/test-cases/cases/wrappers/wasm-go/number-types/go.mod b/packages/test-cases/cases/wrappers/wasm-go/number-types/go.mod deleted file mode 100644 index dbfd3f2ddf..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/number-types/go.mod +++ /dev/null @@ -1,7 +0,0 @@ -module github.com/testorg/testrepo - -go 1.17 - -require github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba - -require github.com/valyala/fastjson v1.6.3 // indirect diff --git a/packages/test-cases/cases/wrappers/wasm-go/number-types/go.sum b/packages/test-cases/cases/wrappers/wasm-go/number-types/go.sum deleted file mode 100644 index 89ffed76d2..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/number-types/go.sum +++ /dev/null @@ -1,4 +0,0 @@ -github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba h1:zalC+tj7u2wwOA53sJPvPwrIr6bgQF/5KiULuAi0tcE= -github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba/go.mod h1:IHk2chh2cl2rACqPLh5sE1LKTooxw19biP+zzYOiULg= -github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= -github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= diff --git a/packages/test-cases/cases/wrappers/wasm-go/number-types/module/module.go b/packages/test-cases/cases/wrappers/wasm-go/number-types/module/module.go deleted file mode 100644 index 35be7fc298..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/number-types/module/module.go +++ /dev/null @@ -1,29 +0,0 @@ -package module - -import "github.com/testorg/testrepo/wrap/types" - -//go:generate polywrap build -v -m ../polywrap.yaml -o ../build - -func I8Method(args *types.MethodArgsI8Method) int8 { - return args.First + args.Second -} - -func U8Method(args *types.MethodArgsU8Method) uint8 { - return args.First + args.Second -} - -func I16Method(args *types.MethodArgsI16Method) int16 { - return args.First + args.Second -} - -func U16Method(args *types.MethodArgsU16Method) uint16 { - return args.First + args.Second -} - -func I32Method(args *types.MethodArgsI32Method) int32 { - return args.First + args.Second -} - -func U32Method(args *types.MethodArgsU32Method) uint32 { - return args.First + args.Second -} diff --git a/packages/test-cases/cases/wrappers/wasm-go/number-types/polywrap.build.yaml b/packages/test-cases/cases/wrappers/wasm-go/number-types/polywrap.build.yaml deleted file mode 100644 index d16e9c9f18..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/number-types/polywrap.build.yaml +++ /dev/null @@ -1,3 +0,0 @@ -format: 0.1.0 -config: - node_version: "16.13.0" \ No newline at end of file diff --git a/packages/test-cases/cases/wrappers/wasm-go/number-types/polywrap.yaml b/packages/test-cases/cases/wrappers/wasm-go/number-types/polywrap.yaml deleted file mode 100644 index cbef1cd38d..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/number-types/polywrap.yaml +++ /dev/null @@ -1,9 +0,0 @@ -format: 0.2.0 -project: - name: NumberTypes - type: wasm/golang -source: - schema: ./schema.graphql - module: ./go.mod -extensions: - build: ./polywrap.build.yaml \ No newline at end of file diff --git a/packages/test-cases/cases/wrappers/wasm-go/number-types/schema.graphql b/packages/test-cases/cases/wrappers/wasm-go/number-types/schema.graphql deleted file mode 100644 index 81d5005b5a..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/number-types/schema.graphql +++ /dev/null @@ -1,32 +0,0 @@ -type Module { - - i8Method( - first: Int8! - second: Int8! - ): Int8! - - u8Method( - first: UInt8! - second: UInt8! - ): UInt8! - - i16Method( - first: Int16! - second: Int16! - ): Int16! - - u16Method( - first: UInt16! - second: UInt16! - ): UInt16! - - i32Method( - first: Int! - second: Int! - ): Int! - - u32Method( - first: UInt32! - second: UInt32! - ): UInt32! -} \ No newline at end of file diff --git a/packages/test-cases/cases/wrappers/wasm-go/object-types/go.mod b/packages/test-cases/cases/wrappers/wasm-go/object-types/go.mod deleted file mode 100644 index dbfd3f2ddf..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/object-types/go.mod +++ /dev/null @@ -1,7 +0,0 @@ -module github.com/testorg/testrepo - -go 1.17 - -require github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba - -require github.com/valyala/fastjson v1.6.3 // indirect diff --git a/packages/test-cases/cases/wrappers/wasm-go/object-types/go.sum b/packages/test-cases/cases/wrappers/wasm-go/object-types/go.sum deleted file mode 100644 index 89ffed76d2..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/object-types/go.sum +++ /dev/null @@ -1,4 +0,0 @@ -github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba h1:zalC+tj7u2wwOA53sJPvPwrIr6bgQF/5KiULuAi0tcE= -github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba/go.mod h1:IHk2chh2cl2rACqPLh5sE1LKTooxw19biP+zzYOiULg= -github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= -github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= diff --git a/packages/test-cases/cases/wrappers/wasm-go/object-types/module/module.go b/packages/test-cases/cases/wrappers/wasm-go/object-types/module/module.go deleted file mode 100644 index 9ecf0355cc..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/object-types/module/module.go +++ /dev/null @@ -1,55 +0,0 @@ -package module - -import "github.com/testorg/testrepo/wrap/types" - -//go:generate polywrap build -v -m ../polywrap.yaml -o ../build - -func Method1(args *types.MethodArgsMethod1) []types.Output { - out1 := types.Output{ - Prop: args.Arg1.Prop, - Nested: types.Nested{ - Prop: args.Arg1.Nested.Prop, - }, - } - out2 := types.Output{} - if args.Arg2 != nil { - out2 = types.Output{ - Prop: args.Arg2.Prop, - Nested: types.Nested{ - Prop: args.Arg2.Circular.Prop, - }, - } - } - return []types.Output{out1, out2} -} - -func Method2(args *types.MethodArgsMethod2) *types.Output { - if args == nil { - return nil - } - return &types.Output{ - Prop: args.Arg.Prop, - Nested: types.Nested{ - Prop: args.Arg.Nested.Prop, - }, - } -} - -func Method3(args *types.MethodArgsMethod3) []*types.Output { - out2 := &types.Output{ - Prop: args.Arg.Prop, - Nested: types.Nested{ - Prop: args.Arg.Nested.Prop, - }, - } - return []*types.Output{nil, out2} -} - -func Method5(args *types.MethodArgsMethod5) types.Output { - return types.Output{ - Prop: string(args.Arg.Prop), - Nested: types.Nested{ - Prop: "nested prop", - }, - } -} diff --git a/packages/test-cases/cases/wrappers/wasm-go/object-types/polywrap.build.yaml b/packages/test-cases/cases/wrappers/wasm-go/object-types/polywrap.build.yaml deleted file mode 100644 index d16e9c9f18..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/object-types/polywrap.build.yaml +++ /dev/null @@ -1,3 +0,0 @@ -format: 0.1.0 -config: - node_version: "16.13.0" \ No newline at end of file diff --git a/packages/test-cases/cases/wrappers/wasm-go/object-types/polywrap.yaml b/packages/test-cases/cases/wrappers/wasm-go/object-types/polywrap.yaml deleted file mode 100644 index 1bf4bdb549..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/object-types/polywrap.yaml +++ /dev/null @@ -1,9 +0,0 @@ -format: 0.2.0 -project: - name: ObjectTypes - type: wasm/golang -source: - schema: ./schema.graphql - module: ./go.mod -extensions: - build: ./polywrap.build.yaml \ No newline at end of file diff --git a/packages/test-cases/cases/wrappers/wasm-go/object-types/schema.graphql b/packages/test-cases/cases/wrappers/wasm-go/object-types/schema.graphql deleted file mode 100644 index 03f068148a..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/object-types/schema.graphql +++ /dev/null @@ -1,45 +0,0 @@ -type Module { - method1( - arg1: Arg1! - arg2: Arg2 - ): [Output!]! - - method2( - arg: Arg1! - ): Output - - method3( - arg: Arg1! - ): [Output]! - - method5( - arg: Arg3! - ): Output! -} - -type Arg1 { - prop: String! - nested: Nested! -} - -type Arg2 { - prop: String! - circular: Circular! -} - -type Arg3 { - prop: Bytes! -} - -type Output { - prop: String! - nested: Nested! -} - -type Nested { - prop: String! -} - -type Circular { - prop: String! -} From ce4a9c17e8a0ec6c33b42602f4558de05162d893 Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Thu, 13 Jul 2023 05:45:49 +0200 Subject: [PATCH 65/65] chore: remove debug logging --- .../bind/src/bindings/golang/transforms/moduleNeedsTypes.ts | 5 ----- 1 file changed, 5 deletions(-) diff --git a/packages/schema/bind/src/bindings/golang/transforms/moduleNeedsTypes.ts b/packages/schema/bind/src/bindings/golang/transforms/moduleNeedsTypes.ts index bf8b9db80e..060a8f9936 100644 --- a/packages/schema/bind/src/bindings/golang/transforms/moduleNeedsTypes.ts +++ b/packages/schema/bind/src/bindings/golang/transforms/moduleNeedsTypes.ts @@ -18,22 +18,18 @@ export function moduleNeedsTypes(): AbiTransforms { return { enter: { ModuleDefinition: (def: ModuleDefinition) => { - console.log("ENTER", def.type); state.moduleDefinition = def; state.needsTypes = false; return def; }, MethodDefinition: (def: MethodDefinition) => { - console.log("METHOD", def.name); if (def.arguments && def.arguments.length > 0) { - console.log("NEEDS cause args"); state.needsTypes = true; } if (def.return) { const returnType = def.return.type; if (!isBaseType(returnType) && !isBuiltInType(returnType)) { - console.log("NEEDS cause ret"); state.needsTypes = true; } } @@ -42,7 +38,6 @@ export function moduleNeedsTypes(): AbiTransforms { }, leave: { ModuleDefinition: (def: ModuleDefinition) => { - console.log("LEAVE", def.name); const needsTypes = state.needsTypes; state.moduleDefinition = undefined; state.needsTypes = undefined;