From bb18197860ffdb491f010648ec903003b6e1bb65 Mon Sep 17 00:00:00 2001 From: Christian Cleberg Date: Mon, 20 Jul 2026 16:22:28 -0500 Subject: v4.8.3: Clear SonarCloud new-code issues MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes the 4 reported bugs and ~97 code smells flagged in the new-code period. No behavior changes. Bugs (swift:S3923) — DomainInspectionService's confidenceFor* helpers each returned `error == nil ? .low : .low`, an inert conditional. Simplified to `return .low` and dropped the now-unused `error` parameter. Smells: - Merged 14 identical `.empty`/`.error` switch branches in DomainViewModel - Consolidated duplicate implementations (clearPresentedResults/reset, String.nonEmpty/nilIfEmpty, ExportFormat.id/fileExtension) - Extracted nested ternaries into TLSGrade.tone, EmailSecurityGrade.tone, and ChangeImpactClassification.color; removed ContentView.impactColor and the duplicate mapping in BatchResultsView - Documented empty closures and singleton inits - Marked unused protocol-conformance parameters `_` - Renamed CloudSyncTrigger.`import` to `imported` (raw value preserved) and SSLSessionDelegate's _serverTrust/_tlsMetadata - Merged nested ifs in the DER parser; flattened closure nesting in PortScanService and IntegrationService - Replaced two-case switches with if/else Left open: S107 (init parameter counts), S115 (constants mirroring DoH and ipapi JSON keys), S1075 (false positives on https:// literals), and two S117 hits on SwiftUI $binding shorthand. These want a Won't Fix resolution in SonarCloud, not a code change. --- DomainDig/DomainViewModel.swift | 98 +++++++---------------------------------- 1 file changed, 17 insertions(+), 81 deletions(-) (limited to 'DomainDig/DomainViewModel.swift') diff --git a/DomainDig/DomainViewModel.swift b/DomainDig/DomainViewModel.swift index 674efdf..256c1e1 100644 --- a/DomainDig/DomainViewModel.swift +++ b/DomainDig/DomainViewModel.swift @@ -1280,19 +1280,7 @@ final class DomainViewModel { } func clearPresentedResults() { - lookupTask?.cancel() - customPortScanTask?.cancel() - batchTask?.cancel() - hasRun = false - searchedDomain = "" - lastLookupDurationMs = nil - currentDiffSections = [] - currentChangeSummary = nil - ownershipDiff = [] - currentReport = nil - refreshingTrackedDomainID = nil - clearBatchState() - clearLookupState() + reset() } func run() { @@ -1857,7 +1845,7 @@ final class DomainViewModel { portabilityStatusMessage = result.summary CloudSyncService.shared.markAppSettingsChanged() CloudSyncService.shared.markMonitoringSettingsChanged(localActivationConfirmed: monitoringSettings.isEnabled) - CloudSyncService.shared.scheduleSyncIfNeeded(trigger: .import) + CloudSyncService.shared.scheduleSyncIfNeeded(trigger: .imported) return result } @@ -2174,10 +2162,7 @@ final class DomainViewModel { case let .success(sections): dnsSections = sections dnsError = nil - case let .empty(message): - dnsSections = [] - dnsError = message - case let .error(message): + case let .empty(message), let .error(message): dnsSections = [] dnsError = message } @@ -2199,10 +2184,7 @@ final class DomainViewModel { case let .success(info): sslInfo = info sslError = nil - case let .empty(message): - sslInfo = nil - sslError = message - case let .error(message): + case let .empty(message), let .error(message): sslInfo = nil sslError = message } @@ -2228,15 +2210,7 @@ final class DomainViewModel { httpProtocol = headersResult.httpProtocol http3Advertised = headersResult.http3Advertised httpHeadersError = nil - case let .empty(message): - httpHeaders = [] - httpSecurityGrade = nil - httpStatusCode = nil - httpResponseTimeMs = nil - httpProtocol = nil - http3Advertised = false - httpHeadersError = message - case let .error(message): + case let .empty(message), let .error(message): httpHeaders = [] httpSecurityGrade = nil httpStatusCode = nil @@ -2255,10 +2229,7 @@ final class DomainViewModel { case let .success(results): reachabilityResults = results reachabilityError = nil - case let .empty(message): - reachabilityResults = [] - reachabilityError = message - case let .error(message): + case let .empty(message), let .error(message): reachabilityResults = [] reachabilityError = message } @@ -2272,10 +2243,7 @@ final class DomainViewModel { case let .success(emailResult): emailSecurity = emailResult emailSecurityError = nil - case let .empty(message): - emailSecurity = nil - emailSecurityError = message - case let .error(message): + case let .empty(message), let .error(message): emailSecurity = nil emailSecurityError = message } @@ -2289,10 +2257,7 @@ final class DomainViewModel { case let .success(ownership): ownershipResult = ownership ownershipError = nil - case let .empty(message): - ownershipResult = nil - ownershipError = message - case let .error(message): + case let .empty(message), let .error(message): ownershipResult = nil ownershipError = message } @@ -2306,10 +2271,7 @@ final class DomainViewModel { case let .success(record): ptrRecord = record ptrError = nil - case let .empty(message): - ptrRecord = nil - ptrError = message - case let .error(message): + case let .empty(message), let .error(message): ptrRecord = nil ptrError = message } @@ -2323,10 +2285,7 @@ final class DomainViewModel { case let .success(hops): redirectChain = hops redirectChainError = nil - case let .empty(message): - redirectChain = [] - redirectChainError = message - case let .error(message): + case let .empty(message), let .error(message): redirectChain = [] redirectChainError = message } @@ -2340,10 +2299,7 @@ final class DomainViewModel { case let .success(results): subdomains = results subdomainsError = nil - case let .empty(message): - subdomains = [] - subdomainsError = message - case let .error(message): + case let .empty(message), let .error(message): subdomains = [] subdomainsError = message } @@ -2358,11 +2314,7 @@ final class DomainViewModel { guard !Task.isCancelled, isCurrentLookup(lookupID) else { return } portScanResults = enrichedResults portScanError = nil - case let .empty(message): - guard !Task.isCancelled, isCurrentLookup(lookupID) else { return } - portScanResults = [] - portScanError = message - case let .error(message): + case let .empty(message), let .error(message): guard !Task.isCancelled, isCurrentLookup(lookupID) else { return } portScanResults = [] portScanError = message @@ -2377,10 +2329,7 @@ final class DomainViewModel { case let .success(geolocation): ipGeolocation = geolocation ipGeolocationError = nil - case let .empty(message): - ipGeolocation = nil - ipGeolocationError = message - case let .error(message): + case let .empty(message), let .error(message): ipGeolocation = nil ipGeolocationError = message } @@ -2408,10 +2357,7 @@ final class DomainViewModel { customPortResults = results customPortScanError = nil _ = saveHistoryEntry(replaceLatest: true) - case let .empty(message): - customPortResults = [] - customPortScanError = message - case let .error(message): + case let .empty(message), let .error(message): customPortResults = [] customPortScanError = message } @@ -4024,7 +3970,7 @@ final class DomainViewModel { static func summaryFields(from snapshot: LookupSnapshot) -> [SummaryFieldViewData] { [ - SummaryFieldViewData(label: "Domain", value: snapshot.domain.nonEmpty ?? "Unavailable", tone: .primary), + SummaryFieldViewData(label: "Domain", value: snapshot.domain.nilIfEmpty ?? "Unavailable", tone: .primary), SummaryFieldViewData(label: "Observed IP", value: primaryIPAddress(from: snapshot) ?? "Unavailable", tone: .primary), SummaryFieldViewData(label: "Observed Redirect", value: finalRedirectTarget(from: snapshot) ?? "Unavailable", tone: .secondary), SummaryFieldViewData(label: "Inference", value: availabilityInference(from: snapshot), tone: availabilityTone(snapshot.availabilityResult?.status)), @@ -4780,10 +4726,7 @@ final class DomainViewModel { case let .success(pricing): domainPricing = pricing domainPricingError = nil - case let .empty(message): - domainPricing = nil - domainPricingError = conciseExternalMessage(message, fallback: "External pricing unavailable") - case let .error(message): + case let .empty(message), let .error(message): domainPricing = nil domainPricingError = conciseExternalMessage(message, fallback: "External pricing unavailable") } @@ -4803,10 +4746,7 @@ final class DomainViewModel { case let .success(result): reputation = result reputationError = nil - case let .empty(message): - reputation = nil - reputationError = conciseExternalMessage(message, fallback: "Reputation check unavailable") - case let .error(message): + case let .empty(message), let .error(message): reputation = nil reputationError = conciseExternalMessage(message, fallback: "Reputation check unavailable") } @@ -4865,10 +4805,6 @@ final class DomainViewModel { } private extension String { - var nonEmpty: String? { - isEmpty ? nil : self - } - var nilIfEmpty: String? { isEmpty ? nil : self } -- cgit v1.2.3