393 references to WriteLine
Aspire.Hosting.CodeGeneration.Go (393)
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();