7
7
"os"
8
8
"path/filepath"
9
9
"strings"
10
- "time"
11
10
12
11
"github.com/kardianos/osext"
13
12
"github.com/urfave/cli"
19
18
commit = "unknown"
20
19
date = "none"
21
20
selfn , _ = osext .Executable ()
22
- selfd , _ = osext .ExecutableFolder ()
23
21
selfz = filepath .Base (selfn )
24
22
semver = version + "-" + commit [:7 ] + "." + date
25
23
appver = selfz + "/" + semver
26
- started = time .Now ().Format ("20060102T150405Z0700" )
27
24
)
28
25
29
26
//
@@ -33,16 +30,20 @@ type Settings struct {
33
30
// Set the Missing Key template option. Defaults to "error".
34
31
MissingKey string
35
32
// Configuration yaml
36
- ConfigFiles [] string
33
+ ConfigFiles cli. StringSlice
37
34
Defaulted bool
38
35
Config map [string ]interface {}
39
36
//
40
37
Arguments []string
41
38
// Add the environment map to the variables.
42
39
Environment string
43
40
//
41
+ OutputExtension string
42
+ //
44
43
TimeFormat string
45
44
//
45
+ Stdin bool
46
+ //
46
47
Debugging bool
47
48
//
48
49
Verbose bool
@@ -55,6 +56,7 @@ var settings = Settings{
55
56
TimeFormat : "20060102T150405" ,
56
57
Environment : "env" ,
57
58
Config : map [string ]interface {}{},
59
+ ConfigFiles : []string {},
58
60
Arguments : []string {},
59
61
}
60
62
@@ -66,24 +68,8 @@ func main() {
66
68
app .UsageText = "Template renderer"
67
69
app .Version = appver
68
70
app .EnableBashCompletion = true
69
- configs := cli .StringSlice ([]string {".renderizer.yaml" })
70
71
71
- // Remove args that are not processed by urfave/cli
72
- var args []string
73
- for _ , arg := range os .Args {
74
- larg := strings .ToLower (arg )
75
- switch {
76
- case larg == "-c" :
77
- fallthrough
78
- case strings .HasPrefix (arg , "--" ) && strings .Contains (arg , "=" ):
79
- settings .Arguments = append (settings .Arguments , arg )
80
-
81
- case strings .HasPrefix (arg , "--" ):
82
- fallthrough
83
- default :
84
- args = append (args , arg )
85
- }
86
- }
72
+ configs := cli.StringSlice {}
87
73
88
74
app .Commands = []cli.Command {
89
75
{
@@ -98,22 +84,29 @@ func main() {
98
84
99
85
app .Flags = []cli.Flag {
100
86
cli.StringSliceFlag {
101
- Name : "settings, S" ,
102
- Usage : " load the settings from the provided YAMLs" ,
87
+ Name : "settings, S, s " ,
88
+ Usage : ` load the settings from the provided YAMLs (default: ".renderizer.yaml")` ,
103
89
Value : & configs ,
104
90
EnvVar : "RENDERIZER" ,
105
91
},
106
92
cli.StringFlag {
107
- Name : "environment, env, E" ,
108
- Usage : "load the environment into the variable name instead of as 'env'" ,
109
- },
110
- cli.StringFlag {
111
- Name : "missing, M" ,
93
+ Name : "missing, M, m" ,
112
94
Usage : "the 'missingkey' template option (default|zero|error)" ,
113
95
Value : "error" ,
114
96
EnvVar : "RENDERIZER_MISSINGKEY" ,
115
97
Destination : & settings .MissingKey ,
116
98
},
99
+ cli.StringFlag {
100
+ Name : "environment, env, E, e" ,
101
+ Usage : "load the environment into the variable name instead of as 'env'" ,
102
+ Value : settings .Environment ,
103
+ EnvVar : "RENDERIZER_ENVIRONMENT" ,
104
+ },
105
+ cli.BoolFlag {
106
+ Name : "stdin, c" ,
107
+ Usage : "read from stdin" ,
108
+ Destination : & settings .Stdin ,
109
+ },
117
110
cli.BoolFlag {
118
111
Name : "debugging, debug, D" ,
119
112
Usage : "enable debugging server" ,
@@ -127,7 +120,35 @@ func main() {
127
120
}
128
121
129
122
app .Before = func (ctx * cli.Context ) error {
123
+
124
+ fi , _ := os .Stdin .Stat ()
125
+
126
+ settings .Stdin = settings .Stdin || (fi .Mode ()& os .ModeCharDevice ) == 0
127
+
130
128
settings .Arguments = append (settings .Arguments , ctx .Args ()... )
129
+ if len (settings .Arguments ) == 0 && ! settings .Stdin {
130
+ // Try default the template name
131
+ folderName , err := os .Getwd ()
132
+ if err != nil {
133
+ log .Println (err )
134
+ folderName = "renderizer"
135
+ } else {
136
+ folderName = filepath .Base (folderName )
137
+ }
138
+
139
+ for _ , ext := range []string {".tmpl" , "" } {
140
+ for _ , try := range []string {"yaml" , "json" , "html" , "txt" , "xml" , "" } {
141
+ name := fmt .Sprintf ("%s.%s%s" , folderName , try , ext )
142
+ if _ , err := os .Stat (name ); err == nil {
143
+ if settings .Verbose {
144
+ log .Printf ("using template: %+v" , name )
145
+ }
146
+ settings .Arguments = []string {name }
147
+ }
148
+ }
149
+ }
150
+
151
+ }
131
152
132
153
switch settings .MissingKey {
133
154
case "zero" , "error" , "default" , "invalid" :
@@ -136,9 +157,15 @@ func main() {
136
157
settings .MissingKey = "error"
137
158
}
138
159
139
- if len (settings .ConfigFiles ) == 0 {
160
+ if len (configs ) == 0 {
161
+ name := "renderizer"
162
+ if len (settings .Arguments ) >= 1 {
163
+ name = strings .Split (strings .TrimLeft (filepath .Base (settings .Arguments [0 ]), "." ), "." )[0 ]
164
+ }
140
165
settings .Defaulted = true
141
- settings .ConfigFiles = []string {".renderizer.yaml" }
166
+ settings .ConfigFiles = []string {"." + name + ".yaml" }
167
+ } else {
168
+ settings .ConfigFiles = configs
142
169
}
143
170
144
171
for _ , config := range settings .ConfigFiles {
@@ -149,22 +176,55 @@ func main() {
149
176
}
150
177
} else {
151
178
yaml .Unmarshal (in , & settings .Config )
152
- if settings .Verbose && settings .Defaulted {
153
- log .Printf ("used config : %+v" , settings .ConfigFiles )
179
+ if settings .Verbose || settings .Defaulted {
180
+ log .Printf ("using settings : %+v" , settings .ConfigFiles )
154
181
}
155
182
}
156
183
if settings .Debugging {
157
- log .Printf ("-settings:%#v" , settings )
184
+ log .Printf ("-- settings:%#v" , settings )
158
185
log .Printf ("loaded: %#v" , settings .Config )
159
186
} else if settings .Verbose {
160
- log .Printf ("-settings:%+v" , settings )
187
+ log .Printf ("-- settings:%+v" , settings )
161
188
log .Printf ("loaded: %+v" , settings .Config )
162
189
}
163
190
}
164
191
165
192
return nil
166
193
}
167
194
195
+ // Remove args that are not processed by urfave/cli
196
+ args := []string {os .Args [0 ]}
197
+ if len (os .Args ) > 1 {
198
+ next := false
199
+ for _ , arg := range os .Args [1 :] {
200
+ larg := strings .ToLower (arg )
201
+ if next {
202
+ args = append (args , arg )
203
+ next = false
204
+ continue
205
+ }
206
+ if strings .HasPrefix (larg , "--" ) {
207
+ flag := larg
208
+ parts := strings .SplitN (larg , "=" , 2 )
209
+ if len (parts ) == 2 {
210
+ flag = parts [0 ]
211
+ }
212
+ switch flag [2 :] {
213
+ case "settings" , "missing" :
214
+ // If the flag requires a parameter but it is not specified with an =, grab the next argument too.
215
+ if ! strings .Contains (larg , "=" ) {
216
+ next = true
217
+ }
218
+ fallthrough
219
+ case "debug" , "verbose" , "version" , "stdin" :
220
+ args = append (args , arg )
221
+ continue
222
+ }
223
+ }
224
+ settings .Arguments = append (settings .Arguments , arg )
225
+ }
226
+ }
227
+
168
228
app .Action = renderizer
169
229
app .Run (args )
170
230
}
0 commit comments