diff --git a/.changes/unreleased/Improvements-438.yaml b/.changes/unreleased/Improvements-438.yaml new file mode 100644 index 00000000..d494b290 --- /dev/null +++ b/.changes/unreleased/Improvements-438.yaml @@ -0,0 +1,6 @@ +component: sdk +kind: Improvements +body: Make OutputConstructorAttribute optional +time: 2024-12-30T10:48:22.983 +custom: + PR: "438" diff --git a/sdk/Pulumi.Tests/Serialization/RecordTypeConverterTests.cs b/sdk/Pulumi.Tests/Serialization/RecordTypeConverterTests.cs new file mode 100644 index 00000000..60912c3e --- /dev/null +++ b/sdk/Pulumi.Tests/Serialization/RecordTypeConverterTests.cs @@ -0,0 +1,29 @@ +using Pulumi.Serialization; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Xunit; + +namespace Pulumi.Tests.Serialization +{ + public class RecordTypeConverterTests : ConverterTests + { + [OutputType] + public record RecordOutput(string Value1, string Value2); + + [Fact] + public async Task TestRecord() + { + var data = Converter.ConvertValue(NoWarn, "", await SerializeToValueAsync(new Dictionary + { + { "Value1", "lorem" }, + { "Value2", "ipsum" } + })); + + Assert.Equal("lorem", data.Value.Value1); + Assert.Equal("ipsum", data.Value.Value2); + } + } +} diff --git a/sdk/Pulumi/Serialization/Converter.cs b/sdk/Pulumi/Serialization/Converter.cs index 274a79c3..10837ee4 100644 --- a/sdk/Pulumi/Serialization/Converter.cs +++ b/sdk/Pulumi/Serialization/Converter.cs @@ -499,7 +499,21 @@ static bool CheckEnumType(Type targetType, Type underlyingType) } private static ConstructorInfo? GetPropertyConstructor(Type outputTypeArg) - => outputTypeArg.GetConstructors(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance).FirstOrDefault( - c => c.GetCustomAttribute() != null); + { + var constructors = outputTypeArg.GetConstructors(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); + var outputConstructor = constructors.FirstOrDefault(c => c.GetCustomAttribute() != null); + if (outputConstructor != null) + { + return outputConstructor; + } + + var publicConstructors = constructors.Where(x => x.IsPublic).ToArray(); + if (publicConstructors.Length == 1) + { + return publicConstructors[0]; + } + + return null; + } } }