📄 Program.cs
using System.Threading;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using MSearch.Domain;
using MSearch.SearchProviders.GitHub;
using MSearch.SearchProviders.HackerNews;
using MSearch.SearchProviders.MicrosoftLearn;
using MSearch.SearchProviders.MozillaDeveloperNetwork;
using MSearch.SearchProviders.OpenStreetMap;
using MSearch.SearchProviders.Reddit;
using MSearch.SearchProviders.Spotify;
using MSearch.SearchProviders.StackExchange;
using MSearch.SearchProviders.TheMovieDb;
using MSearch.SearchProviders.Wikipedia;
using MSearch.SearchProviders.YouTube;

var builder = Host.CreateApplicationBuilder(args);

builder.Configuration.AddUserSecrets<Program>();

builder
    .Services.AddSearchService()
    .AddGitHubSearchProvider()
    .AddHackerNewsSearchProvider()
    .AddMicrosoftLearnSearchProvider()
    .AddMozillaDeveloperNetworkSearchProvider()
    .AddOpenStreetMapSearchProvider()
    .AddRedditSearchProvider()
    .AddSpotifySearchProvider()
    .AddStackExchangeSearchProvider("stackoverflow")
    .AddTheMovieDbSearchProvider()
    .AddWikipediaSearchProvider("en")
    .AddYouTubeSearchProvider();

using var app = builder.Build();

await app.StartAsync();

var logger = app.Services.GetRequiredService<ILogger<Program>>();
var searchService = app.Services.GetRequiredService<SearchService>();

await foreach (var result in searchService.Search(args[0], CancellationToken.None))
{
    logger.LogInformation("{Title}: {Url}\n{Summary}", result.Title, result.Url, result.Summary);
}

await app.StopAsync();