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>
55 lines
2 KiB
Swift
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
|
|
}
|
|
}
|