Skip to content

Commit da3bfc1

Browse files
committed
more advanced command-line support
1 parent f06336f commit da3bfc1

7 files changed

Lines changed: 117 additions & 108 deletions

File tree

src/Server/Config.cs

Lines changed: 50 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
using System.Diagnostics.CodeAnalysis;
2-
using System.Text.Json;
1+
using System.Text.Json;
32
using Gommon;
43
using Microsoft.Extensions.Configuration.Json;
54
using Microsoft.Extensions.FileProviders;
5+
using Ryujinx.Systems.Update.Server.Helpers;
66
using Ryujinx.Systems.Update.Server.Services;
77

88
namespace Ryujinx.Systems.Update.Server;
@@ -16,69 +16,66 @@ static Config()
1616
if (!Directory.Exists("config"))
1717
Directory.CreateDirectory("config");
1818

19-
2019
DiskProvider = new PhysicalFileProvider(new FilePath(Environment.CurrentDirectory) / "config");
2120
}
2221

23-
public static bool UseVersionPinning(string[] args,
24-
[MaybeNullWhen(false)] out JsonConfigurationSource jcs)
22+
extension(WebApplicationBuilder builder)
2523
{
26-
jcs = null;
27-
28-
if (args.Any(x => x.EqualsIgnoreCase("--gen-version-pinning")))
24+
public void TryUseVersionPinning()
2925
{
30-
if (!File.Exists("config/versionPinning.json"))
31-
File.WriteAllText("config/versionPinning.json",
32-
"""
33-
{
34-
"VersionPinning": {
35-
"Stable": {
36-
"osx": {
37-
"x64": "1.3.4"
26+
if (CommandLineState.GenerateVersionPinning)
27+
{
28+
if (!File.Exists("config/versionPinning.json"))
29+
File.WriteAllText("config/versionPinning.json",
30+
"""
31+
{
32+
"VersionPinning": {
33+
"Stable": {
34+
"osx": {
35+
"x64": "1.3.4"
36+
}
3837
}
3938
}
4039
}
41-
}
42-
"""
43-
);
44-
}
45-
46-
if (File.Exists("config/versionPinning.json"))
47-
jcs = new()
48-
{
49-
FileProvider = DiskProvider,
50-
Optional = true,
51-
ReloadOnChange = false,
52-
Path = "versionPinning.json"
53-
};
40+
"""
41+
);
42+
}
5443

55-
return jcs != null;
56-
}
44+
if (File.Exists("config/versionPinning.json"))
45+
builder.Configuration.Sources.Add(new JsonConfigurationSource
46+
{
47+
FileProvider = DiskProvider,
48+
Optional = true,
49+
ReloadOnChange = false,
50+
Path = "versionPinning.json"
51+
});
52+
}
5753

58-
public static void TryUseVersionProvider(this WebApplicationBuilder builder, string[] args)
59-
{
60-
if (args.Any(x => x.EqualsIgnoreCase("--gen-version-provider")))
54+
public void TryUseVersionProvider()
6155
{
62-
if (!VersionProvider.Path.ExistsAsFile)
63-
VersionProvider.Path.WriteAllText(
64-
JsonSerializer.Serialize(new VersionProvider
65-
{
66-
Stable = new()
67-
{
68-
Format = "1.{MAJOR}.{BUILD}",
69-
Major = 3,
70-
Build = 0
71-
},
72-
Canary = new()
56+
if (CommandLineState.GenerateVersionProvider)
57+
{
58+
if (!VersionProvider.Path.ExistsAsFile)
59+
VersionProvider.Path.WriteAllText(
60+
JsonSerializer.Serialize(new VersionProvider
7361
{
74-
Format = "1.{MAJOR}.{BUILD}",
75-
Major = 3,
76-
Build = 0
77-
}
78-
}, JSCtx.ReadableDefault.VersionProvider));
79-
}
62+
Stable = new()
63+
{
64+
Format = "1.{MAJOR}.{BUILD}",
65+
Major = 3,
66+
Build = 0
67+
},
68+
Canary = new()
69+
{
70+
Format = "1.{MAJOR}.{BUILD}",
71+
Major = 3,
72+
Build = 0
73+
}
74+
}, JSCtx.ReadableDefault.VersionProvider));
75+
}
8076

81-
if (VersionProvider.Path.ExistsAsFile)
82-
builder.Services.AddSingleton<VersionProviderService>();
77+
if (VersionProvider.Path.ExistsAsFile)
78+
builder.Services.AddSingleton<VersionProviderService>();
79+
}
8380
}
8481
}

src/Server/Controllers/Api/v1/Admin/VersioningController.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
using Gommon;
2-
using Microsoft.AspNetCore.Mvc;
1+
using Microsoft.AspNetCore.Mvc;
32
using Ryujinx.Systems.Update.Common;
43
using Ryujinx.Systems.Update.Server.Services;
54

src/Server/Controllers/IndexController.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public ActionResult Index()
1515
[HttpGet("docs"), HttpGet("info"), HttpGet("help")]
1616
public ActionResult Help()
1717
{
18-
return CommandLineState.UseSwagger
18+
return CommandLineState.Swagger
1919
? Redirect("/swagger")
2020
: Index();
2121
}
Lines changed: 54 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,61 @@
1-
namespace Ryujinx.Systems.Update.Server.Helpers;
1+
using CommandLine;
22

3-
public static class CommandLineState
3+
namespace Ryujinx.Systems.Update.Server.Helpers;
4+
5+
public class CommandLineState
46
{
7+
public static bool HttpLogging => Instance.UseHttpLogging;
8+
public static bool Swagger => Instance.UseSwagger;
9+
public static int? Port => Instance.ListenPort;
10+
public static bool GenerateVersionPinning => Instance.GenerateVersionPinningConfiguration;
11+
public static bool GenerateVersionProvider => Instance.GenerateVersionProviderConfiguration;
12+
13+
public static bool Init(string[] args)
14+
{
15+
ParserResult<CommandLineState> parserResult = Parser.Default.ParseArguments<CommandLineState>(args);
16+
17+
if (parserResult is not Parsed<CommandLineState> parsedCls)
18+
return false;
19+
20+
Instance = parsedCls.Value;
21+
22+
return true;
23+
}
24+
25+
private static CommandLineState Instance { get; set; } = null!;
26+
27+
[Option('h',"http-logging", Required = false, Default =
528
#if DEBUG
6-
public static bool UseHttpLogging { get; private set; } = true;
7-
public static bool UseSwagger { get; private set; } = true;
29+
true
830
#else
9-
public static bool UseHttpLogging { get; private set; } = false;
10-
public static bool UseSwagger { get; private set; } = false;
31+
false
1132
#endif
12-
public static int? ListenPort { get; private set; }
33+
, HelpText = "Register ASP.NET HTTP logging."
34+
)]
35+
public bool UseHttpLogging { get; set; }
1336

14-
public static void Init(string[] args)
15-
{
16-
foreach (var (index, arg) in args.Index())
17-
{
18-
switch (arg.ToLower())
19-
{
20-
case "--port":
21-
case "-p":
22-
{
23-
if (index + 1 >= args.Length)
24-
throw new Exception("port argument expects a value");
25-
26-
if (!args[index + 1].TryParse<int>(out var port))
27-
throw new Exception("port argument must be an integer");
28-
29-
ListenPort = port;
30-
31-
break;
32-
}
33-
case "--http-logging":
34-
case "-l":
35-
{
36-
UseHttpLogging = true;
37-
break;
38-
}
39-
case "--enable-swagger":
40-
case "-s":
41-
{
42-
UseSwagger = true;
43-
break;
44-
}
45-
}
46-
}
47-
}
37+
[Option('s',"swagger-ui", Required = false, Default =
38+
#if DEBUG
39+
true
40+
#else
41+
false
42+
#endif
43+
, HelpText = "Enable Swagger UI at the <ServerUrl>/swagger endpoint. /docs, /info, and /help redirect there as well with this enabled."
44+
)]
45+
public bool UseSwagger { get; set; } =
46+
#if DEBUG
47+
true
48+
#else
49+
false
50+
#endif
51+
;
52+
53+
[Option('p', "port", Required = false, Default = null, HelpText = "Specifies the port to listen on.")]
54+
public int? ListenPort { get; set; }
55+
56+
[Option("gen-version-pinning", Required = false, Default = false, HelpText = "Generates a template configuration for the version pinning system.")]
57+
public bool GenerateVersionPinningConfiguration { get; set; }
58+
59+
[Option("gen-version-provider", Required = false, Default = false, HelpText = "Generates a template configuration for the version provider system.")]
60+
public bool GenerateVersionProviderConfiguration { get; set; }
4861
}

src/Server/Initialization/Swagger.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ public static class Swagger
88
{
99
public static void TrySetup(WebApplicationBuilder builder)
1010
{
11-
if (CommandLineState.UseSwagger)
11+
if (CommandLineState.Swagger)
1212
{
1313
builder.Services.AddOpenApi(Constants.CurrentApiVersion);
1414
builder.Services.AddOpenApiDocument(opt =>
@@ -28,7 +28,7 @@ public static void TrySetup(WebApplicationBuilder builder)
2828

2929
public static void TryMapUi(WebApplication app)
3030
{
31-
if (CommandLineState.UseSwagger)
31+
if (CommandLineState.Swagger)
3232
{
3333
app.MapOpenApi();
3434
app.UseSwaggerUi(opt =>

src/Server/Program.cs

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,18 @@
44
using Ryujinx.Systems.Update.Server.Services;
55
using Ryujinx.Systems.Update.Server.Services.GitLab;
66

7-
CommandLineState.Init(args);
7+
if (!CommandLineState.Init(args))
8+
return;
89

910
var builder = WebApplication.CreateBuilder(args);
1011

11-
if (Config.UseVersionPinning(args, out var configSource))
12-
builder.Configuration.Sources.Add(configSource);
12+
builder.TryUseVersionPinning();
13+
builder.TryUseVersionProvider();
1314

14-
builder.TryUseVersionProvider(args);
15+
if (CommandLineState.Port != null)
16+
builder.WebHost.ConfigureKestrel(options => options.ListenLocalhost(CommandLineState.Port.Value));
1517

16-
if (CommandLineState.ListenPort != null)
17-
builder.WebHost.ConfigureKestrel(options => options.ListenLocalhost(CommandLineState.ListenPort.Value));
18-
19-
if (CommandLineState.UseHttpLogging)
18+
if (CommandLineState.HttpLogging)
2019
builder.Services.AddHttpLogging();
2120

2221
builder.Services.Configure<ForwardedHeadersOptions>(opts =>
@@ -43,7 +42,7 @@
4342

4443
app.MapControllers();
4544

46-
if (CommandLineState.UseHttpLogging)
45+
if (CommandLineState.HttpLogging)
4746
app.UseHttpLogging();
4847

4948
TaskScheduler.UnobservedTaskException += (sender, eventArgs) =>

src/Server/Ryujinx.Systems.Update.Server.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
</PropertyGroup>
1515

1616
<ItemGroup>
17+
<PackageReference Include="CommandLineParser" Version="2.9.1" />
1718
<PackageReference Include="Gommon" Version="2.8.0.1" />
1819
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="10.0.0" />
1920
<PackageReference Include="NGitLab" Version="11.0.1" />

0 commit comments

Comments
 (0)