Skip to content

Commit 2458e1f

Browse files
committed
Add support for @file argument values
1 parent 8301a7e commit 2458e1f

2 files changed

Lines changed: 68 additions & 0 deletions

File tree

hedgerules/cmd/hedgerules/main.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"flag"
66
"fmt"
77
"os"
8+
"strings"
89

910
"github.com/BurntSushi/toml"
1011
awsconfig "github.com/aws/aws-sdk-go-v2/config"
@@ -61,6 +62,21 @@ func runDeploy(args []string) {
6162
debugHeaders := fs.Bool("debug-headers", false, "inject debug headers into viewer-response function")
6263
fs.Parse(args)
6364

65+
// Resolve @FILE syntax for string flags
66+
mustResolve := func(v, flag string) string {
67+
result, err := resolveAtFile(v)
68+
if err != nil {
69+
fatal("--%s: %v", flag, err)
70+
}
71+
return result
72+
}
73+
*outputDir = mustResolve(*outputDir, "output-dir")
74+
*redirectsKVS = mustResolve(*redirectsKVS, "redirects-kvs-name")
75+
*headersKVS = mustResolve(*headersKVS, "headers-kvs-name")
76+
*requestFunc = mustResolve(*requestFunc, "request-function-name")
77+
*responseFunc = mustResolve(*responseFunc, "response-function-name")
78+
*region = mustResolve(*region, "region")
79+
6480
// Load config file
6581
cfg := loadConfig(*configPath)
6682

@@ -257,3 +273,15 @@ func fatal(format string, args ...any) {
257273
fmt.Fprintf(os.Stderr, "error: "+format+"\n", args...)
258274
os.Exit(1)
259275
}
276+
277+
// resolveAtFile resolves @FILE syntax: if s starts with '@', reads and returns the trimmed file contents.
278+
func resolveAtFile(s string) (string, error) {
279+
if !strings.HasPrefix(s, "@") {
280+
return s, nil
281+
}
282+
data, err := os.ReadFile(s[1:])
283+
if err != nil {
284+
return "", fmt.Errorf("reading file %q: %w", s[1:], err)
285+
}
286+
return strings.TrimSpace(string(data)), nil
287+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package main
2+
3+
import (
4+
"os"
5+
"path/filepath"
6+
"testing"
7+
)
8+
9+
func TestResolveAtFile_PlainValue(t *testing.T) {
10+
result, err := resolveAtFile("my-kvs-name")
11+
if err != nil {
12+
t.Fatalf("unexpected error: %v", err)
13+
}
14+
if result != "my-kvs-name" {
15+
t.Errorf("expected %q, got %q", "my-kvs-name", result)
16+
}
17+
}
18+
19+
func TestResolveAtFile_ReadsFile(t *testing.T) {
20+
dir := t.TempDir()
21+
f := filepath.Join(dir, "kvs.txt")
22+
if err := os.WriteFile(f, []byte(" my-kvs-name\n"), 0600); err != nil {
23+
t.Fatal(err)
24+
}
25+
26+
result, err := resolveAtFile("@" + f)
27+
if err != nil {
28+
t.Fatalf("unexpected error: %v", err)
29+
}
30+
if result != "my-kvs-name" {
31+
t.Errorf("expected %q, got %q", "my-kvs-name", result)
32+
}
33+
}
34+
35+
func TestResolveAtFile_MissingFile(t *testing.T) {
36+
_, err := resolveAtFile("@/nonexistent/path/kvs.txt")
37+
if err == nil {
38+
t.Fatal("expected error for nonexistent file, got nil")
39+
}
40+
}

0 commit comments

Comments
 (0)