/**
* Shared severity sorting utilities (STYLE.md Section 12).
*
* Provides a generic severity-first sort function used by container,
* compose, and host formatters.
*/
/**
* Predefined severity orders for container states.
* Lower values appear first (most critical).
*/
export const CONTAINER_SEVERITY: Record<string, number> = {
exited: 0,
dead: 1,
stopped: 2,
paused: 3,
restarting: 4,
running: 5,
};
/**
* Predefined severity orders for compose project statuses.
* Lower values appear first (most critical).
*/
export const COMPOSE_PROJECT_SEVERITY: Record<string, number> = {
partial: 0,
running: 1,
stopped: 2,
};
/**
* Predefined severity orders for compose service statuses.
* Lower values appear first (most critical).
*/
export const COMPOSE_SERVICE_SEVERITY: Record<string, number> = {
stopped: 0,
running: 1,
};
/**
* Sort items by severity, with lowest severity value appearing first.
* Items with unknown states are placed at the end.
*
* @param items - Array to sort (not mutated)
* @param getState - Function to extract the state/status string from an item
* @param severityOrder - Map of state strings to numeric severity (lower = more critical)
* @param getSecondaryKey - Optional function for tiebreaking (typically name); uses localeCompare
* @returns New sorted array
*/
export function sortBySeverity<T>(
items: readonly T[],
getState: (item: T) => string,
severityOrder: Record<string, number>,
getSecondaryKey?: (item: T) => string
): T[] {
return [...items].sort((a, b) => {
const aSeverity = severityOrder[getState(a)] ?? 999;
const bSeverity = severityOrder[getState(b)] ?? 999;
if (aSeverity !== bSeverity) return aSeverity - bSeverity;
if (getSecondaryKey) return getSecondaryKey(a).localeCompare(getSecondaryKey(b));
return 0;
});
}