public string GenerateResourceDefinition()

in src/JetBrains.Space.Generator/CodeGeneration/CSharp/Generators/CSharpApiModelResourceGenerator.cs [18:108]


    public string GenerateResourceDefinition(ApiResource apiResource) =>
        GenerateResourceDefinition(
            apiResource,
            apiResource.ToCSharpIdentifierSingular() + "Client",
            apiResource.Path.Segments.ToPath(),
            apiResource.ToCSharpIdentifierSingular(),
            new HashSet<string>(),
            true);

    private string GenerateResourceDefinition(
        ApiResource apiResource,
        string typeNameForClient,
        string baseEndpointPath,
        string resourceBreadcrumbPath,
        HashSet<string> resourceBreadcrumbPaths,
        bool withConstructor)
    {
        var indent = new Indent();
        var builder = new CSharpBuilder();
            
        // Client class
        builder.AppendLine($"{indent}public partial class {typeNameForClient} : ISpaceClient");
        builder.AppendLine($"{indent}{{");
        indent.Increment();
        
        // Constructor needed?
        if (withConstructor)
        {
            builder.AppendLine($"{indent}private readonly Connection _connection;");
            builder.AppendLine($"{indent}");
            builder.AppendLine($"{indent}public {typeNameForClient}(Connection connection)");
            builder.AppendLine($"{indent}{{");
            indent.Increment();
        
            builder.AppendLine($"{indent}_connection = connection;");
            
            indent.Decrement();
            builder.AppendLine($"{indent}}}");
            builder.AppendLine($"{indent}");
        }
        
        // Endpoint methods
        foreach (var apiEndpoint in apiResource.Endpoints)
        {
            builder.AppendLine(
                indent.Wrap(
                    GenerateMethodsForApiEndpoint(apiEndpoint, baseEndpointPath)));
        }
        
        // Group nested resources by path
        var mapOfPathToResources = PathToResourceMapper.CreateMapOfPathToResources(apiResource);
        foreach (var (_, apiNestedResources) in mapOfPathToResources)
        {
            var isFirstResource = true;
            foreach (var apiNestedResource in apiNestedResources)
            {
                var nestedResourceBreadcrumbPath = (resourceBreadcrumbPath.Length > 0 ? resourceBreadcrumbPath + "." : resourceBreadcrumbPath) + apiNestedResource.ToCSharpIdentifierSingular();

                var typeNameForNestedClient = apiNestedResource.ToCSharpIdentifierSingular() + "Client";
                if (typeNameForNestedClient == typeNameForClient)
                {
                    // Example: Team Directory > Profiles > Profiles > Deactivate -> ProfileProfileClient
                    typeNameForNestedClient = apiNestedResource.ToCSharpIdentifierSingular() + apiNestedResource.ToCSharpIdentifierSingular() + "Client";
                }
                    
                var isFirstWrite = resourceBreadcrumbPaths.Add(nestedResourceBreadcrumbPath);
                if (isFirstResource && isFirstWrite)
                {
                    var propertyNameForNestedClient = apiNestedResource.ToCSharpIdentifierPlural();
                    builder.AppendLine($"{indent}public {typeNameForNestedClient} {propertyNameForNestedClient} => new {typeNameForNestedClient}(_connection);");
                    builder.AppendLine($"{indent}");
                }

                builder.AppendLine(
                    indent.Wrap(
                        GenerateResourceDefinition(
                            apiNestedResource,
                            typeNameForNestedClient,
                            (baseEndpointPath.Length > 0 ? baseEndpointPath + "/" : baseEndpointPath) + apiNestedResource.Path.Segments.ToPath(),
                            nestedResourceBreadcrumbPath,
                            resourceBreadcrumbPaths,
                            isFirstResource && isFirstWrite)));
        
                isFirstResource = false;
            }
        }
        
        indent.Decrement();
        builder.AppendLine($"{indent}}}");
        return builder.ToString();
    }