You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

115 lines
3.4KB

  1. using EnvelopeRenderer.Cli;
  2. using EnvelopeRenderer.Cli.Cli;
  3. using EnvelopeRenderer.Cli.Progress;
  4. using EnvelopeRenderer.Cli.Render;
  5. const string Usage = """
  6. EnvelopeRenderer.Cli --template <path> --csv <path> --output <path>
  7. Required:
  8. --template <path> Local or UNC path to the XML template.
  9. --csv <path> Local or UNC path to the CSV data file.
  10. --output <path> Local or UNC path to write the rendered PDF to.
  11. Other:
  12. -h, --help Show this usage text and exit 0.
  13. Exit codes: 0 success, 1 template/CSV/render error, 2 invalid usage,
  14. 3 input not found, 4 output path invalid.
  15. See CLI_CONTRACT.md for the full contract.
  16. """;
  17. var result = CliArgumentParser.Parse(args);
  18. switch (result.Kind)
  19. {
  20. case CliOutcomeKind.HelpRequested:
  21. Console.Out.WriteLine(Usage);
  22. return ExitCodes.Success;
  23. case CliOutcomeKind.InvalidUsage:
  24. WriteErrors(result.Errors);
  25. Console.Error.WriteLine();
  26. Console.Error.WriteLine(Usage);
  27. return ExitCodes.InvalidUsage;
  28. case CliOutcomeKind.InputNotFound:
  29. WriteErrors(result.Errors);
  30. return ExitCodes.InputNotFound;
  31. case CliOutcomeKind.OutputPathInvalid:
  32. WriteErrors(result.Errors);
  33. return ExitCodes.OutputPathInvalid;
  34. case CliOutcomeKind.Success:
  35. return RunRender(result.Arguments!);
  36. default:
  37. throw new InvalidOperationException($"Unhandled outcome kind: {result.Kind}");
  38. }
  39. static int RunRender(CliArguments args)
  40. {
  41. var progress = ConsoleProgressReporter.CreateDefault(Console.Out);
  42. progress.Startup();
  43. var templateResult = TemplateXmlParser.Parse(args.TemplatePath);
  44. if (!templateResult.Succeeded)
  45. {
  46. WriteErrors(templateResult.Errors);
  47. progress.Failure(0, string.Join("; ", templateResult.Errors));
  48. return ExitCodes.UnexpectedError;
  49. }
  50. var csv = new CsvRecordSource(args.CsvPath);
  51. IReadOnlyList<string> headers;
  52. try
  53. {
  54. headers = csv.ReadHeaders();
  55. }
  56. catch (Exception ex)
  57. {
  58. var message = $"Failed to read CSV headers from '{args.CsvPath}': {ex.Message}";
  59. Console.Error.WriteLine($"ERROR: {message}");
  60. progress.Failure(0, message);
  61. return ExitCodes.UnexpectedError;
  62. }
  63. var dllPath = Path.Combine(
  64. AppContext.BaseDirectory,
  65. Environment.Is64BitProcess ? "DebenuPDFLibrary64DLL1013.dll" : "DebenuPDFLibraryDLL1013.dll");
  66. var licenseKey = DebenuLicenseKeyResolver.Resolve(AppContext.BaseDirectory);
  67. if (!DebenuPdfRenderer.TryCreate(dllPath, licenseKey, out var renderer, out var createError))
  68. {
  69. Console.Error.WriteLine($"ERROR: {createError}");
  70. progress.Failure(0, createError!);
  71. return ExitCodes.UnexpectedError;
  72. }
  73. using (renderer)
  74. {
  75. var renderResult = RenderEngine.Render(
  76. templateResult.Document!, headers, csv.ReadRecords(), renderer!, args.OutputPath, progress);
  77. if (!renderResult.Succeeded)
  78. {
  79. WriteErrors(renderResult.Errors);
  80. progress.Failure(renderResult.RecordsRendered, string.Join("; ", renderResult.Errors));
  81. return ExitCodes.UnexpectedError;
  82. }
  83. progress.Complete(renderResult.RecordsRendered);
  84. }
  85. return ExitCodes.Success;
  86. }
  87. static void WriteErrors(IReadOnlyList<string> errors)
  88. {
  89. foreach (var error in errors)
  90. {
  91. Console.Error.WriteLine($"ERROR: {error}");
  92. }
  93. }

Powered by TurnKey Linux.