Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

114 řádky
3.4KB

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

Powered by TurnKey Linux.