import Vapor struct FileNode: Content { let name: String; let path: String; let isDirectory: Bool; var children: [FileNode]? } struct FileContentResponse: Content { let path: String; let content: String } struct FileSaveRequest: Content { let path: String; let content: String } struct BuildRequest: Content { let projectPath: String; let scheme: String; let destination: String let action: BuildAction; let configuration: String let preBuildHooks: [PreBuildHook]; let bundleIdentifier: String? let extraBuildSettings: [String] } enum BuildAction: String, Codable { case build; case buildAndRun } struct BuildSessionResponse: Content { let sessionId: String; let webSocketURL: String } struct ConnectedDevice: Content { let udid: String; let name: String; let model: String let osVersion: String; let isNetworkConnected: Bool } struct BuildLogMessage: Content { enum MessageType: String, Codable { case stdout, stderr, status } let type: MessageType; let text: String; let exitCode: Int? } struct PreBuildHook: Codable { let name: String; let command: String; let workingDirectory: String let timeoutSeconds: Int; let continueOnFailure: Bool static func xcodeGen(projectRoot: String) -> PreBuildHook { PreBuildHook(name: "XcodeGen", command: "./generate.sh", workingDirectory: projectRoot, timeoutSeconds: 60, continueOnFailure: false) } }