package dev.projectcapture.contenttools; import java.io.IOException; import java.io.PrintStream; import java.nio.file.Path; public final class ContentTool { private ContentTool() {} public static void main(String[] args) { int exitCode = run(args, System.out, System.err); if (exitCode != 0) { System.exit(exitCode); } } static int run(String[] args, PrintStream out, PrintStream err) { if (args.length != 2) { printUsage(err); return 64; } Path contentRoot = Path.of(args[1]).toAbsolutePath().normalize(); return switch (args[0]) { case "validate" -> validate(contentRoot, out, err); case "digest" -> digest(contentRoot, out, err); default -> { err.println("Unknown command: " + args[0]); printUsage(err); yield 64; } }; } private static int validate(Path contentRoot, PrintStream out, PrintStream err) { ValidationReport report = new ContentValidator().validate(contentRoot); if (!report.isValid()) { err.println("Content validation failed with " + report.issues().size() + " issue(s):"); report.issues().forEach(issue -> err.println("- " + issue)); return 2; } out.println("Content validation passed: " + contentRoot); return 0; } private static int digest(Path contentRoot, PrintStream out, PrintStream err) { ValidationReport report = new ContentValidator().validate(contentRoot); if (!report.isValid()) { err.println("Digest refused because content validation failed:"); report.issues().forEach(issue -> err.println("- " + issue)); return 2; } try { out.println(ContentBundle.load(contentRoot).digest()); return 0; } catch (IOException | RuntimeException exception) { err.println("Could not calculate digest: " + exception.getMessage()); return 2; } } private static void printUsage(PrintStream stream) { stream.println("Usage:"); stream.println(" content-tools validate "); stream.println(" content-tools digest "); } }