RSCG – SuperFluid
 
 
| name | SuperFluid | 
| nuget | https://www.nuget.org/packages/SuperFluid/ | 
| link | https://github.com/hughesjs/SuperFluid | 
| author | James Hughes | 
Generate a state machine from a yaml file
This is how you can use SuperFluid .
The code that you start with is
<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
        <TargetFramework>net8.0</TargetFramework>
        <OutputType>Exe</OutputType>
        <Nullable>enable</Nullable>
        <ImplicitUsings>enable</ImplicitUsings>
    </PropertyGroup>
    <ItemGroup>
        <AdditionalFiles Include="Calculator.fluid.yml" />
    </ItemGroup>
    <ItemGroup>
      <PackageReference Include="SuperFluid" Version="1.0.1" OutputItemType="Analyzer" ReferenceOutputAssembly="true" >
        <PrivateAssets>all</PrivateAssets>
        <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
      </PackageReference>
    </ItemGroup>
	<PropertyGroup>
		<EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
		<CompilerGeneratedFilesOutputPath>$(BaseIntermediateOutputPath)\GX</CompilerGeneratedFilesOutputPath>
	</PropertyGroup>
</Project>
The code that you will use is
Name: "ICalculator"
Namespace: "SimpleFluentExample"
InitialState:
  Name: "Create"
  CanTransitionTo: 
    - "Add"
    - "Subtract"
Methods:
  - Name: "Add"
    Arguments:
      - Name: "value"
        Type: "int"
    CanTransitionTo:
      - "Add"
      - "Subtract"
      - "Calculate"
  - Name: "Subtract"
    Arguments:
      - Name: "value"
        Type: "int"
    CanTransitionTo:
      - "Add"
      - "Subtract"
      - "Calculate"
  - Name: "Calculate"
    ReturnType: "int"
    CanTransitionTo: []
using SimpleFluentExample;
Console.WriteLine("Example Basic calculation state machine");
var result1 = CalculatorService.Create()
    .Add(10)
    .Subtract(3)
    .Add(5)
    .Calculate();
Console.WriteLine($"Result 1: {result1}"); // Output: 12
Console.WriteLine();
// Uncomment these lines to see compilation errors:
// CalculatorService.Create().Calculate();        // Can't calculate without operations  
// CalculatorService.Create().Add(5).Add(10);     // Missing Calculate() at the end
namespace SimpleFluentExample;
public class CalculatorService : ICalculator
{
    private int _currentValue = 0;
    // Static factory method as required by the generated interface
    public static ICanAddOrSubtract Create()
    {
        var calculator = new CalculatorService();
        Console.WriteLine("🧮 Calculator created");
        return calculator;
    }
    public ICanAddOrSubtractOrCalculate Add(int value)
    {
        _currentValue += value;
        Console.WriteLine($"➕ Added {value}, current value: {_currentValue}");
        return this;
    }
    public ICanAddOrSubtractOrCalculate Subtract(int value)
    {
        _currentValue -= value;
        Console.WriteLine($"➖ Subtracted {value}, current value: {_currentValue}");
        return this;
    }
    public int Calculate()
    {
        Console.WriteLine($"🎯 Final result: {_currentValue}");
        return _currentValue;
    }
}
The code that is generated is
namespace SimpleFluentExample;
public interface ICalculator: ICanAddOrSubtractOrCalculate,ICanAddOrSubtract
{
	public static abstract ICanAddOrSubtract Create();
}
namespace SimpleFluentExample;
public interface ICanAddOrSubtract
{
	public ICanAddOrSubtractOrCalculate Add(int value);
	public ICanAddOrSubtractOrCalculate Subtract(int value);
}
namespace SimpleFluentExample;
public interface ICanAddOrSubtractOrCalculate
{
	public ICanAddOrSubtractOrCalculate Add(int value);
	public ICanAddOrSubtractOrCalculate Subtract(int value);
	public int Calculate();
}
Code and pdf at
https://ignatandrei.github.io/RSCG_Examples/v2/docs/SuperFluid