package me.eater.hefbrug.enforcer.impl import me.eater.hefbrug.enforcer.AbstractEnforcer import me.eater.hefbrug.executor.ExecutionContext import me.eater.hefbrug.state.ExistenceStatus import me.eater.hefbrug.state.impl.PackageState class PackageEnforcer(context: ExecutionContext) : AbstractEnforcer(context) { override suspend fun enforce(currentState: PackageState, desiredState: PackageState, changeSet: Set) { val pm = context.getPackageManager() pm.sync() if (PackageState::status in changeSet) { when (desiredState.status) { ExistenceStatus.Absent -> pm.remove(desiredState.name) ExistenceStatus.Present -> pm.install(desiredState.name) else -> Unit } } if (currentState.status == ExistenceStatus.Present && (desiredState.upgrade && !(PackageState::status in changeSet || desiredState.status == ExistenceStatus.Absent))) { pm.upgrade(desiredState.name) } } }