2025-06-10 14:16:47 -07:00
|
|
|
//
|
|
|
|
|
// Server.swift
|
|
|
|
|
// QueueCube
|
|
|
|
|
//
|
|
|
|
|
// Created by James Magahern on 6/10/25.
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
import Foundation
|
|
|
|
|
|
2025-06-10 23:10:13 -07:00
|
|
|
struct Server: Identifiable, Codable, Equatable
|
2025-06-10 14:16:47 -07:00
|
|
|
{
|
|
|
|
|
let serviceName: String?
|
|
|
|
|
let baseURL: URL
|
|
|
|
|
|
|
|
|
|
var id: String { baseURL.absoluteString }
|
|
|
|
|
|
2025-06-10 18:45:34 -07:00
|
|
|
var api: API { API(baseURL: baseURL) }
|
|
|
|
|
|
2025-06-10 14:16:47 -07:00
|
|
|
var displayName: String {
|
|
|
|
|
if let serviceName {
|
|
|
|
|
return serviceName.queueCubeServiceName
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let components = URLComponents(url: baseURL, resolvingAgainstBaseURL: false)!
|
|
|
|
|
return components.host ?? baseURL.absoluteString
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
init?(serviceName: String?, host: String, port: UInt16) {
|
|
|
|
|
self.serviceName = serviceName
|
|
|
|
|
|
|
|
|
|
// Assumes this is the local service discovery path, which is http
|
|
|
|
|
// Bounjour gives us the interface sometimes, which we can handle, but need to percent encode.
|
|
|
|
|
let host = host.replacingOccurrences(of: "%", with: "%25")
|
|
|
|
|
guard let url = URL(string: "http://\(host):\(port)/api") else {
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
self.baseURL = url
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
init(baseURL: URL) {
|
|
|
|
|
self.serviceName = nil
|
|
|
|
|
self.baseURL = baseURL
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
extension String
|
|
|
|
|
{
|
|
|
|
|
var queueCubeServiceName: String {
|
|
|
|
|
let regex = /.* \((.*)\)/
|
|
|
|
|
if let match = try? regex.firstMatch(in: self) {
|
|
|
|
|
return String(match.output.1)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return self
|
|
|
|
|
}
|
|
|
|
|
}
|