001// SPDX-FileCopyrightText: 2021 Paul Schaub <vanitasvitae@fsfe.org> 002// 003// SPDX-License-Identifier: Apache-2.0 004 005package sop.cli.picocli; 006 007import picocli.CommandLine; 008import sop.SOP; 009import sop.cli.picocli.commands.ArmorCmd; 010import sop.cli.picocli.commands.DearmorCmd; 011import sop.cli.picocli.commands.DecryptCmd; 012import sop.cli.picocli.commands.DetachInbandSignatureAndMessageCmd; 013import sop.cli.picocli.commands.EncryptCmd; 014import sop.cli.picocli.commands.ExtractCertCmd; 015import sop.cli.picocli.commands.GenerateKeyCmd; 016import sop.cli.picocli.commands.SignCmd; 017import sop.cli.picocli.commands.VerifyCmd; 018import sop.cli.picocli.commands.VersionCmd; 019 020@CommandLine.Command( 021 exitCodeOnInvalidInput = 69, 022 subcommands = { 023 CommandLine.HelpCommand.class, 024 ArmorCmd.class, 025 DearmorCmd.class, 026 DecryptCmd.class, 027 DetachInbandSignatureAndMessageCmd.class, 028 EncryptCmd.class, 029 ExtractCertCmd.class, 030 GenerateKeyCmd.class, 031 SignCmd.class, 032 VerifyCmd.class, 033 VersionCmd.class 034 } 035) 036public class SopCLI { 037 // Singleton 038 static SOP SOP_INSTANCE; 039 040 public static String EXECUTABLE_NAME = "sop"; 041 042 public static void main(String[] args) { 043 int exitCode = execute(args); 044 if (exitCode != 0) { 045 System.exit(exitCode); 046 } 047 } 048 049 public static int execute(String[] args) { 050 return new CommandLine(SopCLI.class) 051 .setCommandName(EXECUTABLE_NAME) 052 .setExecutionExceptionHandler(new SOPExecutionExceptionHandler()) 053 .setExitCodeExceptionMapper(new SOPExceptionExitCodeMapper()) 054 .setCaseInsensitiveEnumValuesAllowed(true) 055 .execute(args); 056 } 057 058 public static SOP getSop() { 059 if (SOP_INSTANCE == null) { 060 throw new IllegalStateException("No SOP backend set."); 061 } 062 return SOP_INSTANCE; 063 } 064 065 public static void setSopInstance(SOP instance) { 066 SOP_INSTANCE = instance; 067 } 068}