1
0
Fork 0
Brotli-Builder/BrotliCalc/Arguments.cs

99 lines
3.6 KiB
C#

using System;
using System.IO;
using BrotliCalc.Commands;
using BrotliCalc.Helpers;
using BrotliLib.Numbers;
namespace BrotliCalc{
static class Arguments{
public static void Read(string[] args){
for(int index = 0; index < args.Length;){
string key = args[index];
string? value = index + 1 < args.Length ? args[index + 1] : null;
index += ProcessArgument(key, value);
}
}
private static int ProcessArgument(string key, string? value){
switch(key){
case "-help":
static void Print(string arg, string description){
Console.WriteLine();
Console.ForegroundColor = ConsoleColor.White;
Console.Write(" ");
Console.WriteLine(arg);
Console.ForegroundColor = ConsoleColor.Gray;
Console.Write(" ");
Console.WriteLine(description);
}
Console.WriteLine("BrotliCalc arguments");
Console.WriteLine("--------------------");
Print("-brotliexe <path>", "Path to brotli executable used for compression.");
Print("-maxdop <n>", "Maximum degree of parallelism (threads/processes) to use for parallel tasks.");
Print("-fileorder {system|quality}", "Whether to process files in system order, or order by compression quality.");
Environment.Exit(0);
return 1;
case "-brotliexe":
CmdCompress.CustomExePath = ParseFile(key, value);
return 2;
case "-maxdop":
Linq.MaxThreads = ParseInt(key, value, IntRange.AtLeast(1));
return 2;
case "-fileorder":
Brotli.FileOrder = value switch{
"system" => Brotli.FileOrdering.System,
"quality" => Brotli.FileOrdering.Quality,
_ => throw new ArgumentException($"Unknown file ordering {value}")
};
return 2;
default:
throw new ArgumentException($"Unknown argument {key}");
}
}
// Parsing
private static int ParseInt(string key, string? value, IntRange range = default /* IntRange.Any */){
if (value == null){
throw new ArgumentException($"Missing value for argument {key}");
}
else if (!int.TryParse(value, out int result)){
throw new FormatException($"Value of argument {key} must be a number");
}
else if (!range.Contains(result)){
throw new ArgumentException($"Value of argument {key} must be in the range {range}");
}
else{
return result;
}
}
private static string ParseFolder(string key, string? value){
if (value == null || !Directory.Exists(value)){
throw new ArgumentException($"Folder specified by argument {key} does not exist: {value ?? "<missing>"}");
}
else{
return value;
}
}
private static string ParseFile(string key, string? value){
if (value == null || !File.Exists(value)){
throw new ArgumentException($"File specified by argument {key} does not exist: {value ?? "<missing>"}");
}
else{
return value;
}
}
}
}