Skip to content

Commit d048ffa

Browse files
committed
feat: added ability to pull from local file for source flags
Signed-off-by: Jason Salaber <jcsalaber@hotmail.com>
1 parent 7ba5c1c commit d048ffa

File tree

3 files changed

+62
-3
lines changed

3 files changed

+62
-3
lines changed

cmd/pull.go

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@ import (
44
"errors"
55
"fmt"
66
"strconv"
7+
"strings"
78

89
"github.com/open-feature/cli/internal/config"
10+
"github.com/open-feature/cli/internal/filesystem"
911
"github.com/open-feature/cli/internal/flagset"
1012
"github.com/open-feature/cli/internal/manifest"
1113
"github.com/open-feature/cli/internal/requests"
@@ -73,8 +75,28 @@ func GetPullCmd() *cobra.Command {
7375
return fmt.Errorf("flagSourceUrl not set in config")
7476
}
7577

78+
flags := flagset.Flagset{}
7679
// fetch the flags from the remote source
77-
flags, err := requests.FetchFlags(flagSourceUrl, authToken)
80+
// Check if the URL is a local file path
81+
if strings.HasPrefix(flagSourceUrl, "file://") {
82+
localPath := strings.TrimPrefix(flagSourceUrl, "file://")
83+
var data, err = filesystem.ReadFile(localPath)
84+
if err != nil {
85+
return fmt.Errorf("error reading local flags file: %w", err)
86+
}
87+
loadedFlags, err := flagset.LoadFromSourceFlags(data)
88+
if err != nil {
89+
return fmt.Errorf("error loading flags from local file: %w", err)
90+
}
91+
flags.Flags = *loadedFlags
92+
} else if strings.HasPrefix(flagSourceUrl, "http://") && !strings.HasPrefix(flagSourceUrl, "https://") {
93+
flags, err = requests.FetchFlags(flagSourceUrl, authToken)
94+
if err != nil {
95+
return fmt.Errorf("error reading local flags file: %w", err)
96+
}
97+
return nil
98+
}
99+
78100
if err != nil {
79101
return fmt.Errorf("error fetching flags: %w", err)
80102
}

internal/flagset/flagset.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,13 +114,16 @@ func LoadFromSourceFlags(data []byte) (*[]Flag, error) {
114114
DefaultValue any `json:"defaultValue"`
115115
}
116116

117-
var sourceFlags []SourceFlag
117+
var sourceFlags struct {
118+
Flags []SourceFlag `json:"flags"`
119+
}
120+
118121
if err := json.Unmarshal(data, &sourceFlags); err != nil {
119122
return nil, err
120123
}
121124

122125
var flags []Flag
123-
for _, sf := range sourceFlags {
126+
for _, sf := range sourceFlags.Flags {
124127
var flagType FlagType
125128
switch sf.Type {
126129
case "integer", "Integer":

sample/sample_source_flags.json

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
{
2+
"flags": [
3+
{
4+
"key": "flag1",
5+
"type": "boolean",
6+
"description": "A boolean flag",
7+
"defaultValue": false
8+
},
9+
{
10+
"key": "flag2",
11+
"type": "string",
12+
"description": "A string flag",
13+
"defaultValue": "default"
14+
},
15+
{
16+
"key": "flag3",
17+
"type": "integer",
18+
"description": "An integer flag",
19+
"defaultValue": 0
20+
},
21+
{
22+
"key": "flag4",
23+
"type": "float",
24+
"description": "A float flag",
25+
"defaultValue": 0.0
26+
},
27+
{
28+
"key": "flag5",
29+
"type": "object",
30+
"description": "An object flag",
31+
"defaultValue": {}
32+
}
33+
]
34+
}

0 commit comments

Comments
 (0)