RSCG – OrderedBuildersGenerator
| name | OrderedBuildersGenerator |
| nuget | https://www.nuget.org/packages/OrderedBuildersGenerator/ |
| link | https://github.com/Georgiy-Petrov/OrderedBuildersGenerator |
| author | Georgiy Petrov |
Generating builder classes with enforced property setting order
This is how you can use OrderedBuildersGenerator .
The code that you start with is
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net10.0</TargetFramework>
<Nullable>enable</Nullable>
</PropertyGroup>
<PropertyGroup>
<EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
<CompilerGeneratedFilesOutputPath>$(BaseIntermediateOutputPath)\GX</CompilerGeneratedFilesOutputPath>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="OrderedBuildersGenerator" Version="1.0.0" PrivateAssets="all" OutputItemType="Analyzer" />
</ItemGroup>
</Project>
The code that you will use is
using Builder;
var p = new PersonBuilder()
.WithLastName("Ignat")
.WithFirstName("Andrei")
.Build();
;
Console.WriteLine(p.FullName());
using OrderedBuildersGenerator;
using System;
using System.Xml.Linq;
namespace Builder;
[StepBuilder("PersonBuilder")]
public partial class PersonConfig
{
private string? firstName;
private string lastName = string.Empty;
[OrderedStep(StepOrder.One)]
public void WithLastName(string name)
{
this.lastName = name;
}
[OrderedStep(StepOrder.Two)]
public void WithFirstName(string name)
{
this.firstName = name;
}
[BuildStep]
public Person Build() => new(firstName??"",lastName);
}
public record Person(string firstName, string lastName)
{
public string FullName() => $"{firstName} {lastName}";
}
The code that is generated is
// <auto-generated />
#nullable enable
using OrderedBuildersGenerator;
using System;
using System.Xml.Linq;
namespace Builder;
public interface IOrderBuilder_UnorderedSteps<TStep>
{
}
public interface IOrderBuilder_StepOne : IOrderBuilder_UnorderedSteps<IOrderBuilder_StepOne>
{
public IOrderBuilder_StepTwo WithLastName(string lastName);
}
public interface IOrderBuilder_StepTwo : IOrderBuilder_UnorderedSteps<IOrderBuilder_StepTwo>
{
public IOrderBuilder_StepBuild WithFirstName(string name);
}
public interface IOrderBuilder_StepBuild : IOrderBuilder_UnorderedSteps<IOrderBuilder_StepBuild>
{
public Person Build();
}
public class OrderBuilder : IOrderBuilder_StepOne
{
private readonly PersonBuilder _builder;
public OrderBuilder()
{
_builder = new PersonBuilder();
}
public IOrderBuilder_StepTwo WithLastName(string lastName)
{
_builder.WithLastName(lastName);
return new OrderBuilderStepTwo(_builder);
}
private class OrderBuilderStepTwo : IOrderBuilder_StepTwo
{
private readonly PersonBuilder _builder;
public OrderBuilderStepTwo(PersonBuilder builder)
{
_builder = builder;
}
public IOrderBuilder_StepBuild WithFirstName(string name)
{
_builder.WithFirstName(name);
return new OrderBuilderStepBuild(_builder);
}
}
private class OrderBuilderStepBuild : IOrderBuilder_StepBuild
{
private readonly PersonBuilder _builder;
public OrderBuilderStepBuild(PersonBuilder builder)
{
_builder = builder;
}
public Person Build()
{
return _builder.Build();
}
}
}
// <auto-generated />
#nullable enable
using OrderedBuildersGenerator;
using System;
using System.Xml.Linq;
namespace Builder;
public interface IPersonBuilder_UnorderedSteps<TStep>
{
}
public interface IPersonBuilder_StepOne : IPersonBuilder_UnorderedSteps<IPersonBuilder_StepOne>
{
public IPersonBuilder_StepTwo WithLastName(string name);
}
public interface IPersonBuilder_StepTwo : IPersonBuilder_UnorderedSteps<IPersonBuilder_StepTwo>
{
public IPersonBuilder_StepBuild WithFirstName(string name);
}
public interface IPersonBuilder_StepBuild : IPersonBuilder_UnorderedSteps<IPersonBuilder_StepBuild>
{
public Person Build();
}
public class PersonBuilder : IPersonBuilder_StepOne
{
private readonly PersonConfig _builder;
public PersonBuilder()
{
_builder = new PersonConfig();
}
public IPersonBuilder_StepTwo WithLastName(string name)
{
_builder.WithLastName(name);
return new PersonBuilderStepTwo(_builder);
}
private class PersonBuilderStepTwo : IPersonBuilder_StepTwo
{
private readonly PersonConfig _builder;
public PersonBuilderStepTwo(PersonConfig builder)
{
_builder = builder;
}
public IPersonBuilder_StepBuild WithFirstName(string name)
{
_builder.WithFirstName(name);
return new PersonBuilderStepBuild(_builder);
}
}
private class PersonBuilderStepBuild : IPersonBuilder_StepBuild
{
private readonly PersonConfig _builder;
public PersonBuilderStepBuild(PersonConfig builder)
{
_builder = builder;
}
public Person Build()
{
return _builder.Build();
}
}
}
Code and pdf at
https://ignatandrei.github.io/RSCG_Examples/v2/docs/OrderedBuildersGenerator