/// <summary>
/// エントリーポイント
/// </summary>
/// <param name="path">ファイルへのパス。なし、もしくは`-`の場合はSTDINから読み込む</param>
/// <param name="decode">trueのときデコード動作をする</param>
/// <param name="inputEncoding">入力ストリームのエンコーディング</param>
/// <param name="outputEncoding">出力ストリームのエンコーディング</param>
/// <returns>ステータスコード</returns>
public int Run(
[Option(0, "FILE")] string path = "-",
[Option("d", "decode")] bool decode = false,
[Option("f", "input encoding")] StreamEncoding inputEncoding = StreamEncoding.system,
[Option("t", "output encoding")] StreamEncoding outputEncoding = StreamEncoding.system
)
{
var iEncoding = GetEncoding(inputEncoding);
var oEncoding = GetEncoding(outputEncoding);
using var oStream = new StreamWriter(Console.OpenStandardOutput(), oEncoding);
using var stream = GetStream(path);
if (decode)
{
try {
var decoder = new Wbase59Decoder(stream, iEncoding);
oStream.Write(oEncoding.GetString(decoder.Decode().ToArray()));
}
catch (InvalidNabeFormatException e) {
LogError("ナベストリーム解析中にエラーが発生しました");
LogError(e.Message);
return(1);
}
catch (InvalidNabeIvsException e) {
LogError("不正なIvsです");
LogError(e.Message);
return(1);
}
catch (ParityNabeCheckFailedException e) {
LogError(e.Message);
return(1);
}
catch (Exception e) {
LogError(e);
return(1);
}
}
else
{
try {
var encoder = new Wbase59Encoder(stream, iEncoding);
foreach (var nabe in encoder.Encode())
{
oStream.Write(new UnicodeEncoding(true, false).GetString(nabe.GetSpan()));
}
oStream.Flush();
}
catch (InvalidNabeFormatException e) {
LogError(e);
return(1);
}
}
return(0);
}