Creando aplicaciones de consola bonitas en .Net con Spectre.Console

En varias oportunidades he tenido que crear aplicaciones de consola que van actualizando la pantalla a medida que va pasando el tiempo o sucede algo, termino teniendo cosas como en la siguiente captura de pantalla

Tratando de mejorar esto, podemos reformatear la informacion y utilizar un Console.Clear(); para repintar la pantalla, lo cual nos da una salida como la siguiente

El problema surge cuando es mucha la informacion que queremos presentar y el armado de la pantalla se vuelve rapidamente muy complicado

Para facilitar este proceso, podemos recurrir a Spectre.Console, que nos permitira crear aplicaciones de consola mucho mas bonitas

Instalacion

Solo es necesario agregar una referencia al paquete NuGet de Spectre.Console.

Uso

Una de las funcionalidades disponibles es el uso de Markup, el cual permite enviar texto enriquecido a la consola, como puede verse en el siguiente ejemplo

        string color;
        switch (loadPercentage)
        {
            case > 80:
                color = "red";
                break;
            case > 30:
                color = "yellow";
                break;
            default:
                color = "green";
                break;
        }

        AnsiConsole.Markup($"CPU usage [{color}]{loadPercentage}[/]%");

Tambien podemos crear widgets como una Table con el siguiente codigo

        // Create a table
        var table = new Table();

        // Add some columns
        table.AddColumn("Sensor");
        table.AddColumn("Value");

        // Add some rows
        table.AddRow("CPU usage", $"[{color}]{loadPercentage}[/]%");

        // Render the table to the console
        AnsiConsole.Render(table);

Otra funcionalidad muy interesante, son los componentes Live que nos permiten modificar solo una parte de la informacion mostrada, sin necesidad de reescribir toda la pantalla.

Vemos en el siguiente codigo como usar un Live-Display con una tabla, y luego usamos el contexto para refrescar la pantalla

AnsiConsole.Live(computerInfo.Table).Start(ctx =>
{
    do
    {
        while (!Console.KeyAvailable)
        {
            computerInfo.GenerateFormattedOutput();
            ctx?.Refresh();
            Thread.Sleep(1000);
        }

    } while (Console.ReadKey(true).Key != ConsoleKey.Escape);
});

Dentro de nuestro metodo GenerateFormattedOutput actualizaremos la tabla de la siguiente manera

Table.UpdateCell(0, 1, $"[{color}]{loadPercentage}[/]%");

Codigo de ejemplo

Pueden acceder a un proyecto en el siguiente repositorio de github, en el cual se encuentra un ejemplo completo de la funcionalidad mostrada en este post

Conclusion

Como pueden ver, es muy sencillo de utilizar, yo aqui solo he mencionado funcionalidad basica, pero en el sitio del proyecto pueden ver todos los casos de uso, y pantallas mostrando gran cantidad de informacion y otros controles