Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using NUnit.Framework;
using TerraformPluginDotNet.ResourceProvider;
using TerraformPluginDotNet.Schemas;
using TerraformPluginDotNet.Schemas.Attributes;
using TerraformPluginDotNet.Schemas.Types;
using Tfplugin5;

Expand Down Expand Up @@ -38,7 +39,7 @@ private static ResourceRegistry BuildRegistry()
{
var registration = new ResourceRegistryRegistration("test_resource", typeof(TestResource));
var dataSourceRegistration = new DataSourceRegistryRegistration("test_data_source", typeof(TestResource));
var registry = new ResourceRegistry(new SchemaBuilder(NullLogger<SchemaBuilder>.Instance, new TerraformTypeBuilder()), new[] { registration }, new[] { dataSourceRegistration });
var registry = new ResourceRegistry(new SchemaBuilder(NullLogger<SchemaBuilder>.Instance, new TerraformTypeBuilder(), new TerraformAttributeResolver()), new[] { registration }, new[] { dataSourceRegistration });
return registry;
}
}
4 changes: 3 additions & 1 deletion TerraformPluginDotNet.Test/Schemas/SchemaBuilderTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using Microsoft.Extensions.Logging.Abstractions;
using NUnit.Framework;
using TerraformPluginDotNet.Schemas;
using TerraformPluginDotNet.Schemas.Attributes;
using TerraformPluginDotNet.Schemas.Types;

namespace TerraformPluginDotNet.Test.Schemas;
Expand All @@ -16,7 +17,8 @@ public void Setup()
{
_schemaBuilder = new SchemaBuilder(
NullLogger<SchemaBuilder>.Instance,
new TerraformTypeBuilder());
new TerraformTypeBuilder(),
new TerraformAttributeResolver());
}

[Test]
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using System.Reflection;

namespace TerraformPluginDotNet.Schemas.Attributes;

public interface ITerraformAttributeResolver
{
string GetKey(PropertyInfo property);

string? GetDescription(PropertyInfo property);

bool IsRequired(PropertyInfo property);

bool IsComputed(PropertyInfo property);

bool? IsOptional(PropertyInfo property);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
using System.ComponentModel;
using System.Reflection;
using MessagePack;
using TerraformPluginDotNet.Resources;
using TerraformPluginDotNet.Schemas.Types;

namespace TerraformPluginDotNet.Schemas.Attributes;

public class TerraformAttributeResolver : ITerraformAttributeResolver
{
public string? GetDescription(PropertyInfo property)
{
return property.GetCustomAttribute<DescriptionAttribute>()?.Description;
}

public string GetKey(PropertyInfo property)
{
return property.GetCustomAttribute<KeyAttribute>()?.StringKey ?? throw new InvalidOperationException($"Missing {nameof(KeyAttribute)} on {property.Name} in {property.DeclaringType?.Name}.");
}

public bool IsComputed(PropertyInfo property)
{
return property.GetCustomAttribute<ComputedAttribute>() is not null;
}

public bool? IsOptional(PropertyInfo property)
{
return null;
}

public bool IsRequired(PropertyInfo property)
{
return TerraformTypeBuilder.IsRequiredAttribute(property);
}
}
22 changes: 13 additions & 9 deletions TerraformPluginDotNet/Schemas/SchemaBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,21 +3,24 @@
using Google.Protobuf;
using Microsoft.Extensions.Logging;
using TerraformPluginDotNet.Resources;
using TerraformPluginDotNet.Schemas.Attributes;
using TerraformPluginDotNet.Schemas.Types;
using Tfplugin5;
using KeyAttribute = MessagePack.KeyAttribute;

namespace TerraformPluginDotNet.Schemas;

class SchemaBuilder : ISchemaBuilder
public class SchemaBuilder : ISchemaBuilder
{
private readonly ILogger<SchemaBuilder> _logger;
private readonly ITerraformTypeBuilder _typeBuilder;
private readonly ITerraformAttributeResolver _attributeResolver;

public SchemaBuilder(ILogger<SchemaBuilder> logger, ITerraformTypeBuilder typeBuilder)
public SchemaBuilder(ILogger<SchemaBuilder> logger, ITerraformTypeBuilder typeBuilder, ITerraformAttributeResolver attributeResolver)
{
_logger = logger;
_typeBuilder = typeBuilder;
_attributeResolver = attributeResolver;
}

public Schema BuildSchema(Type type)
Expand All @@ -33,11 +36,12 @@ public Schema BuildSchema(Type type)
var block = new Schema.Types.Block();
foreach (var property in properties)
{
var key = property.GetCustomAttribute<KeyAttribute>() ?? throw new InvalidOperationException($"Missing {nameof(KeyAttribute)} on {property.Name} in {type.Name}.");
var key = _attributeResolver.GetKey(property);

var description = property.GetCustomAttribute<DescriptionAttribute>();
var required = TerraformTypeBuilder.IsRequiredAttribute(property);
var computed = property.GetCustomAttribute<ComputedAttribute>() != null;
var description = _attributeResolver.GetDescription(property);
var required = _attributeResolver.IsRequired(property);
var computed = _attributeResolver.IsComputed(property);
var optional = _attributeResolver.IsOptional(property) ?? !required;
var terraformType = _typeBuilder.GetTerraformType(property.PropertyType);

if (terraformType is TerraformType.TfObject _ && !required)
Expand All @@ -47,12 +51,12 @@ public Schema BuildSchema(Type type)

block.Attributes.Add(new Schema.Types.Attribute
{
Name = key.StringKey,
Name = key,
Type = ByteString.CopyFromUtf8(terraformType.ToJson()),
Description = description?.Description,
Optional = !required,
Description = description,
Required = required,
Computed = computed,
Optional = optional,
});
}

Expand Down
2 changes: 2 additions & 0 deletions TerraformPluginDotNet/ServiceCollectionExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using TerraformPluginDotNet.ProviderConfig;
using TerraformPluginDotNet.ResourceProvider;
using TerraformPluginDotNet.Schemas;
using TerraformPluginDotNet.Schemas.Attributes;
using TerraformPluginDotNet.Schemas.Types;
using TerraformPluginDotNet.Serialization;

Expand All @@ -15,6 +16,7 @@ public static class ServiceCollectionExtensions
{
public static IServiceCollection AddTerraformPluginCore(this IServiceCollection services)
{
services.AddTransient<ITerraformAttributeResolver, TerraformAttributeResolver>();
services.AddTransient<ITerraformTypeBuilder, TerraformTypeBuilder>();
services.AddTransient<ISchemaBuilder, SchemaBuilder>();
services.AddTransient(typeof(ProviderConfigurationHost<>));
Expand Down