From e73d58ee5dd43eaeaaa717f7781cc22256df30f0 Mon Sep 17 00:00:00 2001 From: Christian Cleberg Date: Tue, 21 Apr 2026 22:54:40 -0500 Subject: feat(v2.4.0): add JSON output, CLI foundation, and shared report layer * introduce DomainReport as canonical output model * add JSON export for single and batch results * create DomainReportBuilder for reusable report construction * add CLI target using shared inspection pipeline * refactor services for UI-independent usage * ensure consistency across TXT, CSV, and JSON outputs --- DomainDig/WatchlistView.swift | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) (limited to 'DomainDig/WatchlistView.swift') diff --git a/DomainDig/WatchlistView.swift b/DomainDig/WatchlistView.swift index 1f03a0d..7e42b53 100644 --- a/DomainDig/WatchlistView.swift +++ b/DomainDig/WatchlistView.swift @@ -143,11 +143,15 @@ struct WatchlistView: View { .disabled(viewModel.batchLookupRunning) Button("Export TXT") { - shareTrackedDomains(asCSV: false) + shareTrackedDomains(format: .text) } Button("Export CSV") { - shareTrackedDomains(asCSV: true) + shareTrackedDomains(format: .csv) + } + + Button("Export JSON") { + shareTrackedDomains(format: .json) } } label: { Image(systemName: "line.3.horizontal.decrease.circle") @@ -178,16 +182,23 @@ struct WatchlistView: View { domains.forEach(viewModel.deleteTrackedDomain) } - private func shareTrackedDomains(asCSV: Bool) { + private func shareTrackedDomains(format: DomainExportFormat) { let formatter = DateFormatter() formatter.dateFormat = "yyyyMMdd_HHmmss" let timestamp = formatter.string(from: Date()) - let fileExtension = asCSV ? "csv" : "txt" - let filename = "\(timestamp)_domaindig_watchlist.\(fileExtension)" - let contents = asCSV - ? viewModel.exportTrackedDomainsCSV(domains: viewModel.filteredTrackedDomains) - : viewModel.exportTrackedDomainsText(domains: viewModel.filteredTrackedDomains) - ExportPresenter.share(filename: filename, contents: contents) + let filename = "\(timestamp)_domaindig_watchlist.\(format.fileExtension)" + let data: Data + + switch format { + case .text: + data = Data(viewModel.exportTrackedDomainsText(domains: viewModel.filteredTrackedDomains).utf8) + case .csv: + data = Data(viewModel.exportTrackedDomainsCSV(domains: viewModel.filteredTrackedDomains).utf8) + case .json: + data = viewModel.exportTrackedDomainsJSONData(domains: viewModel.filteredTrackedDomains) ?? Data("[]".utf8) + } + + ExportPresenter.share(filename: filename, data: data) } } -- cgit v1.2.3