Editor helper that manages bridge and tunnel type catalogs. It ensures default types are written to storage if missing, then reads JSON documents from storage, filters valid entries, sorts by Title and returns lists or single lookups.
namespace Sunless.Architecture;
public static class ArchRoadCatalogs
{
const string BridgeDirectory = "arch/bridges";
const string TunnelDirectory = "arch/tunnels";
public static List<ArchBridgeType> Bridges()
{
foreach ( var built in ArchBridgeTypes.Defaults() )
{
var path = BridgePath( built.Name );
if ( !ArchStorage.DocumentExists( path ) )
{
ArchStorage.WriteDocument( path, built );
}
}
return ArchStorage.DocumentFiles( BridgeDirectory, ".bridgetype.json" )
.Select( file => ArchStorage.ReadDocument<ArchBridgeType>( $"{BridgeDirectory}/{file}" ) )
.Where( type => type is { Name.Length: > 0, Deck: not null } )
.OrderBy( type => type.Title )
.ToList();
}
public static ArchBridgeType Bridge( string name )
{
return Bridges().FirstOrDefault( type => string.Equals( type.Name, name, StringComparison.OrdinalIgnoreCase ) );
}
public static List<ArchTunnelType> Tunnels()
{
foreach ( var built in ArchTunnelTypes.Defaults() )
{
var path = TunnelPath( built.Name );
if ( !ArchStorage.DocumentExists( path ) )
{
ArchStorage.WriteDocument( path, built );
}
}
return ArchStorage.DocumentFiles( TunnelDirectory, ".tunneltype.json" )
.Select( file => ArchStorage.ReadDocument<ArchTunnelType>( $"{TunnelDirectory}/{file}" ) )
.Where( type => type is { Name.Length: > 0, Bore: not null } )
.OrderBy( type => type.Title )
.ToList();
}
public static ArchTunnelType Tunnel( string name )
{
return Tunnels().FirstOrDefault( type => string.Equals( type.Name, name, StringComparison.OrdinalIgnoreCase ) );
}
public static string BridgeDirectoryPath => BridgeDirectory;
public static string TunnelDirectoryPath => TunnelDirectory;
static string BridgePath( string name ) => $"{BridgeDirectory}/{name}.bridgetype.json";
static string TunnelPath( string name ) => $"{TunnelDirectory}/{name}.tunneltype.json";
}