📄 src/Cli/Program.cs
using System;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Slopper.Cli;
using Slopper.Domain;
using Slopper.Infrastructure.Ai;
using Slopper.Infrastructure.Database;
using Slopper.Infrastructure.Ffmpeg;
using Winton.Extensions.Configuration.Consul;

var builder = Host.CreateApplicationBuilder();

builder.Configuration.AddConsul(
    "slopper",
    options =>
    {
        options.ConsulConfigurationOptions = options => options.Address = new(builder.Configuration["Consul:Address"]!);
        options.ConsulHttpClientOptions = client =>
            client.DefaultRequestHeaders.Authorization = new("Basic", builder.Configuration["Consul:BasicAuth"]);
        options.ReloadOnChange = true;
        options.PollWaitTime = TimeSpan.FromSeconds(5);
    }
);

builder.ConfigureOpenTelemetry();

builder.Services.AddClipSelector().AddClipGenerator();

builder.Services.AddJellyfinDatabase().AddSlopperDatabase().AddFfmpegServices().AddAi();

builder.Services.AddOptions<TestOption>().BindConfiguration("");

using var app = builder.Build();

await app.StartAsync();

var options = app.Services.GetRequiredService<IOptionsMonitor<TestOption>>();
var logger = app.Services.GetRequiredService<ILogger<Program>>();
var lifetime = app.Services.GetRequiredService<IHostApplicationLifetime>();

do
{
    logger.LogInformation("Consul: {Description}", options.CurrentValue.ConsulOptionForSlopper);
    await Task.Delay(TimeSpan.FromSeconds(5));
} while (!lifetime.ApplicationStopping.IsCancellationRequested);

class TestOption
{
    public required string ConsulOptionForSlopper { get; set; }
}