Skip to content

Commit

Permalink
Added overload for "TryCreate" with validation error.
Browse files Browse the repository at this point in the history
  • Loading branch information
PawelGerr committed Jul 9, 2024
1 parent 3f8cf27 commit 6ed62cd
Show file tree
Hide file tree
Showing 6 changed files with 346 additions and 93 deletions.
2 changes: 1 addition & 1 deletion Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

<PropertyGroup>
<Copyright>(c) $([System.DateTime]::Now.Year), Pawel Gerr. All rights reserved.</Copyright>
<VersionPrefix>7.4.0</VersionPrefix>
<VersionPrefix>7.5.0</VersionPrefix>
<Authors>Pawel Gerr</Authors>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<PackageProjectUrl>https://github.com/PawelGerr/Thinktecture.Runtime.Extensions</PackageProjectUrl>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,9 @@ private static void DemoForSimpleValueObjects(ILogger logger)
if (ProductName.TryCreate("Milk", out milk))
logger.Information("Product name '{Name}' created with 'TryCreate'.", milk);

if (!ProductName.TryCreate("X", out _, out var error))
logger.Information("Failed to create a product with name 'X'. Error: {Error}", error.Message);

// Thanks to setting "NullInFactoryMethodsYieldsNull = true" the method "Create" returns null
var nullProduct = ProductName.Create(null);
logger.Information("Null-Product name: {NullProduct}", nullProduct);
Expand Down Expand Up @@ -181,6 +184,9 @@ private static void DemoForComplexValueObjects(ILogger logger)
if (Boundary.TryCreate(lower: 1, upper: 2, out var boundaryWithTryCreate))
logger.Information("Boundary with TryCreate: {Boundary}", boundaryWithTryCreate);

if (!Boundary.TryCreate(lower: 2, upper: 1, out _, out var error))
logger.Information("Failed to create Boundary (2, 1). Error: {Error}", error.Message);

var validationError = Boundary.Validate(lower: 1, upper: 2, out var boundaryWithValidate);

if (validationError is null)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,28 @@ private void GenerateTryCreateMethod()
_sb.Append(@"
[global::System.Diagnostics.CodeAnalysis.NotNullWhen(true)] out ").Append(_state.TypeFullyQualifiedNullAnnotated).Append(@" obj)
{
var validationError = Validate(");
return ").Append(_state.Settings.TryCreateFactoryMethodName).Append("(");

_sb.RenderArguments(fieldsAndProperties);

if (fieldsAndProperties.Count > 0)
_sb.Append(", ");

_sb.Append(@"out obj, out _);
}");

_sb.Append(@"
public static bool ").Append(_state.Settings.TryCreateFactoryMethodName).Append("(");

_sb.RenderArgumentsWithType(fieldsAndProperties, @"
", ",", trailingComma: true);

_sb.Append(@"
[global::System.Diagnostics.CodeAnalysis.NotNullWhen(true)] out ").Append(_state.TypeFullyQualifiedNullAnnotated).Append(@" obj,
[global::System.Diagnostics.CodeAnalysis.NotNullWhen(false)] out ").Append(_state.ValidationError.TypeFullyQualified).Append(@"? validationError)
{
validationError = Validate(");

_sb.RenderArguments(fieldsAndProperties);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -323,7 +323,17 @@ private void GenerateTryCreateMethod(bool allowNullOutput, bool emptyStringYield
public static bool ").Append(_state.Settings.TryCreateFactoryMethodName).Append("(").RenderArgumentWithType(_state.KeyMember, useNullableTypes: allowNullOutput).Append(emptyStringYieldsNull ? "," : ", [global::System.Diagnostics.CodeAnalysis.NotNullWhen(true)]").Append(" out ").Append(_state.TypeFullyQualifiedNullAnnotated).Append(@" obj)
{
var validationError = Validate(").RenderArgument(_state.KeyMember).Append(@", null, out obj);
return ").Append(_state.Settings.TryCreateFactoryMethodName).Append("(").RenderArgument(_state.KeyMember).Append(@", out obj, out _);
}");

_sb.Append(@"
public static bool ").Append(_state.Settings.TryCreateFactoryMethodName).Append(@"(
").RenderArgumentWithType(_state.KeyMember, useNullableTypes: allowNullOutput).Append(@",
").Append(emptyStringYieldsNull ? null : "[global::System.Diagnostics.CodeAnalysis.NotNullWhen(true)] ").Append("out ").Append(_state.TypeFullyQualifiedNullAnnotated).Append(@" obj,
[global::System.Diagnostics.CodeAnalysis.NotNullWhen(false)] out ").Append(_state.ValidationError.TypeFullyQualified).Append(@"? validationError)
{
validationError = Validate(").RenderArgument(_state.KeyMember).Append(@", null, out obj);
return validationError is null;
}");
Expand Down
Loading

0 comments on commit 6ed62cd

Please sign in to comment.