*/ public static function all(): array { return [ self::ProviderConnectionMissing, self::ProviderConnectionInvalid, self::ProviderCredentialMissing, self::ProviderCredentialInvalid, self::ProviderConnectionTypeInvalid, self::PlatformIdentityMissing, self::PlatformIdentityIncomplete, self::DedicatedCredentialMissing, self::DedicatedCredentialInvalid, self::ProviderConsentMissing, self::ProviderConsentFailed, self::ProviderConsentRevoked, self::ProviderConnectionReviewRequired, self::ProviderAuthFailed, self::ProviderPermissionMissing, self::ProviderPermissionDenied, self::ProviderPermissionRefreshFailed, self::IntuneRbacPermissionMissing, self::TenantTargetMismatch, self::NetworkUnreachable, self::RateLimited, self::UnknownError, self::IntuneRbacNotConfigured, self::IntuneRbacUnhealthy, self::IntuneRbacStale, ]; } public static function isKnown(string $reasonCode): bool { return in_array($reasonCode, self::all(), true) || str_starts_with($reasonCode, 'ext.'); } public static function registryKey(): string { return 'provider_reason_codes'; } /** * @return list */ public static function canonicalNouns(): array { return ['reason_code']; } public static function ownerLayer(string $reasonCode): string { return PlatformVocabularyGlossary::OWNER_PROVIDER_OWNED; } public static function boundaryClassification(string $reasonCode): string { return PlatformVocabularyGlossary::BOUNDARY_INTUNE_SPECIFIC; } public static function ownerNamespace(string $reasonCode): string { return str_starts_with($reasonCode, 'intune_rbac.') ? 'provider.intune_rbac' : 'provider.microsoft_graph'; } public static function platformReasonFamily(string $reasonCode): PlatformReasonFamily { return match ($reasonCode) { self::ProviderPermissionMissing, self::ProviderPermissionDenied, self::IntuneRbacPermissionMissing => PlatformReasonFamily::Authorization, self::NetworkUnreachable, self::RateLimited, self::ProviderPermissionRefreshFailed, self::ProviderAuthFailed => PlatformReasonFamily::Availability, self::ProviderConnectionTypeInvalid, self::TenantTargetMismatch, self::ProviderConnectionReviewRequired => PlatformReasonFamily::Compatibility, default => PlatformReasonFamily::Prerequisite, }; } public static function ownershipDescriptor(string $reasonCode): ?ReasonOwnershipDescriptor { if (! self::isKnown($reasonCode)) { return null; } return new ReasonOwnershipDescriptor( ownerLayer: self::ownerLayer($reasonCode), ownerNamespace: self::ownerNamespace($reasonCode), reasonCode: $reasonCode, platformReasonFamily: self::platformReasonFamily($reasonCode), ); } }