1   /*
2    * SPDX-FileCopyrightText: none
3    * SPDX-License-Identifier: CC0-1.0
4    */
5   
6   package dev.metaschema.cli.processor;
7   
8   import java.util.Arrays;
9   import java.util.List;
10  
11  import dev.metaschema.core.util.CollectionUtil;
12  import dev.metaschema.core.util.ObjectUtils;
13  import edu.umd.cs.findbugs.annotations.NonNull;
14  
15  /**
16   * An {@link ExitStatus} implementation with an associated message.
17   * <p>
18   * The message arguments are stored in an unmodifiable list to ensure
19   * thread-safety and immutability.
20   */
21  public class MessageExitStatus
22      extends AbstractExitStatus {
23    private final List<Object> messageArguments;
24  
25    /**
26     * Construct a new {@link ExitStatus} based on an array of message arguments.
27     *
28     * @param code
29     *          the exit code to use.
30     * @param messageArguments
31     *          the arguments that can be passed to a formatted string to generate
32     *          the message
33     */
34    public MessageExitStatus(@NonNull ExitCode code, @NonNull Object... messageArguments) {
35      super(code);
36      this.messageArguments = CollectionUtil.unmodifiableList(
37          ObjectUtils.notNull(Arrays.asList(messageArguments)));
38    }
39  
40    @Override
41    public String getMessage() {
42      String format = lookupMessageForCode(getExitCode());
43      return String.format(format, messageArguments.toArray());
44    }
45  
46    private String lookupMessageForCode(@SuppressWarnings("unused") ExitCode ignoredExitCode) {
47      // TODO: add message bundle support
48      StringBuilder builder = new StringBuilder();
49      // builder.append(getExitCode()).append(":");
50      for (int index = 1; index <= messageArguments.size(); index++) {
51        if (index > 1) {
52          builder.append(' ');
53        }
54        builder.append("%s");
55        // builder.append(index);
56      }
57      return builder.toString();
58    }
59  }