45 lines
No EOL
1.1 KiB
C#
45 lines
No EOL
1.1 KiB
C#
// Copyright (c) The Geekeey Authors
|
|
// SPDX-License-Identifier: EUPL-1.2
|
|
|
|
using System.Buffers;
|
|
using System.CommandLine;
|
|
using System.Globalization;
|
|
|
|
internal sealed class LengthCommand : Command
|
|
{
|
|
private static readonly Option<OutputTarget> Target = new("--target") { DefaultValueFactory = _ => OutputTarget.StdOut };
|
|
private static readonly Option<int> Buffer = new("--buffer") { DefaultValueFactory = _ => 81920 };
|
|
|
|
public LengthCommand() : base("length")
|
|
{
|
|
Add(Target);
|
|
Add(Buffer);
|
|
SetAction(ExecuteAsync);
|
|
}
|
|
|
|
public async Task<int> ExecuteAsync(ParseResult result, CancellationToken cancellationToken)
|
|
{
|
|
using var output = Output.Connect();
|
|
|
|
using var buffer = MemoryPool<byte>.Shared.Rent(result.GetRequiredValue(Buffer));
|
|
|
|
var count = 0L;
|
|
while (true)
|
|
{
|
|
var bytesRead = await output.Stdin.BaseStream.ReadAsync(buffer.Memory, cancellationToken);
|
|
if (bytesRead <= 0)
|
|
{
|
|
break;
|
|
}
|
|
|
|
count += bytesRead;
|
|
}
|
|
|
|
foreach (var writer in output.GetWriters(result.GetRequiredValue(Target)))
|
|
{
|
|
await writer.WriteLineAsync(count.ToString(CultureInfo.InvariantCulture));
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
} |