AtsGoCodeGenerator.cs (393)
860WriteLine("""
886WriteLine();
940WriteLine($"{indent}{line}");
1005WriteLine("// ============================================================================");
1006WriteLine("// Enums");
1007WriteLine("// ============================================================================");
1008WriteLine();
1026WriteLine($"type {enumName} string");
1027WriteLine();
1028WriteLine("const (");
1044WriteLine($"\t{memberName} {enumName} = {GoStringLiteral(member)}");
1046WriteLine(")");
1047WriteLine();
1062WriteLine("// ============================================================================");
1063WriteLine("// DTOs");
1064WriteLine("// ============================================================================");
1065WriteLine();
1083WriteLine($"type {dtoName} struct {{");
1086WriteLine("}");
1087WriteLine();
1109WriteLine($"\t{propertyName} {propertyType} {jsonTag}");
1111WriteLine("}");
1112WriteLine();
1114WriteLine($"// ToMap converts the DTO to a map for JSON serialization.");
1115WriteLine($"func (d *{dtoName}) ToMap() map[string]any {{");
1116WriteLine("\tm := map[string]any{}");
1128WriteLine($"\tif d.{propertyName} != nil {{ m[{GoStringLiteral(JsonNamingPolicy.CamelCase.ConvertName(property.Name))}] = serializeValue(d.{propertyName}) }}");
1132WriteLine($"\tm[{GoStringLiteral(JsonNamingPolicy.CamelCase.ConvertName(property.Name))}] = serializeValue(d.{propertyName})");
1135WriteLine("\treturn m");
1136WriteLine("}");
1137WriteLine();
1152WriteLine("// ============================================================================");
1153WriteLine("// Exported Values");
1154WriteLine("// ============================================================================");
1155WriteLine();
1159WriteLine($"// {name} groups related exported values.");
1160WriteLine($"var {name} = {RenderGoExportedValueType(node, indentLevel: 0, includeDocs: true)}{RenderGoExportedValueValue(node, dtoTypesById, indentLevel: 0)}");
1161WriteLine();
1340WriteLine($"// ToMap converts the DTO to a map for JSON serialization.");
1341WriteLine($"func (d *{dtoName}) ToMap() map[string]any {{ return map[string]any{{}} }}");
1342WriteLine();
1375WriteLine("// ============================================================================");
1376WriteLine("// Marker interfaces (from interface-metadata types)");
1377WriteLine("// ============================================================================");
1378WriteLine();
1393WriteLine($"type {name} interface {{");
1394WriteLine("\thandleReference");
1395WriteLine("}");
1396WriteLine();
1413WriteLine("// ============================================================================");
1414WriteLine("// Accepting interfaces (handle types with derived types)");
1415WriteLine("// ============================================================================");
1416WriteLine("// Go has no return-type covariance, so the interface of a derived handle type does not");
1417WriteLine("// satisfy the interface of its base type. Each Any<Type> below accepts <Type> or a handle");
1418WriteLine("// of any type derived from it, and is used wherever a method, options struct, or DTO takes");
1419WriteLine("// a <Type> as input. The unexported marker methods restrict it to that family of types.");
1420WriteLine("//");
1421WriteLine("// The set of Any<Type> interfaces depends on the integrations of the AppHost this SDK is");
1422WriteLine("// generated for: an Any<Type> exists only while some handle type in the SDK derives from <Type>.");
1423WriteLine("// Adding or removing an integration can add or remove an Any<Type> and change a method parameter");
1424WriteLine("// from <Type> to Any<Type>, so code that names an Any<Type> or such a parameter's type depends");
1425WriteLine("// on the integrations the AppHost includes.");
1426WriteLine();
1431WriteLine($"// {name} accepts {interfaceName} or a handle of any type derived from it.");
1432WriteLine($"type {name} interface {{");
1433WriteLine("\thandleReference");
1443WriteLine($"\t{marker}()");
1446WriteLine("}");
1447WriteLine();
1461WriteLine("// ============================================================================");
1462WriteLine("// Handle wrappers");
1463WriteLine("// ============================================================================");
1464WriteLine();
1544WriteLine($"type {interfaceName} interface {{");
1545WriteLine("\thandleReference");
1553WriteLine($"\t{marker}()");
1567WriteLine($"\t{RenderMethodSignature(typeId, interfaceName, capability)}");
1575WriteLine($"\t{methodName}() *{wrapperType}{typeArgs}");
1586WriteLine($"\tBuild() ({appInterface}, error)");
1594WriteLine("\tGet(name string) (*InteractionInput, error)");
1596WriteLine("\tRequired(name string) (*InteractionInput, error)");
1598WriteLine("\tValue(name string) (string, error)");
1600WriteLine("\tRequiredValue(name string) (string, error)");
1608WriteLine("\tErr() error");
1610WriteLine("}");
1611WriteLine();
1622WriteLine();
1636WriteLine($"// {implName} is the unexported impl of {interfaceName}.");
1637WriteLine($"type {implName} struct {{");
1638WriteLine("\t*resourceBuilderBase");
1642WriteLine($"\t{field} *{wrapperType}{typeArgs}");
1644WriteLine("}");
1645WriteLine();
1650WriteLine($"// new{interfaceName}FromHandle wraps an existing handle as {interfaceName}.");
1651WriteLine($"func new{interfaceName}FromHandle(h *handle, c *client) {interfaceName} {{");
1652WriteLine($"\treturn &{implName}{{resourceBuilderBase: newResourceBuilderBase(h, c)}}");
1653WriteLine("}");
1654WriteLine();
1664WriteLine($"// {implName} implements the marker of each accepting interface for its own type and its base types.");
1667WriteLine($"func (*{implName}) {marker}() {{}}");
1669WriteLine();
1690WriteLine($"func (s *{implName}) Get(name string) (*InteractionInput, error) {{");
1691WriteLine("\tif err := s.Err(); err != nil { return nil, err }");
1692WriteLine("\tinputs, err := s.ToArray()");
1693WriteLine("\tif err != nil { return nil, err }");
1694WriteLine("\tfor _, input := range inputs {");
1695WriteLine("\t\tif strings.EqualFold(input.Name, name) { return input, nil }");
1696WriteLine("\t}");
1697WriteLine("\treturn nil, nil");
1698WriteLine("}");
1699WriteLine();
1702WriteLine($"func (s *{implName}) Required(name string) (*InteractionInput, error) {{");
1703WriteLine("\tinput, err := s.Get(name)");
1704WriteLine("\tif err != nil { return nil, err }");
1705WriteLine("\tif input == nil { return nil, fmt.Errorf(\"no input with name '%s' was found\", name) }");
1706WriteLine("\treturn input, nil");
1707WriteLine("}");
1708WriteLine();
1711WriteLine($"func (s *{implName}) Value(name string) (string, error) {{");
1712WriteLine("\tinput, err := s.Get(name)");
1713WriteLine("\tif err != nil { return \"\", err }");
1714WriteLine("\tif input == nil || input.Value == nil { return \"\", nil }");
1715WriteLine("\treturn *input.Value, nil");
1716WriteLine("}");
1717WriteLine();
1720WriteLine($"func (s *{implName}) RequiredValue(name string) (string, error) {{");
1721WriteLine("\tinput, err := s.Required(name)");
1722WriteLine("\tif err != nil { return \"\", err }");
1723WriteLine("\tif input.Value == nil { return \"\", nil }");
1724WriteLine("\treturn *input.Value, nil");
1725WriteLine("}");
1726WriteLine();
1932WriteLine($"func (s *{implName}) {methodName}({paramSig}){returnSig} {{");
1935WriteLine("}");
1936WriteLine();
1961WriteLine($"\tif {receiverErr} != nil {{ return s }}");
1965WriteLine($"\tif _, err := s.client.invokeCapability(ctx, {GoStringLiteral(capability.CapabilityId)}, reqArgs); err != nil {{ s.setErr(err) }}");
1966WriteLine("\treturn s");
1981WriteLine($"\tif {receiverErr} != nil {{ return nil }}");
1985WriteLine($"\tresult, err := s.client.invokeCapability(ctx, {GoStringLiteral(capability.CapabilityId)}, reqArgs)");
1986WriteLine("\tif err != nil { s.setErr(err); return nil }");
1987WriteLine($"\ttyped, ok := result.({returnGoType})");
1988WriteLine("\tif !ok {");
1989WriteLine($"\t\ts.setErr(fmt.Errorf({GoUnexpectedTypeFormat(capability.CapabilityId)}, result))");
1990WriteLine("\t\treturn nil");
1991WriteLine("\t}");
1992WriteLine("\treturn typed");
1997WriteLine($"\tif err := {receiverErr}; err != nil {{ return &{childImplName}{{resourceBuilderBase: newPropagatedErroredResourceBuilder(err, s.client)}} }}");
2005WriteLine($"\tresult, err := s.client.invokeCapability(ctx, {GoStringLiteral(capability.CapabilityId)}, reqArgs)");
2006WriteLine("\tif err != nil {");
2007WriteLine($"\t\treturn &{childImplName}{{resourceBuilderBase: newErroredResourceBuilder(err, s.client)}}");
2008WriteLine("\t}");
2009WriteLine("\thref, ok := result.(handleReference)");
2010WriteLine("\tif !ok {");
2011WriteLine($"\t\terr := fmt.Errorf({GoUnexpectedTypeFormat(capability.CapabilityId)}, result)");
2012WriteLine($"\t\treturn &{childImplName}{{resourceBuilderBase: newErroredResourceBuilder(err, s.client)}}");
2013WriteLine("\t}");
2014WriteLine($"\treturn &{childImplName}{{resourceBuilderBase: newResourceBuilderBase(href.getHandle(), s.client)}}");
2031WriteLine($"\tif err := s.Err(); err != nil {{ var zero {returnGoType}; return zero, err }}");
2035WriteLine($"\tresult, err := s.client.invokeCapability(ctx, {GoStringLiteral(capability.CapabilityId)}, reqArgs)");
2036WriteLine("\tif err != nil {");
2037WriteLine($"\t\tvar zero {returnGoType}");
2038WriteLine("\t\treturn zero, err");
2039WriteLine("\t}");
2040WriteLine($"\treturn decodeAs[{returnGoType}](result)");
2053WriteLine("\tif err := s.Err(); err != nil { return err }");
2057WriteLine($"\t_, err := s.client.invokeCapability(ctx, {GoStringLiteral(capability.CapabilityId)}, reqArgs)");
2058WriteLine("\treturn err");
2079WriteLine($"{indent}if {paramName} != nil {{ if err := {paramName}.Err(); err != nil {{ {errorAction} }} }}");
2094WriteLine($"{indent}ctx := context.Background()");
2095WriteLine($"{indent}reqArgs := map[string]any{{");
2096WriteLine($"{indent}\t{GoStringLiteral(targetParamName)}: {targetHandleVar}.ToJSON(),");
2097WriteLine($"{indent}}}");
2115WriteLine($"{indent}if {paramName} != nil {{");
2116WriteLine($"{indent}\tctx = {paramName}.Context()");
2117WriteLine($"{indent}\tif id := s.client.registerCancellation({paramName}); id != \"\" {{");
2118WriteLine($"{indent}\t\treqArgs[{GoStringLiteral(p.Name)}] = id");
2119WriteLine($"{indent}\t}}");
2120WriteLine($"{indent}}}");
2131WriteLine($"{indent}if {nilGuard} {{ reqArgs[{GoStringLiteral(p.Name)}] = serializeValue({paramName}) }}");
2135WriteLine($"{indent}reqArgs[{GoStringLiteral(p.Name)}] = serializeValue({paramName})");
2142WriteLine($"{indent}if len(options) > 0 {{");
2143WriteLine($"{indent}\tmerged := &{optionsType}{{}}");
2144WriteLine($"{indent}\tfor _, opt := range options {{");
2145WriteLine($"{indent}\t\tif opt != nil {{ opt.apply(merged) }}");
2146WriteLine($"{indent}\t}}");
2147WriteLine($"{indent}\tfor k, v := range merged.ToMap() {{ reqArgs[k] = v }}");
2160WriteLine($"{indent}\tif merged.{fieldName} != nil {{");
2161WriteLine($"{indent}\t\tctx = merged.{fieldName}.Context()");
2162WriteLine($"{indent}\t\tif id := s.client.registerCancellation(merged.{fieldName}); id != \"\" {{");
2163WriteLine($"{indent}\t\t\treqArgs[{GoStringLiteral(p.Name)}] = id");
2164WriteLine($"{indent}\t\t}}");
2165WriteLine($"{indent}\t}}");
2167WriteLine($"{indent}}}");
2178WriteLine($"{indent}if {callbackExpr} != nil {{");
2179WriteLine($"{indent}\tcb := {callbackExpr}");
2180WriteLine($"{indent}\tshim := func(args ...any) any {{");
2182WriteLine($"{indent}\t}}");
2183WriteLine($"{indent}\treqArgs[{GoStringLiteral(p.Name)}] = s.client.registerCallback(shim)");
2184WriteLine($"{indent}}}");
2196WriteLine($"\tif d.{propertyName} != nil {{");
2197WriteLine($"\t\tcb := d.{propertyName}");
2198WriteLine($"\t\tm[{GoStringLiteral(JsonNamingPolicy.CamelCase.ConvertName(property.Name))}] = func(args ...any) any {{");
2200WriteLine($"\t\t}}");
2201WriteLine($"\t}}");
2241WriteLine($"{indent}return {callExpr}");
2246WriteLine($"{indent}return {callExpr}");
2255WriteLine($"{indent}{argName} := {GetCallbackArgExpression(callbackParameters[i].Type, i, clientExpression)}");
2258WriteLine($"{indent}cb({string.Join(", ", argNames)})");
2259WriteLine($"{indent}return map[string]any{{");
2264WriteLine($"{indent}\t\"p{i}\": serializeValue({argNames[i]}),");
2267WriteLine($"{indent}}}");
2271WriteLine($"{indent}{callExpr}");
2272WriteLine($"{indent}return nil");
2311WriteLine($"func (s *{implName}) {g.MethodName}() *{wrapperType}{typeArgs} {{");
2312WriteLine("\ts.collectionMu.Lock()");
2313WriteLine("\tdefer s.collectionMu.Unlock()");
2314WriteLine($"\tif s.{g.Field} == nil {{");
2315WriteLine($"\t\ts.{g.Field} = {factory}{typeArgs}(s.handleWrapperBase, {GoStringLiteral(g.CapabilityId)})");
2316WriteLine("\t}");
2317WriteLine($"\treturn s.{g.Field}");
2318WriteLine("}");
2319WriteLine();
2363WriteLine("// ============================================================================");
2364WriteLine("// Options structs");
2365WriteLine("// ============================================================================");
2366WriteLine();
2370WriteLine($"// {name} carries optional parameters for {ToPascalCase(capability.MethodName)}.");
2371WriteLine($"type {name} struct {{");
2389WriteLine($"\t{fieldName} {fieldType} {jsonTag}");
2391WriteLine("}");
2392WriteLine();
2395WriteLine($"// {optionInterfaceName} configures {ToPascalCase(capability.MethodName)}.");
2396WriteLine($"type {optionInterfaceName} interface {{");
2397WriteLine($"\tapply(*{name})");
2398WriteLine("}");
2399WriteLine();
2400WriteLine($"func (option *{name}) apply(options *{name}) {{");
2401WriteLine("\tif option != nil { *options = *deepUpdate(options, option) }");
2402WriteLine("}");
2403WriteLine();
2410WriteLine($"// {optionName} sets {fieldName} for {ToPascalCase(capability.MethodName)}.");
2413WriteLine($"type {optionName} {parameterType}");
2414WriteLine();
2415WriteLine($"func (value {optionName}) apply(options *{name}) {{");
2416WriteLine($"\toptions.{fieldName} = {RenderDirectOptionAssignment(p)}");
2417WriteLine("}");
2422WriteLine($"type {implementationName} struct {{ value {parameterType} }}");
2423WriteLine();
2424WriteLine($"func (option {implementationName}) apply(options *{name}) {{");
2425WriteLine($"\toptions.{fieldName} = {RenderWrappedOptionAssignment(p)}");
2426WriteLine("}");
2427WriteLine();
2428WriteLine($"func {optionName}(value {parameterType}) {optionInterfaceName} {{");
2429WriteLine($"\treturn {implementationName}{{value: value}}");
2430WriteLine("}");
2432WriteLine();
2435WriteLine($"func (o *{name}) ToMap() map[string]any {{");
2436WriteLine("\tm := map[string]any{}");
2437WriteLine("\tif o == nil { return m }");
2454WriteLine($"\tif o.{fieldName} != nil {{ m[{GoStringLiteral(p.Name)}] = serializeValue({value}) }}");
2458WriteLine($"\tm[{GoStringLiteral(p.Name)}] = serializeValue(o.{fieldName})");
2461WriteLine("\treturn m");
2462WriteLine("}");
2463WriteLine();
2476WriteLine($"// {_createBuilderOptionInterfaceName} configures CreateBuilder.");
2477WriteLine($"type {_createBuilderOptionInterfaceName} interface {{");
2478WriteLine($"\tapply(*{optionsType})");
2479WriteLine("}");
2480WriteLine();
2481WriteLine($"func (option *{optionsType}) apply(options *{optionsType}) {{");
2482WriteLine("\tif option != nil { *options = *deepUpdate(options, option) }");
2483WriteLine("}");
2484WriteLine();
2493WriteLine($"// {optionName} sets {fieldName} for CreateBuilder.");
2496WriteLine($"type {optionName} {valueType}");
2497WriteLine();
2498WriteLine($"func (value {optionName}) apply(options *{optionsType}) {{");
2502WriteLine($"\toptions.{fieldName} = {assignment}");
2503WriteLine("}");
2508WriteLine($"type {implementationName} struct {{ value {valueType} }}");
2509WriteLine();
2510WriteLine($"func (option {implementationName}) apply(options *{optionsType}) {{");
2511WriteLine($"\toptions.{fieldName} = option.value");
2512WriteLine("}");
2513WriteLine();
2514WriteLine($"func {optionName}(value {valueType}) {_createBuilderOptionInterfaceName} {{");
2515WriteLine($"\treturn {implementationName}{{value: value}}");
2516WriteLine("}");
2518WriteLine();
2747WriteLine(acceptsNumbers
2752WriteLine($"{indent}case json.Number:");
2753WriteLine($"{indent}\tif !isValidJSONNumber(value) {{");
2754WriteLine($"{indent}\t\terr := fmt.Errorf(\"aspire: {methodName}: parameter %q must be one of [{allowed}], got invalid json.Number %q\", {GoStringLiteral(p.Name)}, value)");
2757WriteLine($"{indent}\t\t{line}");
2759WriteLine($"{indent}\t}}");
2761WriteLine($"{indent}case {GetUnionTypeSwitchCases(p.Type!)}:");
2762WriteLine($"{indent}default:");
2763WriteLine($"{indent}\terr := fmt.Errorf(\"aspire: {methodName}: parameter %q must be one of [{allowed}], got %T\", {GoStringLiteral(p.Name)}, {paramName})");
2766WriteLine($"{indent}\t{line}");
2768WriteLine($"{indent}}}");
2776WriteLine($"// {note}");
2859WriteLine("// ============================================================================");
2860WriteLine("// Per-client handle wrapper registration");
2861WriteLine("// ============================================================================");
2862WriteLine();
2863WriteLine("func registerWrappers(c *client) {");
2864WriteLine("\tc.registerHandleWrapper(\"" + AtsConstants.ReferenceExpressionTypeId + "\", func(h *handle, c *client) any {");
2865WriteLine("\t\treturn newHandleBackedReferenceExpression(h, c)");
2866WriteLine("\t})");
2870WriteLine($"\tc.registerHandleWrapper({GoStringLiteral(typeId)}, func(h *handle, c *client) any {{");
2871WriteLine($"\t\treturn new{interfaceName}FromHandle(h, c)");
2872WriteLine("\t})");
2882WriteLine($"\tc.registerHandleWrapper(\"{typeId}\", func(h *handle, c *client) any {{");
2883WriteLine("\t\treturn newHandleWrapperBase(h, c)");
2884WriteLine("\t})");
2886WriteLine("}");
2887WriteLine();
2906WriteLine("// ============================================================================");
2907WriteLine("// Builder construction & Build()");
2908WriteLine("// ============================================================================");
2909WriteLine();
2919WriteLine($"// {builderInterface} is the entry point to the Aspire SDK.");
2920WriteLine($"type {builderInterface} interface {{");
2921WriteLine("\thandleReference");
2922WriteLine($"\tBuild() ({appInterface}, error)");
2923WriteLine("}");
2924WriteLine();
2926WriteLine($"type {builderImpl} struct {{ *resourceBuilderBase }}");
2927WriteLine();
2932WriteLine($"// {appInterface} is returned by Build(); it represents the running application.");
2933WriteLine($"type {appInterface} interface {{ handleReference }}");
2934WriteLine();
2941WriteLine($"type {ToCamelCase(appInterface)} struct {{ *resourceBuilderBase }}");
2942WriteLine();
2949WriteLine($"func (b *{builderImpl}) Err() error {{");
2950WriteLine("\tif err := b.client.combinedError(); err != nil { return err }");
2951WriteLine("\treturn b.resourceBuilderBase.Err()");
2952WriteLine("}");
2953WriteLine();
2960WriteLine($"func (b *{builderImpl}) Build() ({appInterface}, error) {{");
2961WriteLine("\tif err := b.Err(); err != nil { return nil, err }");
2962WriteLine($"\tresult, err := b.client.invokeCapability(context.Background(), \"{AtsConstants.BuildCapability}\", map[string]any{{");
2963WriteLine("\t\t\"context\": b.handle.ToJSON(),");
2964WriteLine("\t})");
2965WriteLine("\tif err != nil { return nil, err }");
2966WriteLine($"\tapp, ok := result.({appInterface})");
2967WriteLine($"\tif !ok {{ return nil, fmt.Errorf(\"aspire: build returned unexpected type %T\", result) }}");
2968WriteLine("\treturn app, nil");
2969WriteLine("}");
2970WriteLine();
2974WriteLine($"// CreateBuilder establishes a connection to the AppHost and returns a new builder.");
2977WriteLine($"func CreateBuilder(options ...{_createBuilderOptionInterfaceName}) ({builderInterface}, error) {{");
2981WriteLine($"func CreateBuilder() ({builderInterface}, error) {{");
2983WriteLine("\tsocketPath := os.Getenv(\"REMOTE_APP_HOST_SOCKET_PATH\")");
2984WriteLine("\tif socketPath == \"\" {");
2985WriteLine("\t\treturn nil, fmt.Errorf(\"REMOTE_APP_HOST_SOCKET_PATH environment variable not set. Run this application using `aspire run`\")");
2986WriteLine("\t}");
2987WriteLine("\tc := newClient(socketPath)");
2988WriteLine("\tif err := c.connect(context.Background(), 5*time.Second); err != nil { return nil, err }");
2989WriteLine("\tc.onDisconnect(func() { os.Exit(1) })");
2990WriteLine("\tregisterWrappers(c)");
2991WriteLine();
2992WriteLine("\tresolved := map[string]any{}");
2995WriteLine("\tif len(options) > 0 {");
2996WriteLine($"\t\tmerged := &{createOptionsType}{{}}");
2997WriteLine("\t\tfor _, opt := range options {");
2998WriteLine("\t\t\tif opt != nil { opt.apply(merged) }");
2999WriteLine("\t\t}");
3000WriteLine("\t\tfor k, v := range merged.ToMap() { resolved[k] = v }");
3001WriteLine("\t}");
3003WriteLine("\tif _, ok := resolved[\"args\"]; !ok { resolved[\"args\"] = os.Args[1:] }");
3006WriteLine("\tif projectDirectory, ok := resolved[\"projectDirectory\"].(string); !ok || projectDirectory == \"\" {");
3007WriteLine("\t\tif projectDirectory := os.Getenv(\"ASPIRE_PROJECT_DIRECTORY\"); projectDirectory != \"\" {");
3008WriteLine("\t\t\tresolved[\"projectDirectory\"] = projectDirectory");
3009WriteLine("\t\t} else if pwd, err := os.Getwd(); err == nil {");
3010WriteLine("\t\t\tresolved[\"projectDirectory\"] = pwd");
3011WriteLine("\t\t}");
3012WriteLine("\t}");
3013WriteLine("\tif appHostFilePath, ok := resolved[\"appHostFilePath\"].(string); !ok || appHostFilePath == \"\" {");
3014WriteLine("\t\tif appHostFilePath := os.Getenv(\"ASPIRE_APPHOST_FILEPATH\"); appHostFilePath != \"\" { resolved[\"appHostFilePath\"] = appHostFilePath }");
3015WriteLine("\t}");
3016WriteLine("\tif dashboardApplicationName, ok := resolved[\"dashboardApplicationName\"].(string); ok && dashboardApplicationName == \"\" {");
3017WriteLine("\t\tdelete(resolved, \"dashboardApplicationName\")");
3018WriteLine("\t}");
3019WriteLine();
3020WriteLine($"\tresult, err := c.invokeCapability(context.Background(), \"{AtsConstants.CreateBuilderCapability}\", map[string]any{{\"argsOrOptions\": resolved}})");
3021WriteLine("\tif err != nil { return nil, err }");
3022WriteLine("\thref, ok := result.(handleReference)");
3023WriteLine("\tif !ok { return nil, fmt.Errorf(\"aspire: createBuilder returned unexpected type %T\", result) }");
3024WriteLine($"\treturn &{builderImpl}{{resourceBuilderBase: newResourceBuilderBase(href.getHandle(), c)}}, nil");
3025WriteLine("}");
3026WriteLine();