Schulung_iOS/SwaggerView.swift
2025-10-24 14:35:06 +02:00

98 lines
2.6 KiB
Swift

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()
}