@@ -115,6 +115,12 @@ func (r resourceIdTemplater) methods() (*string, error) {
115
115
methods = append (methods , * functionBody )
116
116
}
117
117
118
+ functionBody , err = r .fromParseResultFunction (r .resource .Segments )
119
+ if err != nil {
120
+ return nil , fmt .Errorf ("generating the fromParseResult function: %+v" , err )
121
+ }
122
+ methods = append (methods , * functionBody )
123
+
118
124
// Validate function
119
125
methods = append (methods , r .validateFunction (nameWithoutSuffix ))
120
126
@@ -264,9 +270,36 @@ func (r resourceIdTemplater) parseFunction(nameWithoutSuffix string, caseSensiti
264
270
functionName += "Insensitively"
265
271
}
266
272
273
+ description := fmt .Sprintf ("// %[1]s parses 'input' into a %[2]s" , functionName , r .name )
274
+ if ! caseSensitive {
275
+ description = fmt .Sprintf (`
276
+ // %[1]s parses 'input' case-insensitively into a %[2]s
277
+ // note: this method should only be used for API response data and not user input` , functionName , r .name )
278
+ }
279
+
280
+ out := fmt .Sprintf (`%[4]s
281
+ func %[1]s(input string) (*%[2]s, error) {
282
+ parser := resourceids.NewParserFromResourceIdType(%[2]s{})
283
+ parsed, err := parser.Parse(input, %[3]t)
284
+ if err != nil {
285
+ return nil, fmt.Errorf("parsing %%q: %%+v", input, err)
286
+ }
287
+
288
+ id := %[2]s{}
289
+ if err := id.FromParseResult(*parsed); err != nil {
290
+ return nil, err
291
+ }
292
+
293
+ return &id, nil
294
+ }` , functionName , r .name , ! caseSensitive , description )
295
+ return & out , nil
296
+ }
297
+
298
+ func (r resourceIdTemplater ) fromParseResultFunction (segments []resourcemanager.ResourceIdSegment ) (* string , error ) {
299
+
267
300
lines := make ([]string , 0 )
268
301
varDeclaration := ""
269
- for _ , segment := range r . resource . Segments {
302
+ for _ , segment := range segments {
270
303
switch segment .Type {
271
304
case resourcemanager .ConstantSegment :
272
305
{
@@ -276,14 +309,14 @@ func (r resourceIdTemplater) parseFunction(nameWithoutSuffix string, caseSensiti
276
309
277
310
lines = append (lines , fmt .Sprintf (`
278
311
279
- if v, ok := parsed .Parsed[%[1]q]; true {
312
+ if v, ok := input .Parsed[%[1]q]; true {
280
313
if !ok {
281
- return nil, resourceids.NewSegmentNotSpecifiedError(id, %[1]q, *parsed )
314
+ return resourceids.NewSegmentNotSpecifiedError(id, %[1]q, input )
282
315
}
283
316
284
317
%[1]s, err := parse%[3]s(v)
285
318
if err != nil {
286
- return nil, fmt.Errorf("parsing %%q: %%+v", v, err)
319
+ return fmt.Errorf("parsing %%q: %%+v", v, err)
287
320
}
288
321
id.%[2]s = *%[1]s
289
322
}
@@ -294,8 +327,8 @@ func (r resourceIdTemplater) parseFunction(nameWithoutSuffix string, caseSensiti
294
327
case resourcemanager .ResourceGroupSegment , resourcemanager .ScopeSegment , resourcemanager .SubscriptionIdSegment , resourcemanager .UserSpecifiedSegment :
295
328
{
296
329
lines = append (lines , fmt .Sprintf (`
297
- if id.%[2]s, ok = parsed .Parsed[%[1]q]; !ok {
298
- return nil, resourceids.NewSegmentNotSpecifiedError(id, %[1]q, *parsed )
330
+ if id.%[2]s, ok = input .Parsed[%[1]q]; !ok {
331
+ return resourceids.NewSegmentNotSpecifiedError(id, %[1]q, input )
299
332
}
300
333
` , segment .Name , strings .Title (segment .Name )))
301
334
@@ -308,29 +341,13 @@ func (r resourceIdTemplater) parseFunction(nameWithoutSuffix string, caseSensiti
308
341
continue
309
342
}
310
343
}
344
+ out := fmt .Sprintf (`func (id *%[1]s) FromParseResult(input resourceids.ParseResult) error {
345
+ %[2]s
311
346
312
- description := fmt .Sprintf ("// %[1]s parses 'input' into a %[2]s" , functionName , r .name )
313
- if ! caseSensitive {
314
- description = fmt .Sprintf (`
315
- // %[1]s parses 'input' case-insensitively into a %[2]s
316
- // note: this method should only be used for API response data and not user input` , functionName , r .name )
317
- }
318
-
319
- out := fmt .Sprintf (`%[5]s
320
- func %[1]s(input string) (*%[2]s, error) {
321
- parser := resourceids.NewParserFromResourceIdType(%[2]s{})
322
- parsed, err := parser.Parse(input, %[3]t)
323
- if err != nil {
324
- return nil, fmt.Errorf("parsing %%q: %%+v", input, err)
325
- }
326
-
327
- %[6]s
328
- id := %[2]s{}
347
+ %[3]s
348
+ return nil
349
+ }` , r .name , varDeclaration , strings .Join (lines , "\n " ))
329
350
330
- %[4]s
331
-
332
- return &id, nil
333
- }` , functionName , r .name , ! caseSensitive , strings .Join (lines , "\n " ), description , varDeclaration )
334
351
return & out , nil
335
352
}
336
353
0 commit comments