@@ -10,13 +10,8 @@ import (
10
10
"gopkg.in/yaml.v3"
11
11
12
12
"github.com/hashicorp/go-multierror"
13
-
14
- "github.com/coder/coder/codersdk"
15
13
)
16
14
17
- // func goNameToYAML(name string) string {
18
- // }
19
-
20
15
func scalarNode (v any ) (* yaml.Node , error ) {
21
16
var valueStr string
22
17
switch v := v .(type ) {
@@ -67,15 +62,21 @@ func yamlDeploymentField(field reflect.Value) (*yaml.Node, error) {
67
62
}
68
63
}
69
64
70
- // MarshalYAML converts the deployment config to its MarshalYAML representation.
71
- func MarshalYAML (config * codersdk.DeploymentConfig ) ([]byte , error ) {
65
+ // MarshalYAML converts the deployment config to it's yaml representation.
66
+ // It accepts `any` because it calls itself recursively on its values.
67
+ func MarshalYAML (config any ) (* yaml.Node , error ) {
72
68
var (
73
- document = yaml.Node {
69
+ document = & yaml.Node {
74
70
Kind : yaml .MappingNode ,
75
71
}
76
- configValue = reflect .ValueOf (config ). Elem ()
72
+ configValue = reflect .ValueOf (config )
77
73
merr * multierror.Error
78
74
)
75
+
76
+ if configValue .Kind () == reflect .Ptr {
77
+ configValue = configValue .Elem ()
78
+ }
79
+
79
80
for i := 0 ; i < configValue .NumField (); i ++ {
80
81
var (
81
82
configField = configValue .Field (i ).Elem ()
@@ -85,28 +86,38 @@ func MarshalYAML(config *codersdk.DeploymentConfig) ([]byte, error) {
85
86
86
87
switch {
87
88
case strings .HasPrefix (typeName , "codersdk.DeploymentConfigField[" ):
89
+ node , err := yamlDeploymentField (configField )
90
+ if err != nil {
91
+ merr = multierror .Append (merr , err )
92
+ continue
93
+ }
88
94
// Write field name.
89
95
document .Content = append (document .Content , & yaml.Node {
90
96
Kind : yaml .ScalarNode ,
91
97
Value : fieldName ,
92
98
HeadComment : configField .FieldByName ("Usage" ).String (),
93
99
})
94
- node , err := yamlDeploymentField (configField )
100
+
101
+ // Write node contents.
102
+ document .Content = append (document .Content , node )
103
+ case configField .Kind () == reflect .Struct :
104
+ // Recursively resolve configuration group values.
105
+ node , err := MarshalYAML (configField .Interface ())
95
106
if err != nil {
96
- merr = multierror .Append (merr , err )
107
+ merr = multierror .Append (
108
+ merr ,
109
+ xerrors .Errorf ("marshal group %s: %w" , fieldName , err ),
110
+ )
97
111
continue
98
112
}
99
- // Write node contents.
113
+ document .Content = append (document .Content , & yaml.Node {
114
+ Kind : yaml .ScalarNode ,
115
+ Value : fieldName ,
116
+ })
100
117
document .Content = append (document .Content , node )
101
118
default :
102
119
merr = multierror .Append (merr , xerrors .Errorf ("unsupported type: %s" , typeName ))
103
120
}
104
121
}
105
- byt , err := yaml .Marshal (document )
106
- if err != nil {
107
- merr = multierror .Append (
108
- merr , xerrors .Errorf ("marshal failed: %w\n %+v" , err , document ),
109
- )
110
- }
111
- return byt , merr .ErrorOrNil ()
122
+ return document , merr .ErrorOrNil ()
112
123
}
0 commit comments