しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

C# で Interactive な Prompt を構築するライブラリを作った

Go や Node.js 向けは見つけられたのですが、C# / .NET Core 向けは探しても見つからなかったので作りました。.NET Standard 2.0 なので .NET Core / .NET Framework の両方で動くはずです。

CoreFx の Console ベースで書いていて、Windows / Linux / macOS で動くことを確認しました。

Windows 以外だとパフォーマンスが悪いですが、恐らく .NET Core 3.0 で改善されるはずです。

提供しているクラスは Prompt だけなので、ちょいちょいとメソッドを呼び出せば動くようになります。詳細は GitHub の README を読んでもらえれば大体は分かると思います。

class Program
{
    static void Main(string[] args)
    {
        var name = Prompt.Input<string>("名前", validators: new[] { Validators.Required() });

        Console.WriteLine($"こんにちは, {name}");

        var age = Prompt.Input<int>("年齢");

        Console.WriteLine($"年齢: {age}");

        var prefecture = Prompt.Select("都道府県", PrefectureList, pageSize: 5);

        Console.WriteLine($"都道府県: {prefecture}");
    }
}

現在は最低限必要そうなメソッドだけ実装してあって、その中でも主に使うのは InputSelect です。

サンプルコードを実行すると、以下のようなアプリケーションが出来上がります。

上のように Select での表示件数が多い場合は ←→ でページの切り替えが出来ます。

入力値の検証を行う仕組みも実装してあるので、不正な値が入力された場合には独自のエラーメッセージを出せますが、設計を洗練させたい部分ではあります。

対話型で入力出来た方が便利なケースも多そうなので、メソッドはもう少し追加する予定です。

.NET Global Tool で利用する

Node.js と同じように .NET Core でも .NET Global Tool を使えば CLI なツールを簡単に配布と利用出来るので、このライブラリではその方向での活用も考えていました。

ドキュメントに従って適当なプロジェクトを作成して、NuGet パッケージを追加すれば使えます。

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp2.2</TargetFramework>
    <PackAsTool>true</PackAsTool>
    <ToolCommandName>promptest</ToolCommandName>
    <PackageOutputPath>./nupkg</PackageOutputPath>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Sharprompt" Version="1.0.1" />
  </ItemGroup>

</Project>

.NET Global Tool は開発とインストールが簡単なので、サクッと使えるのは便利です。

先ほどのサンプルコードをそのまま .NET Global Tool としてインストールして、動作を確認しておきました。

良くある npm init のようなテンプレートからファイルを作成する場合に使えると思います。

思ったよりもコンソールの操作は難しかったですが、動くところまで実装出来たので満足しています。