using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Generator { public partial class CodeWriter { private void Enums() { foreach ( var o in def.enums ) { WriteLine( $"//" ); WriteLine( $"// {o.Name}" ); WriteLine( $"//" ); var name = o.Name; // We're not interested in namespacing if ( name.Contains( "::" ) ) name = o.Name.Substring( o.Name.LastIndexOf( ":" ) + 1 ); // Skip the E if ( name[0] == 'E' ) name = name.Substring( 1 ); name = Cleanup.ConvertType( name ); if ( !Cleanup.ShouldCreate( name ) ) continue; var lowest = o.Values.Min( x => long.Parse( x.Value ) ); var highest = o.Values.Max( x => long.Parse( x.Value ) ); var t = "int"; if ( highest > int.MaxValue ) t = "uint"; WriteEnum( o, name, t ); } } private void WriteEnum( SteamApiDefinition.EnumDef o, string name, string t = "int" ) { StartBlock( $"{Cleanup.Expose( name )} enum {name} : {t}" ); { // // If all the enum values start with the same // string, remove it. This converts // "k_EUserHasLicenseResultHasLicense" to "HasLicense" etc // int iFinished = int.MaxValue; for ( int i = 0; i < 4096; i++ ) { var c = o.Values.First().Name[i]; foreach ( var entry in o.Values ) { if ( entry.Name[i] != c ) { iFinished = i; break; } } if ( iFinished != int.MaxValue ) break; } foreach ( var entry in o.Values ) { var ename = entry.Name; if ( ename.Contains( "Force32Bit" ) ) continue; if ( iFinished != int.MaxValue ) ename = ename.Substring( iFinished ); // // Names aren't allowed to start with a number // So just stick the enum name on the front // if ( char.IsNumber( ename[0] ) ) { var p = name; if ( p == "HTTPStatusCode" ) p = "Code"; if ( p == "SteamIPType" ) p = "Type"; ename = p + ename; } WriteLine( $"{ename.Trim( ' ', '_' )} = {entry.Value}," ); } } EndBlock(); WriteLine(); } } }