Skip to content

serverlessworkflow/sdk-go

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Go SDK for Serverless Workflow

The Go SDK for Serverless Workflow provides strongly-typed structures for the Serverless Workflow specification. It simplifies parsing, validating, and interacting with workflows in Go. Starting from version v3.1.0, the SDK also includes a partial reference implementation, allowing users to execute workflows directly within their Go applications.


Table of Contents


Status

This table indicates the current state of implementation of various SDK features:

Feature Status
Parse workflow JSON and YAML definitions βœ”οΈ
Programmatically build workflow definitions βœ”οΈ
Validate workflow definitions (Schema) βœ”οΈ
Specification Implementation βœ”οΈ*
Validate workflow definitions (Integrity) 🚫
Generate workflow diagram (SVG) 🚫

Note: *Implementation is partial; contributions are encouraged.


Releases

Latest Releases Conformance to Spec Version
v1.0.0 v0.5
v2.0.1 v0.6
v2.1.2 v0.7
v2.5.0 v0.8
v3.1.0 v1.0.0

Reference Implementation

The SDK provides a partial reference runner to execute your workflows:

Example: Running a Workflow

Below is a simple YAML workflow that sets a message and then prints it:

document:
  dsl: "1.0.0"
  namespace: "examples"
  name: "simple-workflow"
  version: "1.0.0"
do:
  - set:
      message: "Hello from the Serverless Workflow SDK in Go!"

You can execute this workflow using the following Go program:

Example of executing a workflow defined in YAML:

package main

import (
    "fmt"
    "os"
    "path/filepath"

    "github.com/serverlessworkflow/sdk-go/v3/impl"
    "github.com/serverlessworkflow/sdk-go/v3/parser"
)

func RunWorkflow(workflowFilePath string, input map[string]interface{}) (interface{}, error) {
    data, err := os.ReadFile(filepath.Clean(workflowFilePath))
    if err != nil {
        return nil, err
    }
    workflow, err := parser.FromYAMLSource(data)
    if err != nil {
        return nil, err
    }

    runner := impl.NewDefaultRunner(workflow)
    output, err := runner.Run(input)
    if err != nil {
        return nil, err
    }
    return output, nil
}

func main() {
    output, err := RunWorkflow("./myworkflow.yaml", map[string]interface{}{"shouldCall": true})
    if err != nil {
        panic(err)
    }
    fmt.Printf("Workflow completed with output: %v\n", output)
}

Implementation Roadmap

The table below lists the current state of this implementation. This table is a roadmap for the project based on the DSL Reference doc.

Feature State
Workflow Document βœ…
Workflow Use 🟑
Workflow Schedule ❌
Task Call ❌
Task Do βœ…
Task Emit ❌
Task For βœ…
Task Fork βœ…
Task Listen ❌
Task Raise βœ…
Task Run ❌
Task Set βœ…
Task Switch βœ…
Task Try ❌
Task Wait ❌
Lifecycle Events 🟑
External Resource ❌
Authentication ❌
Catalog ❌
Extension ❌
Error βœ…
Event Consumption Strategies ❌
Retry ❌
Input βœ…
Output βœ…
Export βœ…
Timeout ❌
Duration ❌
Endpoint βœ…
HTTP Response ❌
HTTP Request ❌
URI Template βœ…
Container Lifetime ❌
Process Result ❌
AsyncAPI Server ❌
AsyncAPI Outbound Message ❌
AsyncAPI Subscription ❌
Workflow Definition Reference βœ…
Subscription Iterator ❌

We love contributions! Our aim is to have a complete implementation to serve as a reference or to become a project on its own to favor the CNCF Ecosystem.

If you are willing to help, please file a sub-task in this EPIC describing what you are planning to work on first.


Slack Community

Join our community on the CNCF Slack to collaborate, ask questions, and contribute:

CNCF Slack Invite

Find us in the #serverless-workflow-sdk channel.


Contributing

Your contributions are very welcome!

Code Style

  • Format imports with goimports.
  • Run static analysis using:
make lint

Automatically fix lint issues:

make lint params=--fix

EditorConfig

A sample .editorconfig for IntelliJ or GoLand users can be found here.

Known Issues

  • MacOS Issue: If you encounter goimports: can't extract issues from gofmt diff output, resolve it with:
brew install diffutils

Contributions are greatly appreciated! Check this EPIC and contribute to completing more features.

Happy coding!

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy