Skip to content

Commit 50b0938

Browse files
committed
Implement writing tar files from templates
1 parent 31d4651 commit 50b0938

File tree

3 files changed

+96
-57
lines changed

3 files changed

+96
-57
lines changed

examples/builder/builder.go

Lines changed: 77 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -17,35 +17,92 @@ import (
1717
//go:embed templates/*.tmpl
1818
var templates embed.FS
1919

20-
func buildTemplate(input ContainerInput) (file, error) {
21-
tpl, err := template.ParseFS(templates, "templates/*.tmpl")
22-
if err != nil {
23-
return file{}, xerrors.Errorf("parse template: %w", err)
24-
}
20+
type TemplateInput struct {
21+
TemplateName string
22+
23+
Kubernetes KubeOptions
24+
}
2525

26-
tpl = tpl.Funcs(template.FuncMap{
26+
type ReadmeInput struct {
27+
Platform string
28+
Name string
29+
Description string
30+
Tags []string
31+
Icon string
32+
}
33+
34+
func buildTemplate(input TemplateInput) ([]byte, error) {
35+
tpl, err := template.New("").Funcs(template.FuncMap{
2736
"join": strings.Join,
2837
"contains": slice.Contains[string],
29-
})
38+
"quote": func(in string) string { return "\"" + in + "\"" },
39+
}).ParseFS(templates, "templates/*.tmpl")
40+
if err != nil {
41+
return nil, xerrors.Errorf("parse template: %w", err)
42+
}
43+
44+
var out bytes.Buffer
45+
tarWriter := tar.NewWriter(&out)
3046

31-
var buf bytes.Buffer
32-
// TODO: Change the name based on the input
33-
err = tpl.ExecuteTemplate(&buf, "docker", input)
47+
tf, readme, err := buildKube(tpl, input.Kubernetes)
3448
if err != nil {
35-
return file{}, xerrors.Errorf("execute template: %w", err)
49+
return nil, err
3650
}
3751

38-
return file{
39-
name: "main.tf",
40-
content: buf.Bytes(),
41-
}, nil
52+
md, err := buildReadme(tpl, readme)
53+
if err != nil {
54+
return nil, err
55+
}
56+
57+
err = writeFiles(tarWriter, tf, md)
58+
if err != nil {
59+
return nil, xerrors.Errorf("write tar files: %w", err)
60+
}
61+
62+
err = tarWriter.Close()
63+
if err != nil {
64+
return nil, xerrors.Errorf("close tar writer: %w", err)
65+
}
66+
return out.Bytes(), nil
4267
}
4368

4469
type file struct {
4570
name string
4671
content []byte
4772
}
4873

74+
func buildKube(tpl *template.Template, input KubeOptions) (file, ReadmeInput, error) {
75+
var out bytes.Buffer
76+
err := tpl.ExecuteTemplate(&out, "kubernetes", input)
77+
if err != nil {
78+
return file{}, ReadmeInput{}, xerrors.Errorf("execute kube template: %w", err)
79+
}
80+
81+
return file{
82+
name: "main.tf",
83+
content: out.Bytes(),
84+
}, ReadmeInput{
85+
Platform: "Kubernetes",
86+
Name: "Kubernetes based template",
87+
Description: "Pod based developer workspaces that live in kubernetes.",
88+
Tags: []string{"cloud", "kubernetes"},
89+
Icon: "/icon/k8s.png",
90+
}, nil
91+
}
92+
93+
func buildReadme(tpl *template.Template, input ReadmeInput) (file, error) {
94+
var out bytes.Buffer
95+
err := tpl.ExecuteTemplate(&out, "readme", input)
96+
if err != nil {
97+
return file{}, xerrors.Errorf("execute readme template: %w", err)
98+
}
99+
100+
return file{
101+
name: "README.md",
102+
content: out.Bytes(),
103+
}, nil
104+
}
105+
49106
func writeFiles(w *tar.Writer, files ...file) error {
50107
for _, f := range files {
51108
err := w.WriteHeader(&tar.Header{
@@ -59,42 +116,12 @@ func writeFiles(w *tar.Writer, files ...file) error {
59116
if err != nil {
60117
return err
61118
}
62-
}
63-
64-
return nil
65-
}
66-
67-
func BuildReadme() {
68-
69-
}
70-
71-
func dockerTemplate() (*template.Template, error) {
72-
return template.ParseFS(templates, "templates/docker.tpl")
73-
}
74-
75-
type ContainerInput struct {
76-
DockerImage string `json:"docker-image"`
77-
}
78-
79-
type KubernetesInput struct {
80-
ContainerInput
81-
}
82-
83-
func BuildDocker(input interface{}) {
84-
85-
}
86-
87-
func build(input interface{}) (string, error) {
88-
tpl, err := dockerTemplate()
89-
if err != nil {
90-
return "", err
91-
}
92119

93-
var buf bytes.Buffer
94-
err = tpl.Execute(&buf, input)
95-
if err != nil {
96-
return "", err
120+
_, err = w.Write(f.content)
121+
if err != nil {
122+
return err
123+
}
97124
}
98125

99-
return buf.String(), nil
126+
return nil
100127
}

examples/builder/builder_internal_test.go

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,19 @@ import (
88
)
99

1010
func TestBuilder(t *testing.T) {
11-
out, err := buildTemplate(ContainerInput{})
11+
out, err := buildTemplate(TemplateInput{
12+
TemplateName: "test",
13+
Kubernetes: KubeOptions{
14+
Os: "",
15+
Arch: "",
16+
Namespace: Variable{},
17+
Image: "",
18+
Resources: Resources{},
19+
Env: nil,
20+
HomePVC: false,
21+
},
22+
})
1223
require.NoError(t, err)
13-
fmt.Println(out)
24+
// This output is a tar file
25+
fmt.Println(string(out))
1426
}

examples/builder/templates/readme.tmpl

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
{{- define "readme" -}}
22
---
3-
name: {{ .Data.Readme.Name }}
4-
description: {{ .Data.Readme.Desc }}
5-
tags: [{{ join .Data.Readme.Tags "," }}]
6-
icon: /icon/docker.png
3+
name: {{ .Name }}
4+
description: {{ .Description }}
5+
tags: [{{ join .Tags "," }}]
6+
icon: {{ .Icon }}
77
---
88

9-
# {{ .Template.Platform }} Template
9+
# {{ .Platform }} Workspace
1010

1111
// TODO: Put in a url to get back to the wizard with pre-filled values
1212

0 commit comments

Comments
 (0)