forked from marwan-at-work/protoc-gen-twirpql
/
genscalar.go
63 lines (53 loc) · 1.1 KB
/
genscalar.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
package genscalar
import (
"bytes"
"go/format"
"io"
"text/template"
)
var tmpl = template.Must(template.New("").Parse(templateText))
type data struct {
Imports []string
Types map[string]string
}
// Render renders a scalar
// implementation.
func Render(mp map[string]string, imports map[string]struct{}, out io.Writer) error {
d := &data{Types: mp}
for i := range imports {
d.Imports = append(d.Imports, i)
}
var b bytes.Buffer
err := tmpl.Execute(&b, d)
if err != nil {
return err
}
bts, err := format.Source(b.Bytes())
if err != nil {
return err
}
_, err = io.Copy(out, bytes.NewReader(bts))
return err
}
const templateText = `// Code generated by github.com/tmc/protoc-gen-gql, DO NOT EDIT.
package gengql
import (
"encoding/json"
"io"
{{ range .Imports }}
"{{ . }}"
{{ end }}
)
{{range $key, $val := .Types}}
type {{$key}} {{$val}}
func (scalar *{{$key}}) UnmarshalGQL(v interface{}) error {
str, ok := v.(string)
if !ok {
return nil
}
return json.Unmarshal([]byte(str), scalar)
}
func (scalar {{$key}}) MarshalGQL(w io.Writer) {
json.NewEncoder(w).Encode(scalar)
}
{{end}}`