env API

env

package

API reference for the env package.

S
struct

plugin

cmd/rfw/plugins/env/env.go:13-15
type plugin struct

Methods

Name
Method

Returns

string
func (*plugin) Name() string
{ return "env" }
Priority
Method

Returns

int
func (*plugin) Priority() int
{ return 0 }
PreBuild
Method

PreBuild collects environment variables prefixed with RFW_ and generates a temporary rfwenv package exposing them through Get.

Parameters

Returns

error
func (*plugin) PreBuild(raw json.RawMessage) error
{
	vars := map[string]string{}
	for _, e := range os.Environ() {
		if !strings.HasPrefix(e, "RFW_") {
			continue
		}
		parts := strings.SplitN(e, "=", 2)
		if len(parts) != 2 {
			continue
		}
		key := strings.TrimPrefix(parts[0], "RFW_")
		vars[key] = parts[1]
	}

	p.dir = "rfwenv"
	if err := os.MkdirAll(p.dir, 0o755); err != nil {
		return err
	}

	keys := make([]string, 0, len(vars))
	for k := range vars {
		keys = append(keys, k)
	}
	sort.Strings(keys)

	var b strings.Builder
	b.WriteString("// Code generated by env plugin. DO NOT EDIT.\n")
	b.WriteString("package rfwenv\n\n")
	b.WriteString("var vars = map[string]string{\n")
	for _, k := range keys {
		b.WriteString("\t\"" + k + "\": \"" + vars[k] + "\",\n")
	}
	b.WriteString("}\n\n")
	b.WriteString("func Get(key string) string {\n\treturn vars[key]\n}\n")

	return os.WriteFile(filepath.Join(p.dir, "rfw_env.go"), []byte(b.String()), 0o644)
}
Build
Method

Parameters

Returns

error
func (*plugin) Build(raw json.RawMessage) error
{ return nil }
PostBuild
Method

PostBuild removes the temporary rfwenv package.

Parameters

Returns

error
func (*plugin) PostBuild(raw json.RawMessage) error
{
	if p.dir != "" {
		_ = os.RemoveAll(p.dir)
		p.dir = ""
	}
	return nil
}
ShouldRebuild
Method

Parameters

path string

Returns

bool
func (*plugin) ShouldRebuild(path string) bool
{ return false }

Fields

Name Type Description
dir string
F
function

init

cmd/rfw/plugins/env/env.go:17-17
func init()

{ plugins.Register(&plugin{}) }
F
function

TestPreAndPostBuild

TestPreAndPostBuild verifies that the env plugin generates a temporary
package exposing RFW_ environment variables and cleans it up afterwards.

Parameters

cmd/rfw/plugins/env/env_test.go:12-49
func TestPreAndPostBuild(t *testing.T)

{
	p := &plugin{}

	// Prepare environment variables.
	t.Setenv("RFW_FOO", "bar")
	t.Setenv("RFW_BAR", "baz")

	dir := t.TempDir()
	origWD, _ := os.Getwd()
	if err := os.Chdir(dir); err != nil {
		t.Fatalf("chdir: %v", err)
	}
	t.Cleanup(func() { _ = os.Chdir(origWD) })

	if err := p.PreBuild(nil); err != nil {
		t.Fatalf("PreBuild: %v", err)
	}

	data, err := os.ReadFile(filepath.Join("rfwenv", "rfw_env.go"))
	if err != nil {
		t.Fatalf("read generated file: %v", err)
	}
	content := string(data)
	if !strings.Contains(content, `"BAR": "baz"`) || !strings.Contains(content, `"FOO": "bar"`) {
		t.Fatalf("generated file missing variables: %s", content)
	}

	if err := p.PostBuild(nil); err != nil {
		t.Fatalf("PostBuild: %v", err)
	}
	if _, err := os.Stat("rfwenv"); !os.IsNotExist(err) {
		t.Fatalf("rfwenv directory should be removed")
	}

	if p.ShouldRebuild("anything") {
		t.Fatalf("env plugin should never trigger rebuilds")
	}
}