/
proxy.go
106 lines (91 loc) · 1.92 KB
/
proxy.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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
package astutils
import "html/template"
type ProxyData struct {
Package string
Imports []*ProxyImport
ProxyStructName string
Option string
Methods []*ProxyMethod
AbstractName string
ParentName string
InjectFields []*ProxyInjectField
Singleton bool
}
type ProxyMethod struct {
Name string
Params string
ParamNames string
Results string
ResultNames string
Before []any
After []any
}
type ProxyImport struct {
Alias template.HTML
Path template.HTML
}
type ProxyInjectField struct {
Var template.HTML
Val template.HTML
}
const proxyTpl = `
// Code generated by sandwich. DO NOT EDIT.
package {{.Package}}
import (
{{- range $i, $s := .Imports }}
{{ $s.Alias}} {{ $s.Path}}
{{- end}}
)
type {{ .ProxyStructName }} struct {
parent {{ .ParentName }}
}
{{ if ne $.Singleton true}}
//@Component
func New{{ .ProxyStructName }}({{ $optLen := len .Option }} {{ if ne $optLen 0 }} opts ...{{ .Option }} {{ end }}) {{ .AbstractName }} {
pa := &{{ .ParentName }}{
{{- range $i, $a := .InjectFields }}
{{ $a.Var }}: {{ $a.Val }},
{{- end }}
}
{{ if ne $optLen 0 }}
for _, fn := range opts {
fn(pa)
}
{{ end }}
return pa
}
{{ else }}
var (
_{{ .AbstractName }}Inst {{ .AbstractName }}
_{{ .AbstractName }}Once sync.Once
)
//@Component
func New{{ .ProxyStructName }}() {{ .AbstractName }} {
_{{ .AbstractName }}Once.Do(func(){
_{{ .AbstractName }}Inst = &{{ .ParentName }}{
{{- range $i, $a := .InjectFields }}
{{ $a.Var }}: {{ $a.Val }},
{{- end }}
}
})
return _{{ .AbstractName }}Inst
}
{{ end }}
{{ range .Methods }}
func (p *{{$.ProxyStructName}}) {{ .Name }} ({{ .Params }}) ({{ .Results }}) {
{{- range $i, $s := .Before }}
{{ $s }}
{{- end }}
{{- range $i, $s := .After }}
{{ $s }}
{{- end }}
return {{ .ResultNames }}
}
{{ end }}
`
func GetProxyTpl() string {
return proxyTpl
}
const (
DefaultProxySuffix = "Proxy"
)