chore(cli): scaffold CLI project with option parsing
This commit is contained in:
1 parent
de89553bb0
commit
99458b9d0b
2 files changed
+138
No files matched your search
@@ -0,0 +1,22 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFramework>net6.0</TargetFramework>
|
||||||
|
<ImplicitUsings>disable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
<RootNamespace>Chip8.Cli</RootNamespace>
|
||||||
|
<AssemblyName>Chip8.Cli</AssemblyName>
|
||||||
|
<LangVersion>10</LangVersion>
|
||||||
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Raylib-cs" Version="4.5.0.4" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\Chip8.Core\Chip8.Core.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
@@ -0,0 +1,116 @@
|
|||||||
|
using System;
|
||||||
|
using Chip8.Core;
|
||||||
|
|
||||||
|
namespace Chip8.Cli;
|
||||||
|
|
||||||
|
sealed class Options
|
||||||
|
{
|
||||||
|
public string romPath = "";
|
||||||
|
public bool headless;
|
||||||
|
public int cycles = 2000;
|
||||||
|
public int scale = 14;
|
||||||
|
public int instructionsPerFrame = 11;
|
||||||
|
public int? seed;
|
||||||
|
public string quirksProfile = "auto";
|
||||||
|
public string platformName = "chip8";
|
||||||
|
public string paletteName = "octo";
|
||||||
|
public int maxFrames;
|
||||||
|
public string? screenshotPath;
|
||||||
|
public string? dumpPpmPath;
|
||||||
|
public string? dumpWavPath;
|
||||||
|
|
||||||
|
public Platform buildPlatform() => platformName.ToLowerInvariant() switch
|
||||||
|
{
|
||||||
|
"superchip" or "schip" => Platform.SuperChip,
|
||||||
|
"xochip" or "xo" => Platform.XoChip,
|
||||||
|
_ => Platform.Chip8,
|
||||||
|
};
|
||||||
|
|
||||||
|
public Quirks? buildQuirks() => quirksProfile.ToLowerInvariant() switch
|
||||||
|
{
|
||||||
|
"auto" => null,
|
||||||
|
"cosmac" => Quirks.cosmacVip(),
|
||||||
|
"superchip" => Quirks.superChip(),
|
||||||
|
"xochip" => Quirks.xoChip(),
|
||||||
|
_ => Quirks.modern(),
|
||||||
|
};
|
||||||
|
|
||||||
|
public Palette buildPalette() => Palette.byName(paletteName);
|
||||||
|
|
||||||
|
public static Options parse(string[] args)
|
||||||
|
{
|
||||||
|
var options = new Options();
|
||||||
|
int index = 0;
|
||||||
|
|
||||||
|
while (index < args.Length)
|
||||||
|
{
|
||||||
|
string token = args[index];
|
||||||
|
switch (token)
|
||||||
|
{
|
||||||
|
case "--headless":
|
||||||
|
options.headless = true;
|
||||||
|
index++;
|
||||||
|
break;
|
||||||
|
case "--cycles":
|
||||||
|
options.cycles = int.Parse(args[++index]);
|
||||||
|
index++;
|
||||||
|
break;
|
||||||
|
case "--scale":
|
||||||
|
options.scale = int.Parse(args[++index]);
|
||||||
|
index++;
|
||||||
|
break;
|
||||||
|
case "--ipf":
|
||||||
|
options.instructionsPerFrame = int.Parse(args[++index]);
|
||||||
|
index++;
|
||||||
|
break;
|
||||||
|
case "--seed":
|
||||||
|
options.seed = int.Parse(args[++index]);
|
||||||
|
index++;
|
||||||
|
break;
|
||||||
|
case "--quirks":
|
||||||
|
options.quirksProfile = args[++index];
|
||||||
|
index++;
|
||||||
|
break;
|
||||||
|
case "--platform":
|
||||||
|
options.platformName = args[++index];
|
||||||
|
index++;
|
||||||
|
break;
|
||||||
|
case "--palette":
|
||||||
|
options.paletteName = args[++index];
|
||||||
|
index++;
|
||||||
|
break;
|
||||||
|
case "--frames":
|
||||||
|
options.maxFrames = int.Parse(args[++index]);
|
||||||
|
index++;
|
||||||
|
break;
|
||||||
|
case "--shot":
|
||||||
|
options.screenshotPath = args[++index];
|
||||||
|
index++;
|
||||||
|
break;
|
||||||
|
case "--ppm":
|
||||||
|
options.dumpPpmPath = args[++index];
|
||||||
|
index++;
|
||||||
|
break;
|
||||||
|
case "--wav":
|
||||||
|
options.dumpWavPath = args[++index];
|
||||||
|
index++;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if (token.StartsWith("--"))
|
||||||
|
{
|
||||||
|
throw new ArgumentException($"Unknown option: {token}");
|
||||||
|
}
|
||||||
|
options.romPath = token;
|
||||||
|
index++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (options.romPath.Length == 0)
|
||||||
|
{
|
||||||
|
throw new ArgumentException("No ROM path given.");
|
||||||
|
}
|
||||||
|
|
||||||
|
return options;
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in new issue
Block a user