156 lines
5.8 KiB
Swift
156 lines
5.8 KiB
Swift
|
|
// Swift-idiomatic mirrors of the voicecat.h C enums. Keep these in lockstep with
|
||
|
|
// core/include/voicecat.h — values are append-only per the C ABI's house rule, so it's
|
||
|
|
// safe to add new cases at the end here too, but never renumber/remove existing ones.
|
||
|
|
//
|
||
|
|
// Swift imports the C enums directly via `import VoiceCatC` (e.g. VoiceCatC.VC_OK), but
|
||
|
|
// those case names are C-style (VC_ERR_NOT_IMPLEMENTED, VC_EVENT_SERVER_IDENTITY) — these
|
||
|
|
// mirrors give the Swift UI and tests clean dot-syntax (VoiceCatResult.notImplemented,
|
||
|
|
// VoiceCatEventType.serverIdentity) and a typed bridge to/from the C values.
|
||
|
|
//
|
||
|
|
// NOTE: Swift's Clang importer brings C `typedef enum` types in as UInt32-backed enums
|
||
|
|
// (all our C enum values are non-negative), so these mirrors use UInt32 raw values too.
|
||
|
|
// The one signed field in the ABI — `vc_event.result` is `int32_t` (not `vc_result`) — is
|
||
|
|
// bridged via `UInt32(bitPattern:)` in Event.swift.
|
||
|
|
|
||
|
|
import VoiceCatC
|
||
|
|
|
||
|
|
/// Result codes — mirrors `vc_result` (voicecat.h). Additive-only: new values go at the end.
|
||
|
|
public enum VoiceCatResult: UInt32, Sendable, Equatable {
|
||
|
|
case ok = 0
|
||
|
|
case notImplemented = 1
|
||
|
|
case invalidArg = 2
|
||
|
|
case notConnected = 3
|
||
|
|
case already = 4
|
||
|
|
case authFailed = 5
|
||
|
|
case permissionDenied = 6
|
||
|
|
case timeout = 7
|
||
|
|
case io = 8
|
||
|
|
case protocolError = 9
|
||
|
|
case crypto = 10
|
||
|
|
case audio = 11
|
||
|
|
case internalError = 12
|
||
|
|
|
||
|
|
/// Human-readable description from the core (vc_result_string returns a static literal).
|
||
|
|
public var description: String {
|
||
|
|
String(cString: vc_result_string(vc_result(rawValue)))
|
||
|
|
}
|
||
|
|
|
||
|
|
/// Bridge from the C enum.
|
||
|
|
public init(_ cValue: vc_result) { self = VoiceCatResult(rawValue: cValue.rawValue) ?? .internalError }
|
||
|
|
/// Bridge to the C enum.
|
||
|
|
public var cValue: vc_result { vc_result(rawValue) }
|
||
|
|
}
|
||
|
|
|
||
|
|
/// Log level — mirrors `vc_log_level`.
|
||
|
|
public enum VoiceCatLogLevel: UInt32, Sendable, Equatable {
|
||
|
|
case trace = 0
|
||
|
|
case debug = 1
|
||
|
|
case info = 2
|
||
|
|
case warn = 3
|
||
|
|
case error = 4
|
||
|
|
case off = 5
|
||
|
|
|
||
|
|
public init(_ cValue: vc_log_level) { self = VoiceCatLogLevel(rawValue: cValue.rawValue) ?? .info }
|
||
|
|
public var cValue: vc_log_level { vc_log_level(rawValue) }
|
||
|
|
}
|
||
|
|
|
||
|
|
/// Connection state — mirrors `vc_connection_state`.
|
||
|
|
public enum VoiceCatConnectionState: UInt32, Sendable, Equatable {
|
||
|
|
case disconnected = 0
|
||
|
|
case connecting = 1
|
||
|
|
case tlsHandshake = 2
|
||
|
|
case authenticating = 3
|
||
|
|
case connected = 4
|
||
|
|
/// M4: handshake succeeded, waiting on `confirmServerIdentity()`.
|
||
|
|
case verifyingIdentity = 5
|
||
|
|
|
||
|
|
public init(_ cValue: vc_connection_state) {
|
||
|
|
self = VoiceCatConnectionState(rawValue: cValue.rawValue) ?? .disconnected
|
||
|
|
}
|
||
|
|
public var cValue: vc_connection_state { vc_connection_state(rawValue) }
|
||
|
|
}
|
||
|
|
|
||
|
|
/// Text message scope — mirrors `vc_text_scope`.
|
||
|
|
public enum VoiceCatTextScope: UInt32, Sendable, Equatable {
|
||
|
|
case channel = 0
|
||
|
|
case `private` = 1
|
||
|
|
case server = 2
|
||
|
|
|
||
|
|
public init(_ cValue: vc_text_scope) { self = VoiceCatTextScope(rawValue: cValue.rawValue) ?? .channel }
|
||
|
|
public var cValue: vc_text_scope { vc_text_scope(rawValue) }
|
||
|
|
}
|
||
|
|
|
||
|
|
/// Audio device kind — mirrors `vc_device_kind`.
|
||
|
|
public enum VoiceCatDeviceKind: UInt32, Sendable, Equatable {
|
||
|
|
case input = 0
|
||
|
|
case output = 1
|
||
|
|
|
||
|
|
public init(_ cValue: vc_device_kind) { self = VoiceCatDeviceKind(rawValue: cValue.rawValue) ?? .input }
|
||
|
|
public var cValue: vc_device_kind { vc_device_kind(rawValue) }
|
||
|
|
}
|
||
|
|
|
||
|
|
/// Stream kind — mirrors `vc_stream_kind`.
|
||
|
|
public enum VoiceCatStreamKind: UInt32, Sendable, Equatable {
|
||
|
|
case mic = 0
|
||
|
|
/// System/desktop audio (docs/voice.md §9).
|
||
|
|
case screenAudio = 1
|
||
|
|
case auxDevice = 2
|
||
|
|
|
||
|
|
public init(_ cValue: vc_stream_kind) { self = VoiceCatStreamKind(rawValue: cValue.rawValue) ?? .mic }
|
||
|
|
public var cValue: vc_stream_kind { vc_stream_kind(rawValue) }
|
||
|
|
}
|
||
|
|
|
||
|
|
/// Send-side input gate mode (docs/voice.md §11) — mirrors `vc_input_mode`.
|
||
|
|
public enum VoiceCatInputMode: UInt32, Sendable, Equatable {
|
||
|
|
case voiceActivation = 0
|
||
|
|
case pushToTalk = 1
|
||
|
|
/// Transmit unconditionally, no VAD gate.
|
||
|
|
case alwaysOn = 2
|
||
|
|
|
||
|
|
public init(_ cValue: vc_input_mode) { self = VoiceCatInputMode(rawValue: cValue.rawValue) ?? .voiceActivation }
|
||
|
|
public var cValue: vc_input_mode { vc_input_mode(rawValue) }
|
||
|
|
}
|
||
|
|
|
||
|
|
/// Event type — mirrors `vc_event_type`. Additive-only.
|
||
|
|
public enum VoiceCatEventType: UInt32, Sendable, Equatable {
|
||
|
|
case connectionState = 0
|
||
|
|
case authResult = 1
|
||
|
|
case channelList = 2
|
||
|
|
case userJoined = 3
|
||
|
|
case userLeft = 4
|
||
|
|
case userUpdated = 5
|
||
|
|
case textMessage = 6
|
||
|
|
case streamStarted = 7
|
||
|
|
case streamStopped = 8
|
||
|
|
case talkState = 9
|
||
|
|
case error = 10
|
||
|
|
case disconnected = 11
|
||
|
|
/// M4: reply to `joinChannel()` — see `VoiceCatEvent.result` / `.channelId`.
|
||
|
|
case joinResult = 12
|
||
|
|
/// M4: the TOFU server-identity gate — see `VoiceCatEvent.tofuStatus` / `.text`.
|
||
|
|
case serverIdentity = 13
|
||
|
|
/// M5: async result for moderation/admin/channel operations.
|
||
|
|
case genericResult = 14
|
||
|
|
/// M5: reply to `requestAccountList()` — call `listAccounts()` to read.
|
||
|
|
case accountList = 15
|
||
|
|
|
||
|
|
public init(_ cValue: vc_event_type) {
|
||
|
|
self = VoiceCatEventType(rawValue: cValue.rawValue) ?? .error
|
||
|
|
}
|
||
|
|
public var cValue: vc_event_type { vc_event_type(rawValue) }
|
||
|
|
}
|
||
|
|
|
||
|
|
/// TOFU server-identity classification — mirrors `vc_tofu_status`. Pins the TLS leaf
|
||
|
|
/// certificate's SHA-256 fingerprint (NOT the display-only Ed25519 value — see
|
||
|
|
/// docs/security.md §1.1 and `VoiceCatServerIdentity`).
|
||
|
|
public enum VoiceCatTofuStatus: UInt32, Sendable, Equatable {
|
||
|
|
case firstConnect = 0
|
||
|
|
case matched = 1
|
||
|
|
case mismatch = 2
|
||
|
|
|
||
|
|
public init(_ cValue: vc_tofu_status) {
|
||
|
|
self = VoiceCatTofuStatus(rawValue: cValue.rawValue) ?? .firstConnect
|
||
|
|
}
|
||
|
|
public var cValue: vc_tofu_status { vc_tofu_status(rawValue) }
|
||
|
|
}
|