Skip to content

Commit 32b4462

Browse files
Merge pull request #647 from Suven-p/feat-8-add-go-templates
Update go client
2 parents 85f73a3 + 1a5030b commit 32b4462

File tree

17 files changed

+757
-166
lines changed

17 files changed

+757
-166
lines changed

src/SDK/Language/Go.php

Lines changed: 89 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -85,19 +85,49 @@ public function getFiles(): array
8585
],
8686
[
8787
'scope' => 'default',
88-
'destination' => '{{ spec.title | caseLower}}/client.go',
88+
'destination' => 'client/client.go',
8989
'template' => 'go/client.go.twig',
9090
],
91+
[
92+
'scope' => 'default',
93+
'destination' => 'file/inputFile.go',
94+
'template' => 'go/inputFile.go.twig',
95+
],
96+
[
97+
'scope' => 'default',
98+
'destination' => 'query/query.go',
99+
'template' => 'go/query.go.twig',
100+
],
101+
[
102+
'scope' => 'default',
103+
'destination' => 'permission/permission.go',
104+
'template' => 'go/permission.go.twig',
105+
],
106+
[
107+
'scope' => 'default',
108+
'destination' => 'role/role.go',
109+
'template' => 'go/role.go.twig',
110+
],
111+
[
112+
'scope' => 'default',
113+
'destination' => 'id/id.go',
114+
'template' => 'go/id.go.twig',
115+
],
91116
[
92117
'scope' => 'service',
93-
'destination' => '{{ spec.title | caseLower}}/{{service.name | caseDash}}.go',
118+
'destination' => '{{ service.name | caseLower}}/{{service.name | caseDash}}.go',
94119
'template' => 'go/services/service.go.twig',
95120
],
96121
[
97122
'scope' => 'method',
98123
'destination' => 'docs/examples/{{service.name | caseLower}}/{{method.name | caseDash}}.md',
99124
'template' => 'go/docs/example.md.twig',
100125
],
126+
[
127+
'scope' => 'definition',
128+
'destination' => 'models/{{ definition.name | caseLower }}.go',
129+
'template' => 'go/models/model.go.twig',
130+
],
101131
];
102132
}
103133

@@ -111,7 +141,8 @@ public function getTypeName(array $parameter, array $spec = []): string
111141
return match ($parameter['type']) {
112142
self::TYPE_INTEGER => 'int',
113143
self::TYPE_NUMBER => 'float64',
114-
self::TYPE_FILE, self::TYPE_STRING => 'string',
144+
self::TYPE_FILE => 'file.InputFile',
145+
self::TYPE_STRING => 'string',
115146
self::TYPE_BOOLEAN => 'bool',
116147
self::TYPE_OBJECT => 'interface{}',
117148
self::TYPE_ARRAY => '[]interface{}',
@@ -189,31 +220,41 @@ public function getParamExample(array $param): string
189220
switch ($type) {
190221
case self::TYPE_NUMBER:
191222
case self::TYPE_INTEGER:
223+
$output .= '0';
224+
break;
192225
case self::TYPE_BOOLEAN:
193-
$output .= 'null';
226+
$output .= 'false';
194227
break;
195228
case self::TYPE_STRING:
196229
$output .= '""';
197230
break;
198231
case self::TYPE_OBJECT:
199-
$output .= 'nil';
232+
$output .= 'map[string]interface{}{}';
200233
break;
201234
case self::TYPE_ARRAY:
202-
$output .= '[]';
235+
$output .= '[]interface{}{}';
203236
break;
204237
case self::TYPE_FILE:
205-
$output .= "file";
238+
$output .= 'file.NewInputFile("/path/to/file.png", "file.png")';
206239
break;
207240
}
208241
} else {
209242
switch ($type) {
210243
case self::TYPE_NUMBER:
211244
case self::TYPE_INTEGER:
212-
case self::TYPE_ARRAY:
213245
$output .= $example;
214246
break;
247+
case self::TYPE_ARRAY:
248+
if (\str_starts_with($example, '[')) {
249+
$example = \substr($example, 1);
250+
}
251+
if (\str_ends_with($example, ']')) {
252+
$example = \substr($example, 0, -1);
253+
}
254+
$output .= 'interface{}{' . $example . '}';
255+
break;
215256
case self::TYPE_OBJECT:
216-
$output .= 'nil';
257+
$output .= 'map[string]interface{}{}';
217258
break;
218259
case self::TYPE_BOOLEAN:
219260
$output .= ($example) ? 'true' : 'false';
@@ -222,7 +263,7 @@ public function getParamExample(array $param): string
222263
$output .= "\"{$example}\"";
223264
break;
224265
case self::TYPE_FILE:
225-
$output .= "file";
266+
$output .= 'file.NewInputFile("/path/to/file.png", "file.png")';
226267
break;
227268
}
228269
}
@@ -233,16 +274,51 @@ public function getParamExample(array $param): string
233274
public function getFilters(): array
234275
{
235276
return [
236-
new TwigFilter('godocComment', function ($value) {
277+
new TwigFilter('godocComment', function ($value, $indent = 0) {
278+
$value = trim($value);
237279
$value = explode("\n", $value);
280+
$indent = \str_repeat(' ', $indent);
238281
foreach ($value as $key => $line) {
239-
$value[$key] = "// " . wordwrap($line, 75, "\n// ");
282+
$value[$key] = "// " . wordwrap(trim($line), 75, "\n" . $indent . "// ");
240283
}
241-
return implode("\n", $value);
284+
return implode("\n" . $indent, $value);
242285
}, ['is_safe' => ['html']]),
286+
new TwigFilter('propertyType', function (array $property, array $spec, string $generic = 'interface{}') {
287+
return $this->getPropertyType($property, $spec, $generic);
288+
}),
289+
new TwigFilter('returnType', function (array $method, array $spec, string $namespace, string $generic = 'T') {
290+
return $this->getReturnType($method, $spec, $namespace, $generic);
243291
new TwigFilter('caseEnumKey', function (string $value) {
244292
return $this->toUpperSnakeCase($value);
245293
}),
246294
];
247295
}
296+
297+
protected function getPropertyType(array $property, array $spec, string $generic = 'interface{}'): string
298+
{
299+
$type = $this->getTypeName($property);
300+
return $type;
301+
}
302+
303+
protected function getReturnType(array $method, array $spec, string $namespace, string $generic = 'T'): string
304+
{
305+
if ($method['type'] === 'webAuth') {
306+
return 'bool';
307+
}
308+
if ($method['type'] === 'location') {
309+
return '[]byte';
310+
}
311+
312+
if (
313+
!\array_key_exists('responseModel', $method)
314+
|| empty($method['responseModel'])
315+
|| $method['responseModel'] === 'any'
316+
) {
317+
return 'interface{}';
318+
}
319+
320+
$ret = ucfirst($method['responseModel']);
321+
322+
return 'models.' . $ret;
323+
}
248324
}

templates/go/base/params.twig

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,21 @@
1-
apiParams := map[string]interface{}{
2-
{% for parameter in method.parameters.query %}
3-
"{{ parameter.name }}": {{ parameter.name | caseUcfirst }},
4-
{% endfor %}
5-
{% for parameter in method.parameters.body %}
6-
"{{ parameter.name }}": {{ parameter.name | caseUcfirst }},
7-
{% endfor %}
1+
{% if method.parameters.all|filter(v => not v.required)|length > 0 %}
2+
options := {{(method.name ~ "Options") | caseUcfirst}}{}.New()
3+
for _, opt := range optionalSetters {
4+
opt(options)
5+
}
6+
{% endif %}
7+
params := map[string]interface{}{}
8+
{% for parameter in method.parameters.all %}
9+
{% if parameter.required %}
10+
params["{{ parameter.name }}"] = {{ parameter.name | caseUcfirst }}
11+
{% else %}
12+
if options.enabledSetters["{{ parameter.name | caseUcfirst}}"] {
13+
params["{{ parameter.name }}"] = options.{{ parameter.name | caseUcfirst }}
814
}
9-
10-
apiHeaders := map[string]interface{}{
15+
{% endif %}
16+
{% endfor %}
17+
headers := map[string]interface{}{
1118
{% for key, header in method.headers %}
1219
"{{ key }}": "{{ header }}",
1320
{% endfor %}
14-
}
21+
}

templates/go/base/requests/api.twig

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,17 @@
1-
return srv.client.Call("{{ method.method | caseUpper }}", apiPath, apiHeaders, apiParams)
1+
resp, err := srv.client.Call("{{ method.method | caseUpper }}", path, headers, params)
2+
if err != nil {
3+
return nil, err
4+
}
5+
var parsed {{ method | returnType(spec, spec.title | caseLower) }}
6+
if strings.HasPrefix(resp.Type, "application/json") {
7+
err = json.Unmarshal([]byte(resp.Result.(string)), &parsed)
8+
if err != nil {
9+
return nil, err
10+
}
11+
return &parsed, nil
12+
}
13+
parsed, ok := resp.Result.({{ method | returnType(spec, spec.title | caseLower) }})
14+
if !ok {
15+
return nil, errors.New("unexpected response type")
16+
}
17+
return &parsed, nil

templates/go/base/requests/file.twig

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
{% for parameter in method.parameters.all %}
2+
{% if parameter.type == 'file' %}
3+
paramName := "{{ parameter.name }}"
4+
5+
{% endif %}
6+
{% endfor %}
7+
8+
uploadId := ""
9+
{% for parameter in method.parameters.all %}
10+
{% if parameter.isUploadID %}
11+
uploadId = {{ parameter.name | escapeKeyword | caseUcfirst }}
12+
{% endif %}
13+
{% endfor %}
14+
15+
resp, err := srv.client.FileUpload(path, headers, params, paramName, uploadId)
16+
if err != nil {
17+
return nil, err
18+
}
19+
var parsed {{ method | returnType(spec, spec.title | caseLower) }}
20+
if strings.HasPrefix(resp.Type, "application/json") {
21+
err = json.Unmarshal([]byte(resp.Result.(string)), &parsed)
22+
if err != nil {
23+
return nil, err
24+
}
25+
return &parsed, nil
26+
}
27+
parsed, ok := resp.Result.({{ method | returnType(spec, spec.title | caseLower) }})
28+
if !ok {
29+
return nil, errors.New("unexpected response type")
30+
}
31+
return &parsed, nil

0 commit comments

Comments
 (0)