001/*
002 * SPDX-FileCopyrightText: none
003 * SPDX-License-Identifier: CC0-1.0
004 */
005
006package dev.metaschema.cli.processor;
007
008import java.util.Arrays;
009import java.util.List;
010
011import dev.metaschema.core.util.CollectionUtil;
012import dev.metaschema.core.util.ObjectUtils;
013import edu.umd.cs.findbugs.annotations.NonNull;
014
015/**
016 * An {@link ExitStatus} implementation with an associated message.
017 * <p>
018 * The message arguments are stored in an unmodifiable list to ensure
019 * thread-safety and immutability.
020 */
021public class MessageExitStatus
022    extends AbstractExitStatus {
023  private final List<Object> messageArguments;
024
025  /**
026   * Construct a new {@link ExitStatus} based on an array of message arguments.
027   *
028   * @param code
029   *          the exit code to use.
030   * @param messageArguments
031   *          the arguments that can be passed to a formatted string to generate
032   *          the message
033   */
034  public MessageExitStatus(@NonNull ExitCode code, @NonNull Object... messageArguments) {
035    super(code);
036    this.messageArguments = CollectionUtil.unmodifiableList(
037        ObjectUtils.notNull(Arrays.asList(messageArguments)));
038  }
039
040  @Override
041  public String getMessage() {
042    String format = lookupMessageForCode(getExitCode());
043    return String.format(format, messageArguments.toArray());
044  }
045
046  private String lookupMessageForCode(@SuppressWarnings("unused") ExitCode ignoredExitCode) {
047    // TODO: add message bundle support
048    StringBuilder builder = new StringBuilder();
049    // builder.append(getExitCode()).append(":");
050    for (int index = 1; index <= messageArguments.size(); index++) {
051      if (index > 1) {
052        builder.append(' ');
053      }
054      builder.append("%s");
055      // builder.append(index);
056    }
057    return builder.toString();
058  }
059}