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}