From ab83b5b8392ce671c20825d0f5fdb87b275a19a7 Mon Sep 17 00:00:00 2001 From: vityaman Date: Thu, 11 Apr 2024 10:56:21 +0300 Subject: [PATCH] #41 Added EnumBiMap --- .../api/http/message/PromotionMapping.kt | 36 ++++++------------- .../botalka/api/http/message/UserMapping.kt | 25 ++++++------- .../ru/itmo/lms/botalka/commons/BiMap.kt | 33 +++++++++++++++++ .../storage/jooq/entity/PromotionMapping.kt | 20 +++++------ .../storage/jooq/entity/UserMapping.kt | 17 ++++----- 5 files changed, 75 insertions(+), 56 deletions(-) create mode 100644 botalka/src/main/kotlin/ru/itmo/lms/botalka/commons/BiMap.kt diff --git a/botalka/src/main/kotlin/ru/itmo/lms/botalka/api/http/message/PromotionMapping.kt b/botalka/src/main/kotlin/ru/itmo/lms/botalka/api/http/message/PromotionMapping.kt index bd07695..95c2ef2 100644 --- a/botalka/src/main/kotlin/ru/itmo/lms/botalka/api/http/message/PromotionMapping.kt +++ b/botalka/src/main/kotlin/ru/itmo/lms/botalka/api/http/message/PromotionMapping.kt @@ -2,6 +2,8 @@ package ru.itmo.lms.botalka.api.http.message import ru.itmo.lms.botalka.api.http.PromotionRequestMessage import ru.itmo.lms.botalka.api.http.PromotionRequestStatusMessage +import ru.itmo.lms.botalka.commons.BiMap +import ru.itmo.lms.botalka.commons.BiMap.Companion.invoke import ru.itmo.lms.botalka.domain.model.PromotionRequest fun PromotionRequest.toMessage(): PromotionRequestMessage = @@ -12,32 +14,14 @@ fun PromotionRequest.toMessage(): PromotionRequestMessage = status = this.status.toMessage(), ) -fun PromotionRequest.Status.toMessage(): PromotionRequestStatusMessage = - when (this) { - PromotionRequest.Status.CREATED -> { - PromotionRequestStatusMessage.NEW - } - - PromotionRequest.Status.REJECTED -> { - PromotionRequestStatusMessage.CANCELED - } +private val statusMap = BiMap.from( + PromotionRequest.Status.CREATED to PromotionRequestStatusMessage.NEW, + PromotionRequest.Status.REJECTED to PromotionRequestStatusMessage.CANCELED, + PromotionRequest.Status.APPROVED to PromotionRequestStatusMessage.APPROVED, +) - PromotionRequest.Status.APPROVED -> { - PromotionRequestStatusMessage.APPROVED - } - } +fun PromotionRequest.Status.toMessage(): PromotionRequestStatusMessage = + statusMap(this) fun PromotionRequestStatusMessage.toModel(): PromotionRequest.Status = - when (this) { - PromotionRequestStatusMessage.NEW -> { - PromotionRequest.Status.CREATED - } - - PromotionRequestStatusMessage.APPROVED -> { - PromotionRequest.Status.APPROVED - } - - PromotionRequestStatusMessage.CANCELED -> { - PromotionRequest.Status.REJECTED - } - } + statusMap(this) diff --git a/botalka/src/main/kotlin/ru/itmo/lms/botalka/api/http/message/UserMapping.kt b/botalka/src/main/kotlin/ru/itmo/lms/botalka/api/http/message/UserMapping.kt index 609bb98..2861cf6 100644 --- a/botalka/src/main/kotlin/ru/itmo/lms/botalka/api/http/message/UserMapping.kt +++ b/botalka/src/main/kotlin/ru/itmo/lms/botalka/api/http/message/UserMapping.kt @@ -3,20 +3,10 @@ package ru.itmo.lms.botalka.api.http.message import ru.itmo.lms.botalka.api.http.UserDraftMessage import ru.itmo.lms.botalka.api.http.UserMessage import ru.itmo.lms.botalka.api.http.UserRoleMessage +import ru.itmo.lms.botalka.commons.BiMap +import ru.itmo.lms.botalka.commons.BiMap.Companion.invoke import ru.itmo.lms.botalka.domain.model.User -fun User.Role.toMessage(): UserRoleMessage = - when (this) { - User.Role.TEACHER -> UserRoleMessage.TEACHER - User.Role.STUDENT -> UserRoleMessage.STUDENT - } - -fun UserRoleMessage.toModel(): User.Role = - when (this) { - UserRoleMessage.STUDENT -> User.Role.STUDENT - UserRoleMessage.TEACHER -> User.Role.TEACHER - } - fun User.toMessage(): UserMessage = UserMessage( id = this.id.number, @@ -40,3 +30,14 @@ fun UserMessage.toModel(): User = alias = User.Alias(this.alias), roles = this.roles.map { it.toModel() }.toSet(), ) + +private val userRoleMap = BiMap.from( + User.Role.TEACHER to UserRoleMessage.TEACHER, + User.Role.STUDENT to UserRoleMessage.STUDENT, +) + +fun User.Role.toMessage(): UserRoleMessage = + userRoleMap(this) + +fun UserRoleMessage.toModel(): User.Role = + userRoleMap(this) diff --git a/botalka/src/main/kotlin/ru/itmo/lms/botalka/commons/BiMap.kt b/botalka/src/main/kotlin/ru/itmo/lms/botalka/commons/BiMap.kt new file mode 100644 index 0000000..f84563b --- /dev/null +++ b/botalka/src/main/kotlin/ru/itmo/lms/botalka/commons/BiMap.kt @@ -0,0 +1,33 @@ +package ru.itmo.lms.botalka.commons + +import java.util.EnumMap + +interface BiMap { + fun toRight(value: T): U + fun toLeft(value: U): T + + companion object { + inline fun , reified U : Enum> from( + vararg pairs: Pair, + ): BiMap = + object : BiMap { + private val rhs = pairs + .associateTo(EnumMap(T::class.java)) { (l, r) -> l to r } + + private val lhs = pairs + .associateTo(EnumMap(U::class.java)) { (l, r) -> r to l } + + override fun toRight(value: T): U = rhs[value]!! + + override fun toLeft(value: U): T = lhs[value]!! + } + + @JvmName("BiMapLeftToRight") + operator fun BiMap.invoke(value: T): U = + this.toRight(value) + + @JvmName("BiMapRightToLeft") + operator fun BiMap.invoke(value: U): T = + this.toLeft(value) + } +} diff --git a/botalka/src/main/kotlin/ru/itmo/lms/botalka/storage/jooq/entity/PromotionMapping.kt b/botalka/src/main/kotlin/ru/itmo/lms/botalka/storage/jooq/entity/PromotionMapping.kt index 5caa9f4..bd273b4 100644 --- a/botalka/src/main/kotlin/ru/itmo/lms/botalka/storage/jooq/entity/PromotionMapping.kt +++ b/botalka/src/main/kotlin/ru/itmo/lms/botalka/storage/jooq/entity/PromotionMapping.kt @@ -1,5 +1,7 @@ package ru.itmo.lms.botalka.storage.jooq.entity +import ru.itmo.lms.botalka.commons.BiMap +import ru.itmo.lms.botalka.commons.BiMap.Companion.invoke import ru.itmo.lms.botalka.domain.model.PromotionRequest import ru.itmo.lms.botalka.domain.model.User import ru.itmo.lms.botalka.storage.jooq.enums.PromotionRequestStatus @@ -13,16 +15,14 @@ fun PromotionRequestRecord.toModel(): PromotionRequest = status = this.status!!.toModel(), ) +private val statusMap = BiMap.from( + PromotionRequest.Status.CREATED to PromotionRequestStatus.created, + PromotionRequest.Status.REJECTED to PromotionRequestStatus.rejected, + PromotionRequest.Status.APPROVED to PromotionRequestStatus.approved, +) + fun PromotionRequestStatus.toModel(): PromotionRequest.Status = - when (this) { - PromotionRequestStatus.created -> PromotionRequest.Status.CREATED - PromotionRequestStatus.rejected -> PromotionRequest.Status.REJECTED - PromotionRequestStatus.approved -> PromotionRequest.Status.APPROVED - } + statusMap(this) fun PromotionRequest.Status.toRecord(): PromotionRequestStatus = - when (this) { - PromotionRequest.Status.CREATED -> PromotionRequestStatus.created - PromotionRequest.Status.REJECTED -> PromotionRequestStatus.rejected - PromotionRequest.Status.APPROVED -> PromotionRequestStatus.approved - } + statusMap(this) diff --git a/botalka/src/main/kotlin/ru/itmo/lms/botalka/storage/jooq/entity/UserMapping.kt b/botalka/src/main/kotlin/ru/itmo/lms/botalka/storage/jooq/entity/UserMapping.kt index fcd04ae..8c3587b 100644 --- a/botalka/src/main/kotlin/ru/itmo/lms/botalka/storage/jooq/entity/UserMapping.kt +++ b/botalka/src/main/kotlin/ru/itmo/lms/botalka/storage/jooq/entity/UserMapping.kt @@ -1,5 +1,7 @@ package ru.itmo.lms.botalka.storage.jooq.entity +import ru.itmo.lms.botalka.commons.BiMap +import ru.itmo.lms.botalka.commons.BiMap.Companion.invoke import ru.itmo.lms.botalka.domain.model.User import ru.itmo.lms.botalka.storage.jooq.enums.Role import ru.itmo.lms.botalka.storage.jooq.tables.records.UserRecord @@ -16,14 +18,13 @@ fun User.Draft.toRecord(): UserRecord = alias = this.alias.text, ) +private val userRoleMap = BiMap.from( + User.Role.TEACHER to Role.teacher, + User.Role.STUDENT to Role.student, +) + fun User.Role.toRecord(): Role = - when (this) { - User.Role.TEACHER -> Role.teacher - User.Role.STUDENT -> Role.student - } + userRoleMap(this) fun Role.toModel(): User.Role = - when (this) { - Role.teacher -> User.Role.TEACHER - Role.student -> User.Role.STUDENT - } + userRoleMap(this)