Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

fix: only include needed imported bindings in golang #1828

Merged
merged 15 commits into from
Jul 26, 2023
Merged
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ EXTRA_EXPORTS=$(
if [ -z "$EXTRA_EXPORTS" ]
then
echo "No extra exports to remove"
cp ./build-staging/module.wasm ./build-staging/module_exports.wasm
else
echo "Removing extra exports: $EXTRA_EXPORTS"
# Remove these extra exports from the wasm module via wasm-snip
Expand All @@ -43,6 +44,7 @@ EXTRA_IMPORTS=$(
if [ -z "$EXTRA_IMPORTS" ]
then
echo "No extra imports to remove"
cp ./build-staging/module_exports.wasm ./build-staging/module_exports_imports.wasm
else
echo "Removing extra imports: $EXTRA_IMPORTS"
# Remove these extra imports from the wasm module via wasm-snip
Expand Down
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
export * from "./moduleNeedsTypes";
export * from "./moduleNeedsImportedTypes";
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
/* eslint-disable @typescript-eslint/naming-convention */
import {
Abi,
ImportedEnumDefinition,
ImportedEnvDefinition,
ImportedModuleDefinition,
ImportedObjectDefinition,
MethodDefinition,
ModuleDefinition,
} from "@polywrap/wrap-manifest-types-js";
import { AbiTransforms } from "@polywrap/schema-parse";

interface ImportedTypesState {
importedTypes: Map<string, string>;
}

interface ModuleNeedsImportedTypesState extends ImportedTypesState {
needsImportedNamespaces: Set<string>;
}

export function extractImportedTypes(): AbiTransforms {
const state: ImportedTypesState = {
importedTypes: new Map(),
};

return {
enter: {
ImportedEnumDefinition: (def: ImportedEnumDefinition) => {
state.importedTypes = state.importedTypes.set(def.type, def.namespace);
return def;
},
ImportedEnvDefinition: (def: ImportedEnvDefinition) => {
state.importedTypes = state.importedTypes.set(def.type, def.namespace);
return def;
},
ImportedModuleDefinition: (def: ImportedModuleDefinition) => {
state.importedTypes = state.importedTypes.set(def.type, def.namespace);
return def;
},
ImportedObjectDefinition: (def: ImportedObjectDefinition) => {
state.importedTypes = state.importedTypes.set(def.type, def.namespace);
return def;
},
},
leave: {
Abi(abi: Abi) {
return {
...abi,
_importedTypes: state.importedTypes,
};
},
},
};
}

export function extractNeededImportedNamespaces(): AbiTransforms {
const state: ModuleNeedsImportedTypesState = {
importedTypes: new Map(),
needsImportedNamespaces: new Set(),
};

return {
enter: {
Abi: (abi: Abi) => {
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
state.importedTypes = abi._importedTypes;
return abi;
},
MethodDefinition: (def: MethodDefinition) => {
if (def.arguments && def.arguments.length > 0) {
for (const arg of def.arguments) {
const argType = arg.type;
const importNamespace = state.importedTypes?.get(argType);
if (importNamespace) {
state.needsImportedNamespaces?.add(importNamespace);
}
}
}

if (def.return) {
const returnType = def.return.type;
const importNamespace = state.importedTypes?.get(returnType);
if (importNamespace) {
state.needsImportedNamespaces?.add(importNamespace);
}
}
return def;
},
},
leave: {
Abi: (abi: Abi) => {
return {
...abi,
_needsImportedNamespaces: state.needsImportedNamespaces,
};
},
},
};
}

export function needsImportedNamespaces(): AbiTransforms {
const state: ModuleNeedsImportedTypesState = {
importedTypes: new Map(),
needsImportedNamespaces: new Set(),
};

return {
enter: {
Abi: (abi: Abi) => {
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
state.needsImportedNamespaces = abi._needsImportedNamespaces;
return abi;
},
},
leave: {
ModuleDefinition: (def: ModuleDefinition) => {
const needsImportedNamespaces = Array.from(
state.needsImportedNamespaces
);
return {
...def,
needsImportedNamespaces,
};
},
},
};
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,20 @@ import { AbiTransforms } from "@polywrap/schema-parse";
interface ModuleNeedsTypesState {
moduleDefinition?: ModuleDefinition;
needsTypes?: boolean;
importedTypes?: Map<string, string>;
}

export function moduleNeedsTypes(): AbiTransforms {
const state: ModuleNeedsTypesState = {};

return {
enter: {
Abi: (abi) => {
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
state.importedTypes = abi._importedTypes;
return abi;
},
ModuleDefinition: (def: ModuleDefinition) => {
state.moduleDefinition = def;
state.needsTypes = false;
Expand All @@ -29,7 +36,11 @@ export function moduleNeedsTypes(): AbiTransforms {

if (def.return) {
const returnType = def.return.type;
if (!isBaseType(returnType) && !isBuiltInType(returnType)) {
if (
!isBaseType(returnType) &&
!isBuiltInType(returnType) &&
!state.importedTypes?.has(returnType)
) {
state.needsTypes = true;
}
}
Expand Down
3 changes: 3 additions & 0 deletions packages/schema/bind/src/bindings/golang/wasm/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -271,6 +271,9 @@ function applyTransforms(abi: Abi): Abi {
extendType(Functions),
addFirstLast,
toPrefixedGraphQLType,
Transforms.extractImportedTypes(),
Transforms.extractNeededImportedNamespaces(),
Transforms.needsImportedNamespaces(),
Transforms.moduleNeedsTypes(),
];

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@ 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}}")
writer.Context().Push("{{#handleKeywords}}{{name}}{{/handleKeywords}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property")
writer.WriteString("{{#handleKeywords}}{{name}}{{/handleKeywords}}")
{{#scalar}}
{{> serialize_scalar}}
{{/scalar}}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ 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}}")
writer.Context().Push("{{#handleKeywords}}{{name}}{{/handleKeywords}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property")
writer.WriteString("{{#handleKeywords}}{{name}}{{/handleKeywords}}")
{{#scalar}}
{{> serialize_scalar}}
{{/scalar}}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,22 +6,22 @@ package {{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}}
{{/arguments}}
{{/makeImports}}
{{#methods}}
type Args{{#toUpper}}{{name}}{{/toUpper}} struct {
type {{#toUpper}}{{namespace}}{{/toUpper}}_Args{{#toUpper}}{{name}}{{/toUpper}} struct {
{{#stuctProps}}
{{#arguments}}
{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} `json:"{{name}}"`
{{/arguments}}
{{/stuctProps}}
}

func Serialize{{#toUpper}}{{name}}{{/toUpper}}Args(value *Args{{#toUpper}}{{name}}{{/toUpper}}) []byte {
func Serialize{{#toUpper}}{{namespace}}{{/toUpper}}_{{#toUpper}}{{name}}{{/toUpper}}Args(value *{{#toUpper}}{{namespace}}{{/toUpper}}_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)
Write{{#toUpper}}{{namespace}}{{/toUpper}}_{{#toUpper}}{{name}}{{/toUpper}}Args(encoder, value)
return encoder.Buffer()
}

func Write{{#toUpper}}{{name}}{{/toUpper}}Args(writer msgpack.Write, value *Args{{#toUpper}}{{name}}{{/toUpper}}) {
func Write{{#toUpper}}{{namespace}}{{/toUpper}}_{{#toUpper}}{{name}}{{/toUpper}}Args(writer msgpack.Write, value *{{#toUpper}}{{namespace}}{{/toUpper}}_Args{{#toUpper}}{{name}}{{/toUpper}}) {
{{#arguments.length}}
writer.WriteMapLength({{arguments.length}})
{{/arguments.length}}
Expand Down Expand Up @@ -54,7 +54,7 @@ func Write{{#toUpper}}{{name}}{{/toUpper}}Args(writer msgpack.Write, value *Args
{{/arguments}}
}

func Deserialize{{#toUpper}}{{name}}{{/toUpper}}Result(argsBuf []byte) {{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}} {
func Deserialize{{#toUpper}}{{namespace}}{{/toUpper}}_{{#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)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,16 @@ import (

{{^isInterface}}
{{#methods}}
func {{#toUpper}}{{name}}{{/toUpper}}(args *Args{{#toUpper}}{{name}}{{/toUpper}}) ({{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}, error) {
argsBuf := Serialize{{#toUpper}}{{name}}{{/toUpper}}Args(args)
func {{#toUpper}}{{namespace}}{{/toUpper}}_{{#toUpper}}{{name}}{{/toUpper}}(args *{{#toUpper}}{{namespace}}{{/toUpper}}_Args{{#toUpper}}{{name}}{{/toUpper}}) ({{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}, error) {
argsBuf := Serialize{{#toUpper}}{{namespace}}{{/toUpper}}_{{#toUpper}}{{name}}{{/toUpper}}Args(args)
var (
err error
raw []byte
data {{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}
)
raw, err = wrap.WrapSubinvoke("{{uri}}", "{{name}}", argsBuf)
if err == nil {
data = Deserialize{{#toUpper}}{{name}}{{/toUpper}}Result(raw)
data = Deserialize{{#toUpper}}{{namespace}}{{/toUpper}}_{{#toUpper}}{{name}}{{/toUpper}}Result(raw)
}
return data, err
}
Expand All @@ -28,16 +28,16 @@ func {{#toUpper}}{{name}}{{/toUpper}}(args *Args{{#toUpper}}{{name}}{{/toUpper}}
{{/isInterface}}
{{#isInterface}}
{{#methods}}
func {{#toUpper}}{{name}}{{/toUpper}}(uri string, args *Args{{#toUpper}}{{name}}{{/toUpper}}) ({{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}, error) {
argsBuf := Serialize{{#toUpper}}{{name}}{{/toUpper}}Args(args)
func {{#toUpper}}{{namespace}}{{/toUpper}}_{{#toUpper}}{{name}}{{/toUpper}}(uri string, args *{{#toUpper}}{{namespace}}{{/toUpper}}_Args{{#toUpper}}{{name}}{{/toUpper}}) ({{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}, error) {
argsBuf := Serialize{{#toUpper}}{{namespace}}{{/toUpper}}_{{#toUpper}}{{name}}{{/toUpper}}Args(args)
var (
err error
raw []byte
data {{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}
)
raw, err = wrap.WrapSubinvokeImplementation("{{uri}}", uri, "{{name}}", argsBuf)
if err == nil {
data = Deserialize{{#toUpper}}{{name}}{{/toUpper}}Result(raw)
data = Deserialize{{#toUpper}}{{namespace}}{{/toUpper}}_{{#toUpper}}{{name}}{{/toUpper}}Result(raw)
}
return data, err
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ 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}}")
writer.Context().Push("{{#handleKeywords}}{{name}}{{/handleKeywords}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property")
writer.WriteString("{{#handleKeywords}}{{name}}{{/handleKeywords}}")
{{#scalar}}
{{> serialize_scalar}}
{{/scalar}}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import "github.com/polywrap/go-wrap/wrap"
{{#capabilities}}
{{#getImplementations}}
{{#enabled}}
func {{#toUpper}}{{namespace}}{{/toUpper}}Implementations() []string {
func {{#toUpper}}{{namespace}}{{/toUpper}}_GetImplementations() []string {
return wrap.WrapGetImplementations("{{uri}}")
}
{{/enabled}}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ package module_wrapped
{{#needsTypes}}
. {{goImport}}/module/wrap/types,
{{/needsTypes}}
{{#importedTypes}}
. {{goImport}}/module/wrap/imported/{{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}},
{{/importedTypes}}
{{#needsImportedNamespaces}}
. {{goImport}}/module/wrap/imported/{{#pkgName}}{{#toSnakeCase}}{{.}}{{/toSnakeCase}}{{/pkgName}},
{{/needsImportedNamespaces}}
{{#methods}}
{{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}},
{{/methods}}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package module_wrapped
{{#makeImports}}
{{#methods}}{{#env}}github.com/polywrap/go-wrap/wrap,{{#needsTypes}}. {{goImport}}/module/wrap/types,{{/needsTypes}}{{/env}}{{/methods}}
{{#methods}}{{#env}}github.com/polywrap/go-wrap/wrap,. {{goImport}}/module/wrap/types,{{/env}}{{/methods}}
{{goImport}}/module as methods,
{{/makeImports}}
{{#methods}}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ 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}}")
writer.Context().Push("{{#handleKeywords}}{{name}}{{/handleKeywords}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property")
writer.WriteString("{{#handleKeywords}}{{name}}{{/handleKeywords}}")
{{#scalar}}
{{> serialize_scalar}}
{{/scalar}}
Expand Down
4 changes: 4 additions & 0 deletions packages/templates/polywrap.wasm-golang-linked.build.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
format: 0.3.0
strategies:
image:
name: template-wasm-go
9 changes: 9 additions & 0 deletions packages/templates/polywrap.wasm-golang-linked.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
format: 0.3.0
project:
name: template-wasm-go
type: wasm/golang
source:
module: ./go.mod
schema: ./polywrap.graphql
extensions:
build: ./polywrap.wasm-golang-linked.build.yaml
Binary file not shown.
2 changes: 1 addition & 1 deletion packages/templates/wasm/golang/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,6 @@ module example.com/template-wasm-go

go 1.18

require github.com/polywrap/go-wrap wrap-0.1
require github.com/polywrap/go-wrap wrap-0.1

require github.com/valyala/fastjson v1.6.3 // indirect
4 changes: 4 additions & 0 deletions packages/templates/wasm/golang/go.sum
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
github.com/polywrap/go-wrap v0.0.0-20230712212127-6895977d63c2 h1:+O3G/996rX4SMlJNFA9AIjPSyrInzOEVb7PFOT96G9A=
github.com/polywrap/go-wrap v0.0.0-20230712212127-6895977d63c2/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=
Loading