Editor/Projection/CSharp/Projectors/StateSymbolProjector.cs
using System.Collections.Generic;
using Grains.RazorDesigner.Wiring;

namespace Grains.RazorDesigner.Projection.CSharp.Projectors;

public static class StateSymbolProjector
{
    public static void Emit( StateSymbol s, List<CSharpOp> ops, CSharpProjectorContext ctx )
    {
        var visibility = VisibilityToString( s.Visibility );
        var initial = s.Initial is null ? "default" : ExpressionEmitter.Emit( s.Initial, ctx );
        ops.Add( new FieldDecl(
            Visibility: visibility, Type: s.Type, Name: s.Name,
            InitialExpr: initial,
            IsParameter: false,
            IsProperty: s.Visibility == SymbolVisibility.Public ) );
    }

    private static string VisibilityToString( SymbolVisibility v )
    {
        switch ( v )
        {
            case SymbolVisibility.Private:   return "private";
            case SymbolVisibility.Public:    return "public";
            case SymbolVisibility.Internal:  return "internal";
            case SymbolVisibility.Protected: return "protected";
            default:                         return "private";
        }
    }
}