0, self::HIGH => 1, self::WARNING => 2, self::UNKNOWN => 3, self::SAFE => 4, ); $key = (string) $severity; return isset( $order[ $key ] ) ? $order[ $key ] : 99; } /** * Whether $candidate is strictly worse than $current for worst-line tracking. * * @param string|null $candidate Candidate severity. * @param string|null $current Current worst. * @return bool */ public static function is_worse_than( $candidate, $current ) { if ( null === $current ) { return null !== $candidate; } if ( null === $candidate ) { return false; } return self::rank( $candidate ) < self::rank( $current ); } /** * Pick the worse of two known severities. Unknown never upgrades Safe away * from known risk, and never replaces Critical/High/Warning. * * @param string|null $a First. * @param string|null $b Second. * @return string|null */ public static function worst( $a, $b ) { if ( null === $a ) { return $b; } if ( null === $b ) { return $a; } $known_risk = array( self::CRITICAL, self::HIGH, self::WARNING ); $a_risk = in_array( $a, $known_risk, true ); $b_risk = in_array( $b, $known_risk, true ); $known_all = self::priority_order(); $a_known = in_array( $a, $known_all, true ); $b_known = in_array( $b, $known_all, true ); if ( $a_known && $b_known ) { return array_search( $a, $known_all, true ) <= array_search( $b, $known_all, true ) ? $a : $b; } // Known Critical/High/Warning beats Unknown; Unknown beats Safe. if ( $a_risk && self::UNKNOWN === $b ) { return $a; } if ( $b_risk && self::UNKNOWN === $a ) { return $b; } if ( self::SAFE === $a && self::UNKNOWN === $b ) { return self::UNKNOWN; } if ( self::SAFE === $b && self::UNKNOWN === $a ) { return self::UNKNOWN; } if ( self::UNKNOWN === $a || self::UNKNOWN === $b ) { return self::UNKNOWN; } return $a; } /** * Merchant-facing translated label (never rely on ucfirst of the slug). * * @param string|null $severity Severity slug. * @return string */ public static function label( $severity ) { switch ( (string) $severity ) { case self::CRITICAL: return __( 'Critical', 'marginbeacon' ); case self::HIGH: return __( 'High', 'marginbeacon' ); case self::WARNING: return __( 'Warning', 'marginbeacon' ); case self::SAFE: return __( 'Safe', 'marginbeacon' ); case self::UNKNOWN: return __( 'Unknown', 'marginbeacon' ); default: return $severity ? (string) $severity : ''; } } /** * Prevent instantiation. */ private function __construct() {} }