@@ -41,7 +41,7 @@ type Bundle struct {
41
41
42
42
mu sync.RWMutex
43
43
// these properties are lazy loaded as they are requested
44
- propertiesMap map [string ]property.Property
44
+ propertiesMap map [string ][] * property.Property
45
45
bundlePackage * property.Package
46
46
semVersion * bsemver.Version
47
47
requiredPackages []PackageRequired
@@ -74,7 +74,7 @@ func (b *Bundle) loadPackage() error {
74
74
b .mu .Lock ()
75
75
defer b .mu .Unlock ()
76
76
if b .bundlePackage == nil {
77
- bundlePackage , err := loadFromProps [property.Package ](b , property .TypePackage , true )
77
+ bundlePackage , err := loadOneFromProps [property.Package ](b , property .TypePackage , true )
78
78
if err != nil {
79
79
return err
80
80
}
@@ -94,7 +94,7 @@ func (b *Bundle) loadRequiredPackages() error {
94
94
b .mu .Lock ()
95
95
defer b .mu .Unlock ()
96
96
if b .requiredPackages == nil {
97
- requiredPackages , err := loadFromProps [[]PackageRequired ](b , property .TypePackageRequired , false )
97
+ requiredPackages , err := loadOneFromProps [[]PackageRequired ](b , property .TypePackageRequired , false )
98
98
if err != nil {
99
99
return fmt .Errorf ("error determining bundle required packages for bundle %q: %s" , b .Name , err )
100
100
}
@@ -119,7 +119,7 @@ func (b *Bundle) loadMediaType() error {
119
119
b .mu .Lock ()
120
120
defer b .mu .Unlock ()
121
121
if b .mediaType == nil {
122
- mediaType , err := loadFromProps [string ](b , PropertyBundleMediaType , false )
122
+ mediaType , err := loadOneFromProps [string ](b , PropertyBundleMediaType , false )
123
123
if err != nil {
124
124
return fmt .Errorf ("error determining bundle mediatype for bundle %q: %s" , b .Name , err )
125
125
}
@@ -128,31 +128,47 @@ func (b *Bundle) loadMediaType() error {
128
128
return nil
129
129
}
130
130
131
- func (b * Bundle ) propertyByType (propType string ) * property.Property {
131
+ func (b * Bundle ) propertiesByType (propType string ) [] * property.Property {
132
132
if b .propertiesMap == nil {
133
- b .propertiesMap = make (map [string ]property.Property )
133
+ b .propertiesMap = make (map [string ][] * property.Property )
134
134
for _ , prop := range b .Properties {
135
- b .propertiesMap [prop .Type ] = prop
135
+ b .propertiesMap [prop .Type ] = append ( b . propertiesMap [ prop . Type ], & prop )
136
136
}
137
137
}
138
138
139
- prop , ok := b .propertiesMap [propType ]
140
- if ! ok {
141
- return nil
139
+ return b .propertiesMap [propType ]
140
+ }
141
+
142
+ func loadOneFromProps [T any ](bundle * Bundle , propType string , required bool ) (T , error ) {
143
+ r , err := loadFromProps [T ](bundle , propType , required )
144
+ if err != nil {
145
+ return * new (T ), err
146
+ }
147
+ if len (r ) > 1 {
148
+ return * new (T ), fmt .Errorf ("expected 1 instance of property with type %q, got %d" , propType , len (r ))
142
149
}
143
- return & prop
150
+ if ! required && len (r ) == 0 {
151
+ return * new (T ), nil
152
+ }
153
+
154
+ return r [0 ], nil
144
155
}
145
156
146
- func loadFromProps [T any ](bundle * Bundle , propType string , required bool ) (T , error ) {
147
- parsedProp := * new (T )
148
- prop := bundle .propertyByType (propType )
149
- if prop != nil {
150
- if err := json .Unmarshal (prop .Value , & parsedProp ); err != nil {
151
- return parsedProp , fmt .Errorf ("property %q with value %q could not be parsed: %s" , propType , prop .Value , err )
157
+ func loadFromProps [T any ](bundle * Bundle , propType string , required bool ) ([]T , error ) {
158
+ props := bundle .propertiesByType (propType )
159
+ if len (props ) != 0 {
160
+ result := []T {}
161
+ for i := range props {
162
+ parsedProp := * new (T )
163
+ if err := json .Unmarshal (props [i ].Value , & parsedProp ); err != nil {
164
+ return nil , fmt .Errorf ("property %q with value %q could not be parsed: %s" , propType , props [i ].Value , err )
165
+ }
166
+ result = append (result , parsedProp )
152
167
}
168
+ return result , nil
153
169
} else if required {
154
- return parsedProp , fmt .Errorf ("bundle property with type %q not found" , propType )
170
+ return nil , fmt .Errorf ("bundle property with type %q not found" , propType )
155
171
}
156
172
157
- return parsedProp , nil
173
+ return nil , nil
158
174
}
0 commit comments