Types Reference
This page documents all the data structures used by the GitHub Action Parser library.
ActionFile
The main structure representing a GitHub Action or Workflow file.
type ActionFile struct {
Name string `yaml:"name,omitempty"`
Description string `yaml:"description,omitempty"`
Author string `yaml:"author,omitempty"`
Inputs map[string]Input `yaml:"inputs,omitempty"`
Outputs map[string]Output `yaml:"outputs,omitempty"`
Runs RunsConfig `yaml:"runs,omitempty"`
Branding Branding `yaml:"branding,omitempty"`
On interface{} `yaml:"on,omitempty"`
Jobs map[string]Job `yaml:"jobs,omitempty"`
Env map[string]string `yaml:"env,omitempty"`
Defaults map[string]interface{} `yaml:"defaults,omitempty"`
Permissions interface{} `yaml:"permissions,omitempty"`
}Fields
- Name (
string): The name of the action or workflow - Description (
string): A description of what the action or workflow does - Author (
string): The author of the action - Inputs (
map[string]Input): Input parameters for the action - Outputs (
map[string]Output): Output values from the action - Runs (
RunsConfig): Configuration for how the action runs - Branding (
Branding): Branding information for the action - On (
interface{}): Trigger events for workflows - Jobs (
map[string]Job): Jobs defined in a workflow - Env (
map[string]string): Environment variables - Defaults (
map[string]interface{}): Default settings - Permissions (
interface{}): Permission settings
Usage Example
action, err := parser.ParseFile("action.yml")
if err != nil {
log.Fatal(err)
}
fmt.Printf("Action: %s\n", action.Name)
fmt.Printf("Description: %s\n", action.Description)
fmt.Printf("Author: %s\n", action.Author)Input
Represents an input parameter for an action.
type Input struct {
Description string `yaml:"description,omitempty"`
Required bool `yaml:"required,omitempty"`
Default string `yaml:"default,omitempty"`
Deprecated bool `yaml:"deprecated,omitempty"`
}Fields
- Description (
string): Description of the input parameter - Required (
bool): Whether the input is required - Default (
string): Default value if not provided - Deprecated (
bool): Whether the input is deprecated
Usage Example
for name, input := range action.Inputs {
fmt.Printf("Input: %s\n", name)
fmt.Printf(" Description: %s\n", input.Description)
fmt.Printf(" Required: %t\n", input.Required)
if input.Default != "" {
fmt.Printf(" Default: %s\n", input.Default)
}
}Output
Represents an output value from an action.
type Output struct {
Description string `yaml:"description,omitempty"`
Value string `yaml:"value,omitempty"`
}Fields
- Description (
string): Description of the output - Value (
string): The value expression for the output
Usage Example
for name, output := range action.Outputs {
fmt.Printf("Output: %s\n", name)
fmt.Printf(" Description: %s\n", output.Description)
fmt.Printf(" Value: %s\n", output.Value)
}RunsConfig
Configuration for how an action executes.
type RunsConfig struct {
Using string `yaml:"using,omitempty"`
Main string `yaml:"main,omitempty"`
Pre string `yaml:"pre,omitempty"`
Post string `yaml:"post,omitempty"`
Image string `yaml:"image,omitempty"`
Entrypoint string `yaml:"entrypoint,omitempty"`
Args []string `yaml:"args,omitempty"`
Env map[string]string `yaml:"env,omitempty"`
Steps []Step `yaml:"steps,omitempty"`
}Fields
- Using (
string): The runtime to use (e.g., "node20", "docker", "composite") - Main (
string): Main entry point for JavaScript actions - Pre (
string): Pre-execution script for JavaScript actions - Post (
string): Post-execution script for JavaScript actions - Image (
string): Docker image for Docker actions - Entrypoint (
string): Docker entrypoint - Args (
[]string): Arguments for Docker actions - Env (
map[string]string): Environment variables - Steps (
[]Step): Steps for composite actions
Usage Example
runs := action.Runs
fmt.Printf("Runtime: %s\n", runs.Using)
switch runs.Using {
case "node20", "node16":
fmt.Printf("Main script: %s\n", runs.Main)
case "docker":
fmt.Printf("Docker image: %s\n", runs.Image)
case "composite":
fmt.Printf("Steps: %d\n", len(runs.Steps))
}Job
Represents a job in a GitHub workflow.
type Job struct {
Name string `yaml:"name,omitempty"`
RunsOn interface{} `yaml:"runs-on,omitempty"`
Needs interface{} `yaml:"needs,omitempty"`
If string `yaml:"if,omitempty"`
Steps []Step `yaml:"steps,omitempty"`
Env map[string]string `yaml:"env,omitempty"`
Defaults map[string]interface{} `yaml:"defaults,omitempty"`
Outputs map[string]string `yaml:"outputs,omitempty"`
TimeoutMin int `yaml:"timeout-minutes,omitempty"`
Strategy interface{} `yaml:"strategy,omitempty"`
ContinueOn interface{} `yaml:"continue-on-error,omitempty"`
Container interface{} `yaml:"container,omitempty"`
Services map[string]interface{} `yaml:"services,omitempty"`
Uses string `yaml:"uses,omitempty"`
With map[string]interface{} `yaml:"with,omitempty"`
Secrets interface{} `yaml:"secrets,omitempty"`
Permissions interface{} `yaml:"permissions,omitempty"`
}Fields
- Name (
string): Display name for the job - RunsOn (
interface{}): Runner environment (string or array) - Needs (
interface{}): Jobs that must complete before this job - If (
string): Conditional expression for job execution - Steps (
[]Step): Steps to execute in the job - Env (
map[string]string): Environment variables - Defaults (
map[string]interface{}): Default settings - Outputs (
map[string]string): Job outputs - TimeoutMin (
int): Timeout in minutes - Strategy (
interface{}): Matrix strategy configuration - ContinueOn (
interface{}): Continue on error setting - Container (
interface{}): Container configuration - Services (
map[string]interface{}): Service containers - Uses (
string): Reusable workflow reference - With (
map[string]interface{}): Inputs for reusable workflows - Secrets (
interface{}): Secrets for reusable workflows - Permissions (
interface{}): Permission settings
Usage Example
for jobID, job := range workflow.Jobs {
fmt.Printf("Job: %s\n", jobID)
if job.Name != "" {
fmt.Printf(" Name: %s\n", job.Name)
}
fmt.Printf(" Steps: %d\n", len(job.Steps))
if job.Uses != "" {
fmt.Printf(" Uses: %s\n", job.Uses)
}
}Step
Represents a single step in a workflow job.
type Step struct {
ID string `yaml:"id,omitempty"`
If string `yaml:"if,omitempty"`
Name string `yaml:"name,omitempty"`
Uses string `yaml:"uses,omitempty"`
Run string `yaml:"run,omitempty"`
Shell string `yaml:"shell,omitempty"`
With map[string]interface{} `yaml:"with,omitempty"`
Env map[string]string `yaml:"env,omitempty"`
ContinueOn interface{} `yaml:"continue-on-error,omitempty"`
TimeoutMin int `yaml:"timeout-minutes,omitempty"`
WorkingDir string `yaml:"working-directory,omitempty"`
}Fields
- ID (
string): Unique identifier for the step - If (
string): Conditional expression for step execution - Name (
string): Display name for the step - Uses (
string): Action to use - Run (
string): Command to run - Shell (
string): Shell to use for run commands - With (
map[string]interface{}): Input parameters for actions - Env (
map[string]string): Environment variables - ContinueOn (
interface{}): Continue on error setting - TimeoutMin (
int): Timeout in minutes - WorkingDir (
string): Working directory
Usage Example
for i, step := range job.Steps {
fmt.Printf("Step %d:\n", i+1)
if step.Name != "" {
fmt.Printf(" Name: %s\n", step.Name)
}
if step.Uses != "" {
fmt.Printf(" Uses: %s\n", step.Uses)
}
if step.Run != "" {
fmt.Printf(" Run: %s\n", step.Run)
}
}Branding
Branding information for GitHub Actions.
type Branding struct {
Icon string `yaml:"icon,omitempty"`
Color string `yaml:"color,omitempty"`
}Fields
- Icon (
string): Icon name from Feather icons - Color (
string): Background color (white, yellow, blue, green, orange, red, purple, gray-dark)
Usage Example
if action.Branding.Icon != "" {
fmt.Printf("Icon: %s\n", action.Branding.Icon)
}
if action.Branding.Color != "" {
fmt.Printf("Color: %s\n", action.Branding.Color)
}StringOrStringSlice
A utility type that can represent either a string or a slice of strings, commonly used in YAML files.
type StringOrStringSlice struct {
Value string
Values []string
}Fields
- Value (
string): Single string value (first item if slice) - Values (
[]string): All values as a slice
Methods
UnmarshalYAML
func (s *StringOrStringSlice) UnmarshalYAML(unmarshal func(interface{}) error) errorImplements YAML unmarshaling to handle both string and string slice inputs.
Contains
func (s *StringOrStringSlice) Contains(value string) boolChecks if the given value is contained in the string or string slice.
String
func (s *StringOrStringSlice) String() stringReturns a string representation. For single values, returns the value. For multiple values, returns a comma-separated list.
Usage Example
// This type is typically used internally by the parser
// but can be useful for custom processing
var trigger StringOrStringSlice
// Can unmarshal from: "push" or ["push", "pull_request"]
if trigger.Contains("push") {
fmt.Println("Triggered by push events")
}
fmt.Printf("Triggers: %s\n", trigger.String())Type Conversion Notes
Interface{} Fields
Several fields use interface{} to accommodate the flexible nature of YAML:
- On: Can be a string, array, or complex object with event configurations
- RunsOn: Can be a string (single runner) or array (multiple runners)
- Needs: Can be a string (single dependency) or array (multiple dependencies)
- Permissions: Can be a string ("read-all", "write-all") or object with specific permissions
Working with Interface{} Fields
Use type assertions or the utility functions to work with these fields:
// Example: Working with the 'on' field
switch on := workflow.On.(type) {
case string:
fmt.Printf("Single trigger: %s\n", on)
case []interface{}:
fmt.Printf("Multiple triggers: %v\n", on)
case map[string]interface{}:
fmt.Printf("Complex trigger configuration\n")
}The library provides utility functions like MapOfStringInterface and MapOfStringString to help with type conversions. See the Utilities API for more details.