mana-swift-ui/Sources/ManaTransparencyUI/ManaCredit.swift
Till JS 75741ec111 ManaTransparencyUI: geteilter nativer „Danke & Transparenz"-Renderer (P1)
Neues Library-Product — Pendant zur Android-/Web-Fläche (siehe
mana/docs/TRANSPARENZ.md). Pure SwiftUI, app-agnostisch, keine Deps.
- ManaCredit (Codable/Sendable) + ManaTransparencyData.load() für die vom
  Generator erzeugte JSON.
- ManaTransparencyView(intro:entries:) gruppiert nach Sektion, Einträge mit
  Lizenz + tippbarem Link.
swift build + 2 Tests grün.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 20:37:28 +02:00

55 lines
2 KiB
Swift

import Foundation
/// Ein Eintrag der „Danke & Transparenz"-Fläche. Spiegelt das ökosystemweite
/// Schema (mana/docs/transparenz/schema.json) — `Codable`, damit Apps die vom
/// Generator (scripts/transparenz/generate.mjs, Ziel `native`) erzeugte JSON
/// direkt dekodieren und an ``ManaTransparencyView`` reichen können.
public struct ManaCredit: Codable, Identifiable, Sendable, Hashable {
public var id: String { category + "/" + name }
/// upstream · framework · library · font · infra · saas-exception
public let category: String
public let name: String
/// Was es tut / wofür wir es nutzen.
public let description: String?
/// SPDX-Kennung wo möglich.
public let license: String?
public let url: String?
/// Nur bei `saas-exception`: ehrliche Begründung der Ausnahme.
public let why: String?
public init(
category: String,
name: String,
description: String? = nil,
license: String? = nil,
url: String? = nil,
why: String? = nil
) {
self.category = category
self.name = name
self.description = description
self.license = license
self.url = url
self.why = why
}
}
/// Bündel aus Einleitung + Einträgen — entspricht der generierten JSON.
public struct ManaTransparencyData: Codable, Sendable {
public let intro: String
public let entries: [ManaCredit]
public init(intro: String, entries: [ManaCredit]) {
self.intro = intro
self.entries = entries
}
/// Lädt eine gebündelte, vom Generator erzeugte JSON aus einem Bundle.
public static func load(_ resource: String = "transparenz", in bundle: Bundle = .main) -> ManaTransparencyData? {
guard let url = bundle.url(forResource: resource, withExtension: "json"),
let data = try? Data(contentsOf: url),
let decoded = try? JSONDecoder().decode(ManaTransparencyData.self, from: data)
else { return nil }
return decoded
}
}