import Foundation import SwiftUI import Combine struct SwaggerAPI: Codable { let swagger: String let info: Info let paths: [String: PathItem] struct Info: Codable { let title: String let version: String } struct PathItem: Codable { let summary: String? let description: String? let parameters: [Parameter]? let responses: [String: Response] struct Parameter: Codable { let name: String let info: String let required: Bool let type: String } struct Response: Codable { let description: String } } } class SwaggerAPIService: ObservableObject { @Published var apiData: SwaggerAPI? func fetchAPI() { guard let url = URL(string: "https://git.irohlf.de/swagger/api" ) else { return } URLSession.shared.dataTask(with: url) { data, response, error in guard let data = data, error == nil else { return } DispatchQueue.main.async { do { let decodedData = try JSONDecoder().decode(SwaggerAPI.self, from: data) self.apiData = decodedData } catch { print("Error decoding data: \(error)") } } }.resume() } } struct SwaggerContentView: View { @StateObject private var apiService = SwaggerAPIService() var body: some View { NavigationView { List { if let api = apiService.apiData { Section(header: Text("API Info")) { Text("Title: \(api.info.title)") Text("Version: \(api.info.version)") } Section(header: Text("Paths")) { ForEach(api.paths.keys.sorted(), id: \.self) { path in if let pathItem = api.paths[path] { VStack(alignment: .leading) { Text(path) .font(.headline) Text(pathItem.summary ?? "No summary available") .font(.subheadline) } } } } } else { Text("Loading...") .onAppear { apiService.fetchAPI() } } } .navigationTitle("Swagger API") } } } #Preview { SwaggerContentView() }