|
- using EnvelopeRenderer.Cli.Cli;
- using EnvelopeRenderer.Cli.Progress;
- using EnvelopeRenderer.Cli.Render;
-
- const string Usage = """
- EnvelopeRenderer.Cli --template <path> --csv <path> --output <path>
-
- Required:
- --template <path> Local or UNC path to the XML template.
- --csv <path> Local or UNC path to the CSV data file.
- --output <path> 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<string> 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<string> errors)
- {
- foreach (var error in errors)
- {
- Console.Error.WriteLine($"ERROR: {error}");
- }
- }
|