update ktlint rules
This commit is contained in:
@@ -4,3 +4,5 @@ ktlint_standard = enabled
|
|||||||
ktlint_experimental = enabled
|
ktlint_experimental = enabled
|
||||||
ktlint_standard_string-template-indent = enabled
|
ktlint_standard_string-template-indent = enabled
|
||||||
ktlint_standard_multiline-expression-wrapping = enabled
|
ktlint_standard_multiline-expression-wrapping = enabled
|
||||||
|
ktlint_function_signature_body_expression_wrapping = always
|
||||||
|
indent_size = 2
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
@file:Suppress("PropertyName")
|
@file:Suppress("PropertyName")
|
||||||
|
|
||||||
@Suppress("ktlint:standard:property-naming")
|
|
||||||
val ktor_version: String by project
|
val ktor_version: String by project
|
||||||
val kotlin_version: String by project
|
val kotlin_version: String by project
|
||||||
val kotlin_serialization_version: String by project
|
val kotlin_serialization_version: String by project
|
||||||
@@ -28,7 +27,6 @@ application {
|
|||||||
|
|
||||||
configure<org.jlleitschuh.gradle.ktlint.KtlintExtension> {
|
configure<org.jlleitschuh.gradle.ktlint.KtlintExtension> {
|
||||||
version.set("1.5.0")
|
version.set("1.5.0")
|
||||||
enableExperimentalRules.set(true)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
|
|||||||
@@ -27,7 +27,8 @@ class GameCommandHandler(
|
|||||||
player: Player,
|
player: Player,
|
||||||
incomingCommandChannel: ReceiveChannel<GameCommand>,
|
incomingCommandChannel: ReceiveChannel<GameCommand>,
|
||||||
outgoingErrorChannelNotification: SendChannel<Notification>,
|
outgoingErrorChannelNotification: SendChannel<Notification>,
|
||||||
) = commandStreamChannel(incomingCommandChannel)
|
) =
|
||||||
|
commandStreamChannel(incomingCommandChannel)
|
||||||
.process { command ->
|
.process { command ->
|
||||||
if (command.payload.player.id != player.id) {
|
if (command.payload.player.id != player.id) {
|
||||||
logger.atWarn {
|
logger.atWarn {
|
||||||
|
|||||||
@@ -11,7 +11,8 @@ data class Deck(
|
|||||||
constructor(players: Set<Player>) :
|
constructor(players: Set<Player>) :
|
||||||
this(playersHands = PlayersHands(players))
|
this(playersHands = PlayersHands(players))
|
||||||
|
|
||||||
fun shuffle(): Deck = copy(stack = stack.shuffle())
|
fun shuffle(): Deck =
|
||||||
|
copy(stack = stack.shuffle())
|
||||||
|
|
||||||
fun placeFirstCardOnDiscard(): Deck {
|
fun placeFirstCardOnDiscard(): Deck {
|
||||||
val takenCard = stack.first()
|
val takenCard = stack.first()
|
||||||
@@ -58,7 +59,8 @@ data class Deck(
|
|||||||
return Pair(copy(stack = newStack), takenCards)
|
return Pair(copy(stack = newStack), takenCards)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun takeOne(): Pair<Deck, Card> = take(1).let { (deck, cards) -> Pair(deck, cards.first()) }
|
private fun takeOne(): Pair<Deck, Card> =
|
||||||
|
take(1).let { (deck, cards) -> Pair(deck, cards.first()) }
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
fun newWithoutPlayers(): Deck =
|
fun newWithoutPlayers(): Deck =
|
||||||
@@ -96,27 +98,36 @@ fun Deck.initHands(
|
|||||||
value class Stack(
|
value class Stack(
|
||||||
private val cards: Set<Card> = emptySet(),
|
private val cards: Set<Card> = emptySet(),
|
||||||
) : Set<Card> by cards {
|
) : Set<Card> by cards {
|
||||||
operator fun plus(card: Card): Stack = cards.plus(card).toStack()
|
operator fun plus(card: Card): Stack =
|
||||||
|
cards.plus(card).toStack()
|
||||||
|
|
||||||
operator fun minus(card: Card): Stack = cards.minus(card).toStack()
|
operator fun minus(card: Card): Stack =
|
||||||
|
cards.minus(card).toStack()
|
||||||
|
|
||||||
fun shuffle(): Stack = shuffled().toStack()
|
fun shuffle(): Stack =
|
||||||
|
shuffled().toStack()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun List<Card>.toStack(): Stack = Stack(this.toSet())
|
fun List<Card>.toStack(): Stack =
|
||||||
|
Stack(this.toSet())
|
||||||
|
|
||||||
fun Set<Card>.toStack(): Stack = Stack(this)
|
fun Set<Card>.toStack(): Stack =
|
||||||
|
Stack(this)
|
||||||
|
|
||||||
@JvmInline
|
@JvmInline
|
||||||
@Serializable
|
@Serializable
|
||||||
value class Discard(
|
value class Discard(
|
||||||
private val cards: Set<Card> = emptySet(),
|
private val cards: Set<Card> = emptySet(),
|
||||||
) : Set<Card> by cards {
|
) : Set<Card> by cards {
|
||||||
operator fun plus(card: Card): Discard = cards.plus(card).toDiscard()
|
operator fun plus(card: Card): Discard =
|
||||||
|
cards.plus(card).toDiscard()
|
||||||
|
|
||||||
operator fun minus(card: Card): Discard = cards.minus(card).toDiscard()
|
operator fun minus(card: Card): Discard =
|
||||||
|
cards.minus(card).toDiscard()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun List<Card>.toDiscard(): Discard = Discard(this.toSet())
|
fun List<Card>.toDiscard(): Discard =
|
||||||
|
Discard(this.toSet())
|
||||||
|
|
||||||
fun Set<Card>.toDiscard(): Discard = Discard(this)
|
fun Set<Card>.toDiscard(): Discard =
|
||||||
|
Discard(this)
|
||||||
|
|||||||
@@ -13,5 +13,6 @@ import java.util.UUID
|
|||||||
value class GameId(
|
value class GameId(
|
||||||
override val id: UUID = UUID.randomUUID(),
|
override val id: UUID = UUID.randomUUID(),
|
||||||
) : AggregateId {
|
) : AggregateId {
|
||||||
override fun toString(): String = id.toString()
|
override fun toString(): String =
|
||||||
|
id.toString()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ data class Player(
|
|||||||
@Serializable(with = UUIDSerializer::class)
|
@Serializable(with = UUIDSerializer::class)
|
||||||
override val id: UUID = UUID.randomUUID(),
|
override val id: UUID = UUID.randomUUID(),
|
||||||
) : AggregateId {
|
) : AggregateId {
|
||||||
override fun toString(): String = id.toString()
|
override fun toString(): String =
|
||||||
|
id.toString()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,7 +10,8 @@ value class PlayersHands(
|
|||||||
constructor(players: Set<Player>) :
|
constructor(players: Set<Player>) :
|
||||||
this(players.map { it.id }.associateWith { emptyList<Card>() }.toPlayersHands())
|
this(players.map { it.id }.associateWith { emptyList<Card>() }.toPlayersHands())
|
||||||
|
|
||||||
fun getHand(player: Player): List<Card>? = this[player.id]
|
fun getHand(player: Player): List<Card>? =
|
||||||
|
this[player.id]
|
||||||
|
|
||||||
fun removeCard(
|
fun removeCard(
|
||||||
player: Player,
|
player: Player,
|
||||||
@@ -28,7 +29,8 @@ value class PlayersHands(
|
|||||||
fun addCard(
|
fun addCard(
|
||||||
player: Player,
|
player: Player,
|
||||||
newCard: Card,
|
newCard: Card,
|
||||||
): PlayersHands = addCards(player, listOf(newCard))
|
): PlayersHands =
|
||||||
|
addCards(player, listOf(newCard))
|
||||||
|
|
||||||
fun addCards(
|
fun addCards(
|
||||||
player: Player,
|
player: Player,
|
||||||
@@ -44,4 +46,5 @@ value class PlayersHands(
|
|||||||
}.toPlayersHands()
|
}.toPlayersHands()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun Map<Player.PlayerId, List<Card>>.toPlayersHands(): PlayersHands = PlayersHands(this)
|
fun Map<Player.PlayerId, List<Card>>.toPlayersHands(): PlayersHands =
|
||||||
|
PlayersHands(this)
|
||||||
|
|||||||
@@ -62,7 +62,8 @@ data class GameState(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun nextPlayer(direction: Direction): Player = players.elementAt(nextPlayerIndex(direction))
|
fun nextPlayer(direction: Direction): Player =
|
||||||
|
players.elementAt(nextPlayerIndex(direction))
|
||||||
|
|
||||||
private val sidePlayerIndexClockwise: Int by lazy {
|
private val sidePlayerIndexClockwise: Int by lazy {
|
||||||
if (players.isEmpty()) {
|
if (players.isEmpty()) {
|
||||||
|
|||||||
@@ -29,7 +29,8 @@ class GameStateRepository(
|
|||||||
*
|
*
|
||||||
* It fetches it from the local cache if possible, otherwise it builds it.
|
* It fetches it from the local cache if possible, otherwise it builds it.
|
||||||
*/
|
*/
|
||||||
fun getLast(gameId: GameId): GameState = projectionsSnapshot.getLast(gameId)
|
fun getLast(gameId: GameId): GameState =
|
||||||
|
projectionsSnapshot.getLast(gameId)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the [GameState] to the specific [event][GameEvent].
|
* Get the [GameState] to the specific [event][GameEvent].
|
||||||
@@ -37,5 +38,6 @@ class GameStateRepository(
|
|||||||
*
|
*
|
||||||
* It fetches it from the local cache if possible, otherwise it builds it.
|
* It fetches it from the local cache if possible, otherwise it builds it.
|
||||||
*/
|
*/
|
||||||
fun getUntil(event: GameEvent): GameState = projectionsSnapshot.getUntil(event)
|
fun getUntil(event: GameEvent): GameState =
|
||||||
|
projectionsSnapshot.getUntil(event)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -164,7 +164,8 @@ class ProjectionSnapshotRepositoryInMemory<E : Event<ID>, P : Projection<ID>, ID
|
|||||||
private fun getEventAfterTheSnapshot(
|
private fun getEventAfterTheSnapshot(
|
||||||
aggregateId: ID,
|
aggregateId: ID,
|
||||||
snapshot: P?,
|
snapshot: P?,
|
||||||
) = eventStore
|
) =
|
||||||
|
eventStore
|
||||||
.getStream(aggregateId)
|
.getStream(aggregateId)
|
||||||
.readGreaterOfVersion(snapshot?.lastEventVersion ?: 0)
|
.readGreaterOfVersion(snapshot?.lastEventVersion ?: 0)
|
||||||
|
|
||||||
|
|||||||
@@ -37,7 +37,8 @@ fun defaultJsonSerializer(): Json =
|
|||||||
}
|
}
|
||||||
|
|
||||||
object CommandIdSerializer : KSerializer<CommandId> {
|
object CommandIdSerializer : KSerializer<CommandId> {
|
||||||
override fun deserialize(decoder: Decoder): CommandId = CommandId(decoder.decodeString())
|
override fun deserialize(decoder: Decoder): CommandId =
|
||||||
|
CommandId(decoder.decodeString())
|
||||||
|
|
||||||
override fun serialize(
|
override fun serialize(
|
||||||
encoder: Encoder,
|
encoder: Encoder,
|
||||||
@@ -50,7 +51,8 @@ object CommandIdSerializer : KSerializer<CommandId> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
object PlayerIdSerializer : KSerializer<Player.PlayerId> {
|
object PlayerIdSerializer : KSerializer<Player.PlayerId> {
|
||||||
override fun deserialize(decoder: Decoder): Player.PlayerId = Player.PlayerId(UUID.fromString(decoder.decodeString()))
|
override fun deserialize(decoder: Decoder): Player.PlayerId =
|
||||||
|
Player.PlayerId(UUID.fromString(decoder.decodeString()))
|
||||||
|
|
||||||
override fun serialize(
|
override fun serialize(
|
||||||
encoder: Encoder,
|
encoder: Encoder,
|
||||||
@@ -63,7 +65,8 @@ object PlayerIdSerializer : KSerializer<Player.PlayerId> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
object GameIdSerializer : KSerializer<GameId> {
|
object GameIdSerializer : KSerializer<GameId> {
|
||||||
override fun deserialize(decoder: Decoder): GameId = GameId(UUID.fromString(decoder.decodeString()))
|
override fun deserialize(decoder: Decoder): GameId =
|
||||||
|
GameId(UUID.fromString(decoder.decodeString()))
|
||||||
|
|
||||||
override fun serialize(
|
override fun serialize(
|
||||||
encoder: Encoder,
|
encoder: Encoder,
|
||||||
@@ -76,7 +79,8 @@ object GameIdSerializer : KSerializer<GameId> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
object UUIDSerializer : KSerializer<UUID> {
|
object UUIDSerializer : KSerializer<UUID> {
|
||||||
override fun deserialize(decoder: Decoder): UUID = UUID.fromString(decoder.decodeString())
|
override fun deserialize(decoder: Decoder): UUID =
|
||||||
|
UUID.fromString(decoder.decodeString())
|
||||||
|
|
||||||
override fun serialize(
|
override fun serialize(
|
||||||
encoder: Encoder,
|
encoder: Encoder,
|
||||||
|
|||||||
@@ -14,7 +14,8 @@ value class CommandId(
|
|||||||
) {
|
) {
|
||||||
constructor(id: String) : this(UUID.fromString(id))
|
constructor(id: String) : this(UUID.fromString(id))
|
||||||
|
|
||||||
override fun toString(): String = id.toString()
|
override fun toString(): String =
|
||||||
|
id.toString()
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -11,7 +11,8 @@ import kotlin.time.Duration.Companion.minutes
|
|||||||
class CommandStreamChannelBuilder<C : Command>(
|
class CommandStreamChannelBuilder<C : Command>(
|
||||||
private val maxCacheTime: Duration = 10.minutes,
|
private val maxCacheTime: Duration = 10.minutes,
|
||||||
) {
|
) {
|
||||||
operator fun invoke(incoming: ReceiveChannel<C>): CommandStreamChannel<C> = CommandStreamChannel(incoming, maxCacheTime)
|
operator fun invoke(incoming: ReceiveChannel<C>): CommandStreamChannel<C> =
|
||||||
|
CommandStreamChannel(incoming, maxCacheTime)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -6,7 +6,9 @@ import java.util.concurrent.ConcurrentMap
|
|||||||
class EventStoreInMemory<E : Event<ID>, ID : AggregateId> : EventStore<E, ID> {
|
class EventStoreInMemory<E : Event<ID>, ID : AggregateId> : EventStore<E, ID> {
|
||||||
private val streams: ConcurrentMap<ID, EventStream<E>> = ConcurrentHashMap()
|
private val streams: ConcurrentMap<ID, EventStream<E>> = ConcurrentHashMap()
|
||||||
|
|
||||||
override fun getStream(aggregateId: ID): EventStream<E> = streams.computeIfAbsent(aggregateId) { EventStreamInMemory() }
|
override fun getStream(aggregateId: ID): EventStream<E> =
|
||||||
|
streams.computeIfAbsent(aggregateId) { EventStreamInMemory() }
|
||||||
|
|
||||||
override fun publish(event: E) = getStream(event.aggregateId).publish(event)
|
override fun publish(event: E) =
|
||||||
|
getStream(event.aggregateId).publish(event)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,7 +27,8 @@ class EventStreamInMemory<E : Event<*>> : EventStream<E> {
|
|||||||
events.forEach { publish(it) }
|
events.forEach { publish(it) }
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun readAll(): Set<E> = events.toSet()
|
override fun readAll(): Set<E> =
|
||||||
|
events.toSet()
|
||||||
|
|
||||||
override fun readGreaterOfVersion(version: Int): Set<E> =
|
override fun readGreaterOfVersion(version: Int): Set<E> =
|
||||||
events
|
events
|
||||||
|
|||||||
@@ -13,7 +13,8 @@ class VersionBuilderLocal : VersionBuilder {
|
|||||||
.addAndGet(1)
|
.addAndGet(1)
|
||||||
.also { logger.debug { "New version $it" } }
|
.also { logger.debug { "New version $it" } }
|
||||||
|
|
||||||
override fun getLastVersion(aggregateId: AggregateId): Int = versionOfAggregate(aggregateId).toInt()
|
override fun getLastVersion(aggregateId: AggregateId): Int =
|
||||||
|
versionOfAggregate(aggregateId).toInt()
|
||||||
|
|
||||||
private fun versionOfAggregate(aggregateId: AggregateId) =
|
private fun versionOfAggregate(aggregateId: AggregateId) =
|
||||||
versions
|
versions
|
||||||
|
|||||||
@@ -3,8 +3,10 @@ package eventDemo
|
|||||||
import eventDemo.app.entity.Card
|
import eventDemo.app.entity.Card
|
||||||
import eventDemo.app.entity.Deck
|
import eventDemo.app.entity.Deck
|
||||||
|
|
||||||
fun Deck.allCardCount(): Int = stack.size + discard.size + playersHands.values.flatten().size
|
fun Deck.allCardCount(): Int =
|
||||||
|
stack.size + discard.size + playersHands.values.flatten().size
|
||||||
|
|
||||||
fun Deck.allCards(): Set<Card> = stack + discard + playersHands.values.flatten()
|
fun Deck.allCards(): Set<Card> =
|
||||||
|
stack + discard + playersHands.values.flatten()
|
||||||
|
|
||||||
// suspend fun SendChannel<Frame>.send(command: GameCommand) = send(Frame.Text(Json.encodeToString(command)))
|
// suspend fun SendChannel<Frame>.send(command: GameCommand) = send(Frame.Text(Json.encodeToString(command)))
|
||||||
|
|||||||
Reference in New Issue
Block a user