RSCG – OrderedBuildersGenerator

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


Posted

in

, ,

by

Tags: