Shopify Functions Rust Crate
A crate to help developers build Shopify Functions.
Usage
- The [
typegen
] macro allows you to generate structs based on your Function API (based on the provided GraphQL schema) and multiple input queries. - The
shopify_function
attribute macro marks the following function as the entry point for a Shopify Function. It manages the Functions input parsing and output serialization for you. - The
run_function_with_input
function is a utility for unit testing which allows you to quickly add new tests based on a given JSON input string.
See the example_with_targets for details on usage, or use the following guide to convert an existing Rust-based function.
Updating an existing function using a version of shopify_function
below 1.0.0
to use version 1.0.0
and above
-
In
main.rs
, add imports forshopify_function
.use *; use Result;
-
In
main.rs
, add type generation, right under your imports. Remove any references to thegenerate_types!
macro. Replace./input.graphql
with the location of your input query file (e.g.src/run.graphql
).If your Function has multiple targets each with their own input query, add a nested module for each. For example:
-
In
main.rs
, ensure that you have amain
function that returns an error indicating to invoke a named export: -
Throughout all of your source files, replace any references to
#[shopify_function_target]
with theshopify_function
macro, and change its return type. Typically, this is located in a file with a name equal to the target, e.g.run.rs
. -
Update the types and fields utilized in the function to the new, auto-generated structs. For example:
Old New input::ResponseData
schema::input::Input
input::InputDiscountNodeMetafield
schema::input::input::discount_node::Metafield
input::InputDiscountNode
schema::input::input::DiscountNode
output::FunctionRunResult
schema::FunctionRunResult
output::DiscountApplicationStrategy::FIRST
schema::DiscountApplicationStrategy::First
If referencing generated types from a file other than
main.rs
where they are defined, you'll need to import the schema. For example inrun.rs
you would need to add:use crate schema;
Viewing the generated types
To preview the types generated by the typegen
macro, use the cargo doc
command.
You can also use the cargo-expand crate to view the generated source, or use the rust-analyzer VSCode extension to get IntelliSense for Rust and the generated types.
License Apache-2.0