1package gomplate
2
3import (
4	"io"
5	"os"
6	"strings"
7
8	"github.com/hairyhenderson/gomplate/v3/internal/config"
9	"github.com/hairyhenderson/gomplate/v3/internal/iohelpers"
10)
11
12// Config - values necessary for rendering templates with gomplate.
13// Mainly for use by the CLI
14//
15// Deprecated: this type will be phased out, internal/config.Config is used
16// everywhere else, and will be exposed as API in a future version
17type Config struct {
18	Input       string
19	InputFiles  []string
20	InputDir    string
21	ExcludeGlob []string
22	OutputFiles []string
23	OutputDir   string
24	OutputMap   string
25	OutMode     string
26	Out         io.Writer
27
28	DataSources       []string
29	DataSourceHeaders []string
30	Contexts          []string
31
32	Plugins []string
33
34	LDelim string
35	RDelim string
36
37	Templates []string
38}
39
40// defaults - sets any unset fields to their default value (if applicable)
41func (o *Config) defaults() *Config {
42	if o.OutputDir == "" {
43		o.OutputDir = "."
44	}
45	if o.InputFiles == nil {
46		o.InputFiles = []string{"-"}
47	}
48	if o.OutputFiles == nil {
49		o.OutputFiles = []string{"-"}
50	}
51	if o.LDelim == "" {
52		o.LDelim = "{{"
53	}
54	if o.RDelim == "" {
55		o.RDelim = "}}"
56	}
57	return o
58}
59
60// nolint: gocyclo
61func (o *Config) String() string {
62	o.defaults()
63
64	c := "input: "
65	switch {
66	case o.Input != "":
67		c += "<arg>"
68	case o.InputDir != "":
69		c += o.InputDir
70	default:
71		c += strings.Join(o.InputFiles, ", ")
72	}
73
74	if len(o.ExcludeGlob) > 0 {
75		c += "\nexclude: " + strings.Join(o.ExcludeGlob, ", ")
76	}
77
78	c += "\noutput: "
79	switch {
80	case o.InputDir != "" && o.OutputDir != ".":
81		c += o.OutputDir
82	case o.OutputMap != "":
83		c += o.OutputMap
84	default:
85		c += strings.Join(o.OutputFiles, ", ")
86	}
87
88	if o.OutMode != "" {
89		c += "\nchmod: " + o.OutMode
90	}
91
92	if len(o.DataSources) > 0 {
93		c += "\ndatasources: " + strings.Join(o.DataSources, ", ")
94	}
95	if len(o.DataSourceHeaders) > 0 {
96		c += "\ndatasourceheaders: " + strings.Join(o.DataSourceHeaders, ", ")
97	}
98	if len(o.Contexts) > 0 {
99		c += "\ncontexts: " + strings.Join(o.Contexts, ", ")
100	}
101
102	if len(o.Plugins) > 0 {
103		c += "\nplugins: " + strings.Join(o.Plugins, ", ")
104	}
105
106	if o.LDelim != "{{" {
107		c += "\nleft_delim: " + o.LDelim
108	}
109	if o.RDelim != "}}" {
110		c += "\nright_delim: " + o.RDelim
111	}
112
113	if len(o.Templates) > 0 {
114		c += "\ntemplates: " + strings.Join(o.Templates, ", ")
115	}
116	return c
117}
118
119func (o *Config) toNewConfig() (*config.Config, error) {
120	cfg := &config.Config{
121		Input:       o.Input,
122		InputFiles:  o.InputFiles,
123		InputDir:    o.InputDir,
124		ExcludeGlob: o.ExcludeGlob,
125		OutputFiles: o.OutputFiles,
126		OutputDir:   o.OutputDir,
127		OutputMap:   o.OutputMap,
128		OutMode:     o.OutMode,
129		LDelim:      o.LDelim,
130		RDelim:      o.RDelim,
131		Templates:   o.Templates,
132		Stdin:       os.Stdin,
133		Stdout:      &iohelpers.NopCloser{Writer: o.Out},
134		Stderr:      os.Stderr,
135	}
136	err := cfg.ParsePluginFlags(o.Plugins)
137	if err != nil {
138		return nil, err
139	}
140	err = cfg.ParseDataSourceFlags(o.DataSources, o.Contexts, o.DataSourceHeaders)
141	if err != nil {
142		return nil, err
143	}
144	return cfg, nil
145}
146