Skip to content

Commit 0444b6b

Browse files
replaced env vars with template field
1 parent 8be47bf commit 0444b6b

File tree

3 files changed

+49
-49
lines changed

3 files changed

+49
-49
lines changed

cmd/obol/network.go

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -74,75 +74,75 @@ func buildNetworkInstallCommands(cfg *config.Config) []*cli.Command {
7474

7575
var commands []*cli.Command
7676
for _, networkName := range networks {
77-
// Parse the embedded helmfile to get env vars
78-
envVars, err := network.ParseEmbeddedNetworkEnvVars(networkName)
77+
// Parse the embedded values template to get fields
78+
fields, err := network.ParseTemplateFields(networkName)
7979
if err != nil {
8080
// Skip networks we can't parse
8181
continue
8282
}
8383

84-
// Build flags from env vars
84+
// Build flags from template fields
8585
flags := []cli.Flag{}
86-
for _, envVar := range envVars {
86+
for _, field := range fields {
8787
// Customize id flag description to include network-specific example
88-
if envVar.FlagName == "id" {
88+
if field.FlagName == "id" {
8989
flags = append(flags, &cli.StringFlag{
9090
Name: "id",
9191
Usage: fmt.Sprintf("Namespace suffix for this deployment (e.g., 'smart-kodiak' becomes '%s-smart-kodiak', defaults to generated petname)", networkName),
92-
Required: envVar.Required,
92+
Required: field.Required,
9393
})
9494
continue
9595
}
9696
// Build usage string
97-
usage := envVar.Description
97+
usage := field.Description
9898
if usage == "" {
99-
usage = fmt.Sprintf("Override %s", envVar.Name)
99+
usage = fmt.Sprintf("Override %s", field.Name)
100100
}
101101

102102
// Mark as required if no default value
103-
if envVar.Required {
103+
if field.Required {
104104
usage = "[REQUIRED] " + usage
105105
}
106106

107107
// Add enum options if available
108-
if len(envVar.EnumValues) > 0 {
109-
usage += fmt.Sprintf(" [options: %s]", strings.Join(envVar.EnumValues, ", "))
108+
if len(field.EnumValues) > 0 {
109+
usage += fmt.Sprintf(" [options: %s]", strings.Join(field.EnumValues, ", "))
110110
}
111111

112112
// Add default value
113-
if envVar.DefaultValue != "" {
114-
usage += fmt.Sprintf(" (default: %s)", envVar.DefaultValue)
113+
if field.DefaultValue != "" {
114+
usage += fmt.Sprintf(" (default: %s)", field.DefaultValue)
115115
}
116116

117117
flags = append(flags, &cli.StringFlag{
118-
Name: envVar.FlagName,
118+
Name: field.FlagName,
119119
Usage: usage,
120-
Required: envVar.Required,
120+
Required: field.Required,
121121
})
122122
}
123123

124124
// Create the network-specific install command
125125
netName := networkName // Capture for closure
126-
netEnvVars := envVars // Capture for validation
126+
netFields := fields // Capture for validation
127127
commands = append(commands, &cli.Command{
128128
Name: netName,
129129
Usage: fmt.Sprintf("Install %s network", netName),
130130
Flags: flags,
131131
Action: func(c *cli.Context) error {
132132
// Collect and validate flag values
133133
overrides := make(map[string]string)
134-
for _, envVar := range netEnvVars {
135-
value := c.String(envVar.FlagName)
134+
for _, field := range netFields {
135+
value := c.String(field.FlagName)
136136
if value != "" {
137137
// Validate enum constraint if defined
138-
if len(envVar.EnumValues) > 0 {
139-
valid := slices.Contains(envVar.EnumValues, value)
138+
if len(field.EnumValues) > 0 {
139+
valid := slices.Contains(field.EnumValues, value)
140140
if !valid {
141141
return fmt.Errorf("invalid value '%s' for --%s. Valid options: %s",
142-
value, envVar.FlagName, strings.Join(envVar.EnumValues, ", "))
142+
value, field.FlagName, strings.Join(field.EnumValues, ", "))
143143
}
144144
}
145-
overrides[envVar.FlagName] = value
145+
overrides[field.FlagName] = value
146146
}
147147
}
148148

internal/network/network.go

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -51,35 +51,35 @@ func Install(cfg *config.Config, network string, overrides map[string]string) er
5151
fmt.Printf("Generated deployment ID: %s\n", id)
5252
}
5353

54-
// Parse embedded helmfile to get template fields
55-
envVars, err := ParseEmbeddedNetworkEnvVars(network)
54+
// Parse embedded values template to get fields
55+
fields, err := ParseTemplateFields(network)
5656
if err != nil {
57-
return fmt.Errorf("failed to parse embedded helmfile: %w", err)
57+
return fmt.Errorf("failed to parse embedded values template: %w", err)
5858
}
5959

6060
// Build template data from CLI flags and defaults
6161
templateData := make(map[string]string)
62-
if len(envVars) > 0 {
62+
if len(fields) > 0 {
6363
fmt.Println("Configuration:")
64-
for _, envVar := range envVars {
65-
value := envVar.DefaultValue
64+
for _, field := range fields {
65+
value := field.DefaultValue
6666

6767
// Check if there's an override from CLI flags
68-
if overrideValue, ok := overrides[envVar.FlagName]; ok {
68+
if overrideValue, ok := overrides[field.FlagName]; ok {
6969
value = overrideValue
70-
fmt.Printf(" %s = %s (from --%s)\n", envVar.Name, value, envVar.FlagName)
71-
} else if envVar.Required && value == "" {
70+
fmt.Printf(" %s = %s (from --%s)\n", field.Name, value, field.FlagName)
71+
} else if field.Required && value == "" {
7272
// Required field with no value provided
73-
return fmt.Errorf("missing required flag: --%s", envVar.FlagName)
73+
return fmt.Errorf("missing required flag: --%s", field.FlagName)
7474
} else if value != "" {
75-
fmt.Printf(" %s = %s (default)\n", envVar.Name, value)
75+
fmt.Printf(" %s = %s (default)\n", field.Name, value)
7676
} else {
7777
// Optional field with empty default
78-
fmt.Printf(" %s = (empty, optional)\n", envVar.Name)
78+
fmt.Printf(" %s = (empty, optional)\n", field.Name)
7979
}
8080

8181
// Add to template data using field name (e.g., "Network", "ExecutionClient")
82-
templateData[envVar.Name] = value
82+
templateData[field.Name] = value
8383
}
8484
}
8585

internal/network/parser.go

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,14 @@ import (
1010
"github.com/ObolNetwork/obol-stack/internal/embed"
1111
)
1212

13-
// EnvVar represents an environment variable with its default value
14-
type EnvVar struct {
13+
// TemplateField represents a template field with its configuration
14+
type TemplateField struct {
1515
Name string
1616
DefaultValue string
17-
FlagName string // CLI flag name derived from env var name
17+
FlagName string // CLI flag name derived from field name
1818
Description string // Human-readable description from @description
1919
EnumValues []string // Valid enum values from @enum
20-
Required bool // Whether this env var is required (no default value)
20+
Required bool // Whether this field is required (no default value)
2121
}
2222

2323
// extractTemplateFields parses a Go template and extracts all field references
@@ -130,26 +130,26 @@ func parseAnnotationsFromLines(lines []string, fieldLineNum int) ([]string, stri
130130
return enumValues, defaultValue, description, hasDefault
131131
}
132132

133-
// ParseEmbeddedNetworkEnvVars extracts template fields from an embedded network values file
134-
// Now uses Go template parsing instead of regex-based env var detection
135-
func ParseEmbeddedNetworkEnvVars(networkName string) ([]EnvVar, error) {
133+
// ParseTemplateFields extracts template fields from an embedded network values file
134+
// Uses Go template parsing to identify field references and their annotations
135+
func ParseTemplateFields(networkName string) ([]TemplateField, error) {
136136
// Read the embedded values template
137137
content, err := embed.ReadEmbeddedNetworkFile(networkName, "values.yaml.gotmpl")
138138
if err != nil {
139139
return nil, fmt.Errorf("failed to read embedded values: %w", err)
140140
}
141141

142142
// Extract template fields using Go template parser
143-
fields, err := extractTemplateFields(string(content))
143+
fieldMap, err := extractTemplateFields(string(content))
144144
if err != nil {
145145
return nil, fmt.Errorf("failed to extract template fields: %w", err)
146146
}
147147

148148
lines := strings.Split(string(content), "\n")
149-
var envVars []EnvVar
149+
var fields []TemplateField
150150

151-
// For each field, extract annotations and create EnvVar
152-
for fieldName, lineNum := range fields {
151+
// For each field, extract annotations and create TemplateField
152+
for fieldName, lineNum := range fieldMap {
153153
enumValues, defaultValue, description, hasDefault := parseAnnotationsFromLines(lines, lineNum)
154154

155155
// Convert field name to CLI flag name (e.g., ExecutionClient -> execution-client)
@@ -158,18 +158,18 @@ func ParseEmbeddedNetworkEnvVars(networkName string) ([]EnvVar, error) {
158158
// Determine if field is required (no @default annotation)
159159
required := !hasDefault
160160

161-
envVar := EnvVar{
161+
field := TemplateField{
162162
Name: fieldName,
163163
DefaultValue: defaultValue,
164164
FlagName: flagName,
165165
Description: description,
166166
EnumValues: enumValues,
167167
Required: required,
168168
}
169-
envVars = append(envVars, envVar)
169+
fields = append(fields, field)
170170
}
171171

172-
return envVars, nil
172+
return fields, nil
173173
}
174174

175175
// fieldNameToFlagName converts a template field name to a CLI flag name

0 commit comments

Comments
 (0)