The following command will create an order discount Function at extensions/order-discount-golang
, using our generic Wasm boilerplate.
npm run generate extension -- --type order_discounts --template wasm --name order-discount-golang
cd extensions/order-discount-golang
go mod init main
This will create a go.mod
file.
Replace the contents of extensions/order-discount-golang/input.graphql
with the following from GitHub:
You need to inform Shopify about the UI paths for configuring your function. These paths are already provided by the app template you used.
In shopify.function.extension.toml
, replace the [ui.paths]
section with the following:
[ui.paths]
create = "/discount/:functionId/new"
details = "/discount/:functionId/:id"
You also need to inform Shopify about where to find GraphQL variable values that will be used when executing your input query.
Add the following to shopify.function.extension.toml
:
[input.variables]
namespace = "$app:polyglot-functions"
key = "function-configuration"
You also need to inform the Shopify CLI about how to build your Go wasm module, and where to expect the build output.
In shopify.function.extension.toml
, replace the [build]
section with the following:
[build]
command = "tinygo build -target wasi -scheduler=none -gc=leaking -opt=z -no-debug -o order-discount-golang.wasm"
path = "order-discount-golang.wasm"
The TinyGo build settings here minimize the module size. Shopify Functions executions are short lived and single threaded, so no scheduler or garbage collection is needed.
main.go
.IF customer has VIP metafield with a value of 'true'
AND products in their cart with tag X have a total of more than $Y
THEN discount the order by Z%
Hint: You can find a completed example on GitHub:
This example requires adding gjson to your Go module:
go get -u github.com/tidwall/gjson
shopify.function.extension.toml
:npm run function:build
FunctionResult
GraphQL type:npm run function:validate
npm run function:preview
Use the following steps, selecting the order-discount-golang
discount type, and using GO
as your discount code.
cd ../..
npm run deploy
npm run dev
executing in a terminal window.The workshop app includes a test script which will execute all the function wasm modules you have created so far, and print a comparison of their instruction count and binary size.
cd ../..
npm run function:test-all
You're a real Go-getter! Onto another language?