// 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 Target = new("--target") { DefaultValueFactory = _ => OutputTarget.StdOut }; private static readonly Option Buffer = new("--buffer") { DefaultValueFactory = _ => 81920 }; public LengthCommand() : base("length") { Add(Target); Add(Buffer); SetAction(ExecuteAsync); } public async Task ExecuteAsync(ParseResult result, CancellationToken cancellationToken) { using var output = Output.Connect(); using var buffer = MemoryPool.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; } }