import Foundation struct SonarServer: Codable, Identifiable, Hashable { var id = UUID() var name: String var baseURL: String } struct Project: Codable, Identifiable, Hashable { var id: String { key } let key: String let name: String let qualifier: String? let visibility: String? let lastAnalysisDate: String? } struct ProjectsResponse: Codable { let components: [Project] let paging: Paging? } struct Paging: Codable { let pageIndex: Int?; let pageSize: Int?; let total: Int? } struct Measure: Codable, Hashable { let metric: String; let value: String?; let bestValue: Bool? } struct MeasuresComponent: Codable { let key: String; let name: String; let measures: [Measure] } struct MeasuresResponse: Codable { let component: MeasuresComponent } struct QualityGateResponse: Codable { let projectStatus: ProjectStatus } struct ProjectStatus: Codable { let status: String; let conditions: [GateCondition]? } struct GateCondition: Codable, Hashable { let status: String let metricKey: String let comparator: String? let errorThreshold: String? let actualValue: String? } struct Issue: Codable, Identifiable, Hashable { var id: String { key } let key: String let rule: String? let severity: String? let component: String? let project: String? let line: Int? let message: String? let type: String? let status: String? let creationDate: String? let effort: String? } struct IssuesResponse: Codable { let total: Int?; let p: Int?; let ps: Int?; let issues: [Issue] } struct ServerStatusResponse: Codable { let id: String?; let version: String?; let status: String? } struct ProjectSnapshot: Identifiable { var id: String { project.key } let project: Project var measures: [String: String] = [:] var qualityGate: String = "UNKNOWN" } struct TokenGenerateResponse: Codable { let login: String? let name: String? let token: String let createdAt: String? let type: String? } struct CreatedProjectCredentials: Identifiable { let id = UUID() let projectKey: String let projectName: String let tokenName: String let token: String let serverURL: String }