-
-
Notifications
You must be signed in to change notification settings - Fork 554
/
extensions.go
57 lines (53 loc) Β· 1.23 KB
/
extensions.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
package openapi
import (
"encoding/json"
"strings"
"goa.design/goa/v3/expr"
)
// ExtensionsFromExpr generates openapi extensions from the given meta
// expression.
func ExtensionsFromExpr(mdata expr.MetaExpr) map[string]any {
swag := extensionsFromExprWithPrefix(mdata, "swagger:extension:")
open := extensionsFromExprWithPrefix(mdata, "openapi:extension:")
if swag == nil {
return open
}
if open == nil {
return swag
}
for k, v := range open {
swag[k] = v
}
return swag
}
// extensionsFromExprWithPrefix generates openapi extensions from
// the given meta expression with keys starting the given prefix.
func extensionsFromExprWithPrefix(mdata expr.MetaExpr, prefix string) map[string]any {
if !strings.HasSuffix(prefix, ":") {
prefix += ":"
}
extensions := make(map[string]any)
for key, value := range mdata {
if !strings.HasPrefix(key, prefix) {
continue
}
name := key[len(prefix):]
if strings.Contains(name, ":") {
continue
}
if !strings.HasPrefix(name, "x-") {
continue
}
val := value[0]
ival := any(val)
if err := json.Unmarshal([]byte(val), &ival); err != nil {
extensions[name] = val
continue
}
extensions[name] = ival
}
if len(extensions) == 0 {
return nil
}
return extensions
}