001/*
002 * SPDX-FileCopyrightText: none
003 * SPDX-License-Identifier: CC0-1.0
004 */
005
006package gov.nist.secauto.metaschema.cli.processor.command;
007
008import gov.nist.secauto.metaschema.cli.processor.CLIProcessor.CallingContext;
009
010import org.apache.commons.cli.CommandLine;
011
012import edu.umd.cs.findbugs.annotations.NonNull;
013
014/**
015 * An abstract base class that implements the {@link ICommandExecutor}
016 * interface, providing common functionality for command execution
017 * implementations. Concrete subclasses must implement the {@link #execute()}
018 * method to define specific command behavior.
019 */
020public interface ICommandExecutor {
021  /**
022   * Execute the command operation.
023   *
024   * @throws CommandExecutionException
025   *           if an error occurred while executing the command operation
026   */
027  void execute() throws CommandExecutionException;
028
029  /**
030   * Create a new command executor.
031   *
032   * @param callingContext
033   *          the context of the command execution
034   * @param commandLine
035   *          the parsed command line details
036   * @param function
037   *          a function that accepts a calling context and command line
038   *          information
039   * @return the executor instance
040   */
041  @NonNull
042  static ICommandExecutor using(
043      @NonNull CallingContext callingContext,
044      @NonNull CommandLine commandLine,
045      @NonNull ExecutionFunction function) {
046    return () -> function.execute(callingContext, commandLine);
047  }
048
049  /**
050   * This functional interface represents a method that is used to execute a
051   * command operation.
052   */
053  @FunctionalInterface
054  interface ExecutionFunction {
055    /**
056     * Execute a command operation.
057     *
058     * @param callingContext
059     *          the context of the command execution
060     * @param commandLine
061     *          the parsed command line details
062     * @throws CommandExecutionException
063     *           if an error occurred while executing the command operation
064     */
065    void execute(
066        @NonNull CallingContext callingContext,
067        @NonNull CommandLine commandLine) throws CommandExecutionException;
068  }
069}