The repository includes runnable sample projects under samples/ that demonstrate each generator in action.


Running the Samples

git clone https://github.com/OleksandrTsvirkun/VoloGen.git
cd VoloGen
dotnet build

# Run any sample
dotnet run --project samples/VoloGen.Samples.Equality
dotnet run --project samples/VoloGen.Samples.Comparable
dotnet run --project samples/VoloGen.Samples.Parsable
dotnet run --project samples/VoloGen.Samples.Formattable

Equality Sample

Project: samples/VoloGen.Samples.Equality/

A UserId value object with [AutoEquality] that generates IEquatable<UserId>, Equals(object?), and ==/!= operators.

[AutoEquality]
public partial struct UserId
{
    private readonly int _value;

    public UserId(int value)
    {
        _value = value;
    }

    public static bool Equal(UserId left, UserId right)
    {
        return left._value == right._value;
    }

    public override int GetHashCode()
    {
        return _value.GetHashCode();
    }
}

Output:

id1 == id2: True
id1 != id3: True
id1.Equals(id2): True
id1.GetHashCode() == id2.GetHashCode(): True

Comparable Sample

Project: samples/VoloGen.Samples.Comparable/

An Amount value object with [AutoComparable] that generates IComparable<Amount>, IComparable, and all comparison operators.

[AutoComparable]
public partial struct Amount
{
    private readonly decimal _value;

    public Amount(decimal value)
    {
        _value = value;
    }

    public static int Compare(Amount left, Amount right)
    {
        return left._value.CompareTo(right._value);
    }

    public override bool Equals(object? obj)
    {
        return obj is Amount other && _value == other._value;
    }

    public override int GetHashCode()
    {
        return _value.GetHashCode();
    }
}

Output:

a < b: True
c > b: True
a <= a: True
a == a: True
Sorted: $10.00, $30.00, $50.00

Parsable Sample

Project: samples/VoloGen.Samples.Parsable/

A Temperature value object with [AutoParsable] that generates IParsable<Temperature>, ISpanParsable<Temperature>, and all Parse/TryParse overloads.

[AutoParsable]
public partial struct Temperature
{
    private readonly double _celsius;

    public Temperature(double celsius)
    {
        _celsius = celsius;
    }

    public static bool TryParse(ReadOnlySpan<char> s, IFormatProvider? provider, out Temperature result)
    {
        if (double.TryParse(s, provider, out double value))
        {
            result = new Temperature(value);
            return true;
        }
        result = default;
        return false;
    }
}

Output:

Parsed: 36.6 deg C
Boiling: 100.0 deg C
'not-a-number' failed to parse as expected.

Formattable Sample

Project: samples/VoloGen.Samples.Formattable/

A Currency value object with [AutoFormattable] that generates IFormattable, ISpanFormattable, and all ToString/TryFormat overloads.

[AutoFormattable(DefaultFormat = "N2")]
public partial struct Currency
{
    private readonly decimal _value;
    public const int MaxBufferSize = 64;

    public Currency(decimal value)
    {
        _value = value;
    }

    public bool TryFormat(Span<char> destination, out int charsWritten,
        ReadOnlySpan<char> format, IFormatProvider? provider)
    {
        return _value.TryFormat(destination, out charsWritten, format,
            provider ?? System.Globalization.CultureInfo.InvariantCulture);
    }
}

Output:

Default: 1,234.57
Format C: $1,234.57
TryFormat: 1234.567
Interpolated: 1,235