...
1
2
3
4 package main
5
6 import (
7 "fmt"
8 "log"
9 "os"
10 "text/template"
11
12 "github.com/aws/smithy-go/ptr"
13 )
14
15 func main() {
16 types := ptr.GetScalars()
17
18 for filename, tmplName := range map[string]string{
19 "to_ptr.go": "scalar to pointer",
20 "from_ptr.go": "scalar from pointer",
21 } {
22 if err := generateFile(filename, tmplName, types); err != nil {
23 log.Fatalf("%s file generation failed, %v", filename, err)
24 }
25 }
26 }
27
28 func generateFile(filename string, tmplName string, types ptr.Scalars) (err error) {
29 f, err := os.Create(filename)
30 if err != nil {
31 return fmt.Errorf("failed to create %s file, %v", filename, err)
32 }
33
34 defer func() {
35 closeErr := f.Close()
36 if err == nil {
37 err = closeErr
38 } else if closeErr != nil {
39 err = fmt.Errorf("close error: %v, original error: %w", closeErr, err)
40 }
41 }()
42
43 if err = ptrTmpl.ExecuteTemplate(f, tmplName, types); err != nil {
44 return fmt.Errorf("failed to generate %s file, %v", filename, err)
45 }
46
47 return nil
48 }
49
50 var ptrTmpl = template.Must(template.New("ptrTmpl").Parse(`
51 {{- define "header" }}
52 // Code generated by smithy-go/ptr/generate.go DO NOT EDIT.
53 package ptr
54
55 import (
56 {{- range $_, $import := $.Imports }}
57 "{{ $import.Path }}"
58 {{- end }}
59 )
60 {{- end }}
61
62 {{- define "scalar from pointer" }}
63 {{ template "header" $ }}
64
65 {{ range $_, $type := $ }}
66 {{ template "from pointer func" $type }}
67 {{ template "from pointers func" $type }}
68 {{- end }}
69 {{- end }}
70
71 {{- define "scalar to pointer" }}
72 {{ template "header" $ }}
73
74 {{ range $_, $type := $ }}
75 {{ template "to pointer func" $type }}
76 {{ template "to pointers func" $type }}
77 {{- end }}
78 {{- end }}
79
80 {{- define "to pointer func" }}
81 // {{ $.Name }} returns a pointer value for the {{ $.Symbol }} value passed in.
82 func {{ $.Name }}(v {{ $.Symbol }}) *{{ $.Symbol }} {
83 return &v
84 }
85 {{- end }}
86
87 {{- define "to pointers func" }}
88 // {{ $.Name }}Slice returns a slice of {{ $.Symbol }} pointers from the values
89 // passed in.
90 func {{ $.Name }}Slice(vs []{{ $.Symbol }}) []*{{ $.Symbol }} {
91 ps := make([]*{{ $.Symbol }}, len(vs))
92 for i, v := range vs {
93 vv := v
94 ps[i] = &vv
95 }
96
97 return ps
98 }
99
100 // {{ $.Name }}Map returns a map of {{ $.Symbol }} pointers from the values
101 // passed in.
102 func {{ $.Name }}Map(vs map[string]{{ $.Symbol }}) map[string]*{{ $.Symbol }} {
103 ps := make(map[string]*{{ $.Symbol }}, len(vs))
104 for k, v := range vs {
105 vv := v
106 ps[k] = &vv
107 }
108
109 return ps
110 }
111 {{- end }}
112
113 {{- define "from pointer func" }}
114 // To{{ $.Name }} returns {{ $.Symbol }} value dereferenced if the passed
115 // in pointer was not nil. Returns a {{ $.Symbol }} zero value if the
116 // pointer was nil.
117 func To{{ $.Name }}(p *{{ $.Symbol }}) (v {{ $.Symbol }}) {
118 if p == nil {
119 return v
120 }
121
122 return *p
123 }
124 {{- end }}
125
126 {{- define "from pointers func" }}
127 // To{{ $.Name }}Slice returns a slice of {{ $.Symbol }} values, that are
128 // dereferenced if the passed in pointer was not nil. Returns a {{ $.Symbol }}
129 // zero value if the pointer was nil.
130 func To{{ $.Name }}Slice(vs []*{{ $.Symbol }}) []{{ $.Symbol }} {
131 ps := make([]{{ $.Symbol }}, len(vs))
132 for i, v := range vs {
133 ps[i] = To{{ $.Name }}(v)
134 }
135
136 return ps
137 }
138
139 // To{{ $.Name }}Map returns a map of {{ $.Symbol }} values, that are
140 // dereferenced if the passed in pointer was not nil. The {{ $.Symbol }}
141 // zero value is used if the pointer was nil.
142 func To{{ $.Name }}Map(vs map[string]*{{ $.Symbol }}) map[string]{{ $.Symbol }} {
143 ps := make(map[string]{{ $.Symbol }}, len(vs))
144 for k, v := range vs {
145 ps[k] = To{{ $.Name }}(v)
146 }
147
148 return ps
149 }
150 {{- end }}
151 `))
152
View as plain text