interpolate

package module
v0.0.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Dec 22, 2023 License: MIT Imports: 7 Imported by: 1

README

Interpolate

Build Status Go Reference Go Report Card

A Go library for parameter expansion (like ${NAME} or $NAME) in strings from environment variables. An implementation of POSIX Parameter Expansion, plus some other basic operations that you'd expect in a shell scripting environment like bash.

Installation

go get github.com/mfridman/interpolate@latest

Usage

package main

import (
  "github.com/mfridman/interpolate"
  "fmt"
)

func main() {
  env := interpolate.NewSliceEnv([]string{
    "NAME=James",
  })

  output, _ := interpolate.Interpolate(env, "Hello... ${NAME} welcome to the ${ANOTHER_VAR:-🏖}")

  fmt.Println(output)
  // Output: Hello... James welcome to the 🏖
}

Supported Expansions

  • ${parameter} or $parameter

    • Use value. If parameter is set, then it shall be substituted; otherwise, it will be blank
  • ${parameter:-[word]}

    • Use default values. If parameter is unset or null, the expansion of word (or an empty string if word is omitted) shall be substituted; otherwise, the value of parameter shall be substituted.
  • ${parameter-[word]}

    • Use default values when not set. If parameter is unset, the expansion of word (or an empty string if word is omitted) shall be substituted; otherwise, the value of parameter shall be substituted.
  • ${parameter:[offset]}

    • Use the substring of parameter after offset. A negative offset must be separated from the colon with a space, and will select from the end of the string. If the value is out of bounds, an empty string will be substituted.
  • ${parameter:[offset]:[length]}

    • Use the substring of parameter after offset of given length. A negative offset must be separated from the colon with a space, and will select from the end of the string. If the offset is out of bounds, an empty string will be substituted. If the length is greater than the length then the entire string will be returned.
  • ${parameter:?[word]}

    • Indicate Error if Null or Unset. If parameter is unset or null, the expansion of word (or a message indicating it is unset if word is omitted) shall be returned as an error.

Prior work

This repository is a fork of buildkite/interpolate. I'd like to thank the authors of that library for their work. I've forked it to make some changes that I needed for my own use cases, and to make it easier to maintain. I've also added some tests and documentation.

License

Licensed under MIT license, in LICENSE.

Documentation

Index

Examples

Constants

This section is empty.

Variables

This section is empty.

Functions

func Identifiers

func Identifiers(str string) ([]string, error)

Indentifiers parses the identifiers from any expansions in the provided string

func Interpolate

func Interpolate(env Env, str string) (string, error)

Interpolate takes a set of environment and interpolates it into the provided string using shell script expansions

Example
package main

import (
	"fmt"
	"log"

	"github.com/mfridman/interpolate"
)

func main() {
	env := interpolate.NewSliceEnv([]string{
		"NAME=James",
	})

	output, err := interpolate.Interpolate(env, "Hello... ${NAME} welcome to the ${ANOTHER_VAR:-🏖}")
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(output)

}
Output:

Hello... James welcome to the 🏖

Types

type EmptyValueExpansion

type EmptyValueExpansion struct {
	Identifier string
	Content    Expression
}

EmptyValueExpansion returns either the value of an env, or a default value if it's unset or null

func (EmptyValueExpansion) Expand

func (e EmptyValueExpansion) Expand(env Env) (string, error)

func (EmptyValueExpansion) Identifiers

func (e EmptyValueExpansion) Identifiers() []string

type Env

type Env interface {
	Get(key string) (string, bool)
}

Env is an interface for getting environment variables by name and returning a boolean indicating whether the variable was found.

func NewMapEnv

func NewMapEnv(env map[string]string) Env

NewMapEnv creates an Env from a map of environment variables.

func NewSliceEnv

func NewSliceEnv(env []string) Env

NewSliceEnv creates an Env from a slice of environment variables in the form "key=value".

This can be used with os.Environ to create an Env.

type Expansion

type Expansion interface {
	Expand(env Env) (string, error)
	Identifiers() []string
}

An expansion is something that takes in ENV and returns a string or an error

type Expression

type Expression []ExpressionItem

Expression is a collection of either Text or Expansions

func (Expression) Expand

func (e Expression) Expand(env Env) (string, error)

func (Expression) Identifiers

func (e Expression) Identifiers() []string

type ExpressionItem

type ExpressionItem struct {
	Text string
	// -- or --
	Expansion Expansion
}

ExpressionItem models either an Expansion or Text. Either/Or, never both.

func (ExpressionItem) String

func (i ExpressionItem) String() string

type Parser

type Parser struct {
	// contains filtered or unexported fields
}

Parser takes a string and parses out a tree of structs that represent text and Expansions

func NewParser

func NewParser(str string) *Parser

NewParser returns a new instance of a Parser

func (*Parser) Parse

func (p *Parser) Parse() (Expression, error)

Parse expansions out of the internal text and return them as a tree of Expressions

type RequiredExpansion

type RequiredExpansion struct {
	Identifier string
	Message    Expression
}

RequiredExpansion returns an env value, or an error if it is unset

func (RequiredExpansion) Expand

func (e RequiredExpansion) Expand(env Env) (string, error)

func (RequiredExpansion) Identifiers

func (e RequiredExpansion) Identifiers() []string

type SubstringExpansion

type SubstringExpansion struct {
	Identifier string
	Offset     int
	Length     int
	HasLength  bool
}

SubstringExpansion returns a substring (or slice) of the env

func (SubstringExpansion) Expand

func (e SubstringExpansion) Expand(env Env) (string, error)

func (SubstringExpansion) Identifiers

func (e SubstringExpansion) Identifiers() []string

type UnsetValueExpansion

type UnsetValueExpansion struct {
	Identifier string
	Content    Expression
}

UnsetValueExpansion returns either the value of an env, or a default value if it's unset

func (UnsetValueExpansion) Expand

func (e UnsetValueExpansion) Expand(env Env) (string, error)

func (UnsetValueExpansion) Identifiers

func (e UnsetValueExpansion) Identifiers() []string

type VariableExpansion

type VariableExpansion struct {
	Identifier string
}

VariableExpansion represents either $VAR or ${VAR}, our simplest expansion

func (VariableExpansion) Expand

func (e VariableExpansion) Expand(env Env) (string, error)

func (VariableExpansion) Identifiers

func (e VariableExpansion) Identifiers() []string