package org.amnezia.vpn import android.os.Bundle import android.os.Message import kotlin.enums.enumEntries sealed interface IpcMessage { companion object { @OptIn(ExperimentalStdlibApi::class) inline fun extractFromMessage(msg: Message): T where T : Enum, T : IpcMessage { val values = enumEntries() if (msg.what !in values.indices) { throw IllegalArgumentException("IPC action or event not found for the message: $msg") } return values[msg.what] } } } enum class ServiceEvent : IpcMessage { STATUS_CHANGED, STATUS, STATISTICS_UPDATE, ERROR } enum class Action : IpcMessage { REGISTER_CLIENT, UNREGISTER_CLIENT, CONNECT, DISCONNECT, REQUEST_STATUS, NOTIFICATION_PERMISSION_GRANTED, SET_SAVE_LOGS } fun T.packToMessage(): Message where T : Enum, T : IpcMessage = Message.obtain().also { it.what = ordinal } fun T.packToMessage(block: Bundle.() -> Unit): Message where T : Enum, T : IpcMessage = packToMessage().also { it.data = Bundle().apply(block) } inline fun Message.extractIpcMessage(): T where T : Enum, T : IpcMessage = IpcMessage.extractFromMessage(this)