array( * 'policies' => array( * array( 'id' => 'burst', 'limit' => 5, 'window' => 1 ), * array( 'id' => 'sustained', 'limit' => 60, 'window' => 60 ), * ), * ), * * Invalid / non-positive entries are silently dropped, same posture * as today's `max_calls_per_hour <= 0` no-op. * * @param array $safety The full safety array. * * @return Policy[] */ public static function from_safety( array $safety ): array { $rl = $safety['rate_limits'] ?? null; if ( ! is_array( $rl ) ) { return array(); } $raw = $rl['policies'] ?? null; if ( ! is_array( $raw ) ) { return array(); } $out = array(); foreach ( $raw as $entry ) { if ( ! is_array( $entry ) ) { continue; } $id = isset( $entry['id'] ) ? (string) $entry['id'] : ''; $limit = isset( $entry['limit'] ) ? (int) $entry['limit'] : 0; $window = isset( $entry['window'] ) ? (int) $entry['window'] : 0; if ( '' === $id || $limit <= 0 || $window <= 0 ) { continue; } $out[] = new self( $id, $limit, $window ); } return $out; } }