11package base
22
33import (
4- "fmt"
54 "io/ioutil"
65 "os"
7- "path"
8- "strconv"
9- "strings"
106
117 "github.com/docker/infrakit/pkg/cli"
128 "github.com/docker/infrakit/pkg/discovery"
13- "github.com/docker/infrakit/pkg/template"
14- "github.com/ghodss/yaml"
159 "github.com/spf13/pflag"
1610)
1711
18- // ProcessTemplateFunc is the function that processes the template at url and returns view or error.
19- type ProcessTemplateFunc func (url string ) (rendered string , err error )
20-
21- // ToJSONFunc converts the input buffer to json format
22- type ToJSONFunc func (in []byte ) (json []byte , err error )
23-
24- // FromJSONFunc converts json formatted input to output buffer
25- type FromJSONFunc func (json []byte ) (out []byte , err error )
26-
2712// ReadFromStdinIfElse checks condition and reads from stdin if true; otherwise it executes other.
2813func ReadFromStdinIfElse (
2914 condition func () bool ,
3015 otherwise func () (string , error ),
31- toJSON ToJSONFunc ) (rendered string , err error ) {
16+ toJSON cli. ToJSONFunc ) (rendered string , err error ) {
3217
3318 if condition () {
3419 buff , err := ioutil .ReadAll (os .Stdin )
@@ -52,111 +37,10 @@ func ReadFromStdinIfElse(
5237}
5338
5439// TemplateProcessor returns a flagset and a function for processing template input.
55- func TemplateProcessor (plugins func () discovery.Plugins ) (* pflag.FlagSet , ToJSONFunc , FromJSONFunc , ProcessTemplateFunc ) {
56-
57- fs := pflag .NewFlagSet ("template" , pflag .ExitOnError )
58-
59- globals := fs .StringSliceP ("var" , "v" , []string {}, "key=value pairs of globally scoped variagbles" )
60- yamlDoc := fs .BoolP ("yaml" , "y" , false , "True if input is in yaml format; json is the default" )
61- dump := fs .BoolP ("dump" , "x" , false , "True to dump to output instead of executing" )
62- singlePass := fs .BoolP ("final" , "f" , false , "True to render template as the final pass" )
63-
64- return fs ,
65- // ToJSONFunc
66- func (in []byte ) (json []byte , err error ) {
67-
68- defer func () {
69-
70- if * dump {
71- fmt .Println ("Raw:" )
72- fmt .Println (string (in ))
73- fmt .Println ("Converted" )
74- fmt .Println (string (json ))
75- os .Exit (0 ) // special for debugging
76- }
77- }()
78-
79- if * yamlDoc {
80- json , err = yaml .YAMLToJSON (in )
81- return
82- }
83- json = in
84- return
85-
86- },
87- // FromJSONFunc
88- func (json []byte ) (out []byte , err error ) {
89-
90- defer func () {
91-
92- if * dump {
93- fmt .Println ("Raw:" )
94- fmt .Println (string (json ))
95- fmt .Println ("Converted" )
96- fmt .Println (string (out ))
97- os .Exit (0 ) // special for debugging
98- }
99- }()
100-
101- if * yamlDoc {
102- out , err = yaml .JSONToYAML (json )
103- return
104- }
105- out = json
106- return
107-
108- },
109- // ProcessTemplateFunc
110- func (url string ) (view string , err error ) {
111-
112- if ! strings .Contains (url , "://" ) {
113- p := url
114- if dir , err := os .Getwd (); err == nil {
115- p = path .Join (dir , url )
116- }
117- url = "file://" + p
118- }
119-
120- log .Debug ("reading template" , "url" , url )
121- engine , err := template .NewTemplate (url , template.Options {MultiPass : ! * singlePass })
122- if err != nil {
123- return
124- }
125-
126- for _ , global := range * globals {
127- kv := strings .SplitN (global , "=" , 2 )
128- if len (kv ) != 2 {
129- log .Warn ("bad format kv" , "input" , global )
130- continue
131- }
132- key := strings .TrimSpace (kv [0 ])
133- val := strings .TrimSpace (kv [1 ])
134- if key != "" && val != "" {
135- // Attempt to convert to int and bool types so that template operations
136- // are not only against strings.
137- if intVal , err := strconv .Atoi (val ); err == nil {
138- engine .Global (key , intVal )
139- } else if boolVar , err := strconv .ParseBool (val ); err == nil {
140- engine .Global (key , boolVar )
141- } else {
142- engine .Global (key , val )
143- }
144- }
145- }
146-
147- cli .ConfigureTemplate (engine , plugins )
148-
149- view , err = engine .Render (nil )
150- if err != nil {
151- return
152- }
153-
154- log .Debug ("rendered" , "view" , view )
155- if * dump {
156- fmt .Println ("Final:" )
157- fmt .Println (string (view ))
158- os .Exit (0 )
159- }
160- return
161- }
40+ func TemplateProcessor (plugins func () discovery.Plugins ) (* pflag.FlagSet , cli.ToJSONFunc , cli.FromJSONFunc , cli.ProcessTemplateFunc ) {
41+ services := cli .NewServices (plugins )
42+ return services .ProcessTemplateFlags ,
43+ services .ToJSON ,
44+ services .FromJSON ,
45+ services .ProcessTemplate
16246}
0 commit comments