@@ -28,7 +28,9 @@ package main
2828import (
2929 "flag"
3030 "fmt"
31+ "log"
3132 "os"
33+ "reflect"
3234 "strings"
3335 "time"
3436)
@@ -54,6 +56,7 @@ func main() {
5456 var verbose bool
5557 var version bool
5658 var pretty bool
59+ var dry_run bool
5760 var help bool
5861
5962 flag .StringVar (& filter_text , "f" , "" , "The DFL expression to evaulate" )
@@ -62,6 +65,7 @@ func main() {
6265 flag .BoolVar (& load_env , "env" , false , "Load environment variables" )
6366 flag .BoolVar (& verbose , "verbose" , false , "Provide verbose output" )
6467 flag .BoolVar (& version , "version" , false , "Prints version to stdout" )
68+ flag .BoolVar (& dry_run , "dry_run" , false , "Do a dry run (parse and compile expression but do not evaluate)" )
6569 flag .BoolVar (& help , "help" , false , "Print help" )
6670
6771 flag .Parse ()
@@ -96,31 +100,37 @@ func main() {
96100 }
97101 }
98102
103+ funcs := dfl .NewFuntionMapWithDefaults ()
104+
99105 for _ , a := range flag .Args () {
100106 if ! strings .Contains (a , "=" ) {
101- fmt .Println ("Context attribute \" " + a + "\" does not contain \" =\" ." )
102- os .Exit (1 )
107+ log .Fatal (errors .New ("Context attribute \" " + a + "\" does not contain \" =\" ." ))
103108 }
104109 pair := strings .SplitN (a , "=" , 2 )
105110 value , err := dfl .Parse (strings .TrimSpace (pair [1 ]))
106111 if err != nil {
107- fmt .Println (errors .Wrap (err , "Could not parse context variable" ))
108- os .Exit (1 )
112+ log .Fatal (errors .Wrap (err , "Could not parse context variable" ))
109113 }
110114 value = value .Compile ()
111115 switch value .(type ) {
116+ case dfl.Array :
117+ _ , arr , err := value .(dfl.Array ).Evaluate (map [string ]interface {}{}, map [string ]interface {}{}, funcs , GO_DFL_DEFAULT_QUOTES [1 :])
118+ if err != nil {
119+ log .Fatal (errors .Wrap (err , "error evaluating context expression for " + strings .TrimSpace (pair [0 ])))
120+ }
121+ ctx [strings .TrimSpace (pair [0 ])] = arr
112122 case dfl.Literal :
113123 ctx [strings .TrimSpace (pair [0 ])] = value .(dfl.Literal ).Value
124+ case * dfl.Literal :
125+ ctx [strings .TrimSpace (pair [0 ])] = value .(* dfl.Literal ).Value
114126 default :
115127 ctx [strings .TrimSpace (pair [0 ])] = dfl .TryConvertString (pair [1 ])
116128 }
117129 }
118130
119131 root , err := dfl .Parse (filter_text )
120132 if err != nil {
121- fmt .Println ("Error parsing filter expression." )
122- fmt .Println (err )
123- os .Exit (1 )
133+ log .Fatal (errors .Wrap (err , "error parsing filter expression" ))
124134 }
125135
126136 if pretty {
@@ -164,34 +174,36 @@ func main() {
164174 fmt .Println (GO_DFL_DEFAULT_QUOTES [0 ] + root .Dfl (GO_DFL_DEFAULT_QUOTES [1 :], false , 0 ) + GO_DFL_DEFAULT_QUOTES [0 ])
165175 }
166176
167- result , err := root .Evaluate (ctx , dfl .NewFuntionMapWithDefaults (), GO_DFL_DEFAULT_QUOTES [1 :])
177+ if dry_run {
178+ os .Exit (0 )
179+ }
180+
181+ _ , result , err := root .Evaluate (map [string ]interface {}{}, ctx , funcs , GO_DFL_DEFAULT_QUOTES [1 :])
168182 if err != nil {
169- fmt .Println ("Error evaluating expression." )
170- fmt .Println (err )
171- os .Exit (1 )
183+ log .Fatal (errors .Wrap (err , "error evaluating expression" ))
172184 }
173185
174186 switch result .(type ) {
175187 case bool :
176188 result_bool := result .(bool )
177189 if verbose {
178190 fmt .Println ("******************* Result *******************" )
179- if result_bool {
180- fmt .Println ("true" )
181- } else {
182- fmt .Println ("false" )
183- }
184-
191+ fmt .Println (dfl .TryFormatLiteral (result , GO_DFL_DEFAULT_QUOTES [1 :], false , 0 ))
185192 elapsed := time .Since (start )
186193 fmt .Println ("Done in " + elapsed .String ())
187194 }
188-
189195 if result_bool {
190196 os .Exit (0 )
191197 } else {
192198 os .Exit (1 )
193199 }
194200 default :
195- os .Exit (1 )
201+ if verbose {
202+ fmt .Println ("******************* Result *******************" )
203+ fmt .Println ("Type:" , reflect .TypeOf (result ))
204+ fmt .Println ("Value:" , dfl .TryFormatLiteral (result , GO_DFL_DEFAULT_QUOTES [1 :], false , 0 ))
205+ elapsed := time .Since (start )
206+ fmt .Println ("Done in " + elapsed .String ())
207+ }
196208 }
197209}
0 commit comments