Files
luma/Sources/LumaCore/Models/Mission/MissionWireCodec.swift
Ole André Vadla Ravnås ef0017255b mission: Drop targets, add discovery tools
The agent finds or creates its own sessions via list_devices,
list_processes, attach_to_process, and spawn_process.
2026-05-09 13:16:45 +02:00

57 lines
1.9 KiB
Swift

import Foundation
extension JSONEncoder {
static let missionWire: JSONEncoder = {
let e = JSONEncoder()
e.dateEncodingStrategy = .iso8601
return e
}()
}
extension JSONDecoder {
static let missionWire: JSONDecoder = {
let d = JSONDecoder()
d.dateDecodingStrategy = .iso8601
return d
}()
}
extension Mission {
public func toWireJSON() -> [String: Any]? { encodeMissionEntity(self) }
public static func fromWireJSON(_ obj: [String: Any]) -> Mission? { decodeMissionEntity(obj) }
}
extension MissionTurn {
public func toWireJSON() -> [String: Any]? { encodeMissionEntity(self) }
public static func fromWireJSON(_ obj: [String: Any]) -> MissionTurn? { decodeMissionEntity(obj) }
}
extension MissionAction {
public func toWireJSON() -> [String: Any]? { encodeMissionEntity(self) }
public static func fromWireJSON(_ obj: [String: Any]) -> MissionAction? { decodeMissionEntity(obj) }
}
extension MissionFinding {
public func toWireJSON() -> [String: Any]? { encodeMissionEntity(self) }
public static func fromWireJSON(_ obj: [String: Any]) -> MissionFinding? { decodeMissionEntity(obj) }
}
extension MissionEvidence {
public func toWireJSON() -> [String: Any]? { encodeMissionEntity(self) }
public static func fromWireJSON(_ obj: [String: Any]) -> MissionEvidence? { decodeMissionEntity(obj) }
}
private func encodeMissionEntity<T: Encodable>(_ value: T) -> [String: Any]? {
guard let data = try? JSONEncoder.missionWire.encode(value),
let obj = try? JSONSerialization.jsonObject(with: data) as? [String: Any]
else { return nil }
return obj
}
private func decodeMissionEntity<T: Decodable>(_ obj: [String: Any]) -> T? {
guard let data = try? JSONSerialization.data(withJSONObject: obj),
let value = try? JSONDecoder.missionWire.decode(T.self, from: data)
else { return nil }
return value
}