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