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}