using EnvelopeRenderer.Cli.Cli; using EnvelopeRenderer.Cli.Progress; using EnvelopeRenderer.Cli.Render; const string Usage = """ EnvelopeRenderer.Cli --template --csv --output Required: --template Local or UNC path to the XML template. --csv Local or UNC path to the CSV data file. --output Local or UNC path to write the rendered PDF to. Other: -h, --help Show this usage text and exit 0. Exit codes: 0 success, 1 template/CSV/render error, 2 invalid usage, 3 input not found, 4 output path invalid. See CLI_CONTRACT.md for the full contract. """; var result = CliArgumentParser.Parse(args); switch (result.Kind) { case CliOutcomeKind.HelpRequested: Console.Out.WriteLine(Usage); return ExitCodes.Success; case CliOutcomeKind.InvalidUsage: WriteErrors(result.Errors); Console.Error.WriteLine(); Console.Error.WriteLine(Usage); return ExitCodes.InvalidUsage; case CliOutcomeKind.InputNotFound: WriteErrors(result.Errors); return ExitCodes.InputNotFound; case CliOutcomeKind.OutputPathInvalid: WriteErrors(result.Errors); return ExitCodes.OutputPathInvalid; case CliOutcomeKind.Success: return RunRender(result.Arguments!); default: throw new InvalidOperationException($"Unhandled outcome kind: {result.Kind}"); } static int RunRender(CliArguments args) { var progress = ConsoleProgressReporter.CreateDefault(Console.Out); progress.Startup(); var templateResult = TemplateXmlParser.Parse(args.TemplatePath); if (!templateResult.Succeeded) { WriteErrors(templateResult.Errors); progress.Failure(0, string.Join("; ", templateResult.Errors)); return ExitCodes.UnexpectedError; } var csv = new CsvRecordSource(args.CsvPath); IReadOnlyList headers; try { headers = csv.ReadHeaders(); } catch (Exception ex) { var message = $"Failed to read CSV headers from '{args.CsvPath}': {ex.Message}"; Console.Error.WriteLine($"ERROR: {message}"); progress.Failure(0, message); return ExitCodes.UnexpectedError; } var dllPath = Path.Combine( AppContext.BaseDirectory, Environment.Is64BitProcess ? "DebenuPDFLibrary64DLL1013.dll" : "DebenuPDFLibraryDLL1013.dll"); var licenseKey = Environment.GetEnvironmentVariable("DEBENU_LICENSE_KEY"); if (!DebenuPdfRenderer.TryCreate(dllPath, licenseKey, out var renderer, out var createError)) { Console.Error.WriteLine($"ERROR: {createError}"); progress.Failure(0, createError!); return ExitCodes.UnexpectedError; } using (renderer) { var renderResult = RenderEngine.Render( templateResult.Document!, headers, csv.ReadRecords(), renderer!, args.OutputPath, progress); if (!renderResult.Succeeded) { WriteErrors(renderResult.Errors); progress.Failure(renderResult.RecordsRendered, string.Join("; ", renderResult.Errors)); return ExitCodes.UnexpectedError; } progress.Complete(renderResult.RecordsRendered); } return ExitCodes.Success; } static void WriteErrors(IReadOnlyList errors) { foreach (var error in errors) { Console.Error.WriteLine($"ERROR: {error}"); } }