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();
}