Current scope: tibiakt-core| all classes
|
com.galarzaa.tibiakt.core.section.community.character.builder
Coverage Summary for Class: CharacterBuilder (com.galarzaa.tibiakt.core.section.community.character.builder)
| Class | Method, % | Branch, % | Line, % | Instruction, % |
|---|---|---|---|---|
| CharacterBuilder | 86.2% (25/29) | 50% (1/2) | 91% (71/78) | 91.1% (408/448) |
| CharacterBuilder$CharacterHouseBuilder | 0% (0/7) | 0% (0/8) | 0% (0/12) | 0% (0/133) |
| Total | 69.4% (25/36) | 10% (1/10) | 78.9% (71/90) | 70.2% (408/581) |
/*
* Copyright © 2025 Allan Galarza
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.galarzaa.tibiakt.core.section.community.character.builder
import com.galarzaa.tibiakt.core.builder.BuilderDsl
import com.galarzaa.tibiakt.core.builder.TibiaKtBuilder
import com.galarzaa.tibiakt.core.builder.requireField
import com.galarzaa.tibiakt.core.domain.character.Sex
import com.galarzaa.tibiakt.core.domain.character.Vocation
import com.galarzaa.tibiakt.core.section.community.character.model.AccountBadge
import com.galarzaa.tibiakt.core.section.community.character.model.AccountCharacter
import com.galarzaa.tibiakt.core.section.community.character.model.AccountInformation
import com.galarzaa.tibiakt.core.section.community.character.model.CharacterHouse
import com.galarzaa.tibiakt.core.section.community.character.model.CharacterInfo
import com.galarzaa.tibiakt.core.section.community.character.model.Death
import com.galarzaa.tibiakt.core.section.community.character.model.DeathParticipant
import com.galarzaa.tibiakt.core.section.community.character.model.DisplayedAchievement
import com.galarzaa.tibiakt.core.section.community.character.model.GuildMembership
import kotlinx.datetime.LocalDate
import kotlin.time.Instant
@BuilderDsl
internal inline fun character(block: CharacterBuilder.() -> Unit): CharacterInfo =
CharacterBuilder().apply(block).build()
@BuilderDsl
internal inline fun characterBuilder(block: CharacterBuilder.() -> Unit): CharacterBuilder =
CharacterBuilder().apply(block)
/** Builder for [CharacterInfo] instances. */
@BuilderDsl
internal class CharacterBuilder : TibiaKtBuilder<CharacterInfo> {
lateinit var name: String
var level: Int = 2
var residence: String? = null
var vocation: Vocation? = null
var sex: Sex? = null
var world: String? = null
var achievementPoints: Int = 0
var lastLoginAt: Instant? = null
var isRecentlyTraded: Boolean = false
var formerNames: List<String> = emptyList()
var deletionScheduledAt: Instant? = null
var formerWorld: String? = null
var isPremium: Boolean = false
var comment: String? = null
var title: String? = null
var position: String? = null
var unlockedTitles: Int = 0
var marriedTo: String? = null
val houses: MutableList<CharacterHouse> = mutableListOf()
var guildMembership: GuildMembership? = null
val accountBadges: MutableList<AccountBadge> = mutableListOf()
val achievements: MutableList<DisplayedAchievement> = mutableListOf()
var accountInformation: AccountInformation? = null
val deaths: MutableList<Death> = mutableListOf()
val otherCharacters: MutableList<AccountCharacter> = mutableListOf()
fun addHouse(
name: String,
houseId: Int,
town: String,
paidUntil: LocalDate,
world: String,
): CharacterBuilder = apply {
houses.add(CharacterHouse(name, houseId, town, paidUntil, world))
}
@BuilderDsl
fun house(block: CharacterHouseBuilder.() -> Unit): CharacterBuilder =
apply { houses.add(CharacterHouseBuilder().apply(block).build()) }
fun addBadge(name: String, descroption: String, iconUrl: String): CharacterBuilder = apply {
accountBadges.add(AccountBadge(name, descroption, iconUrl))
}
fun addAchievement(name: String, grade: Int, isSecret: Boolean): CharacterBuilder = apply {
achievements.add(DisplayedAchievement(name, grade, isSecret))
}
fun accountInformation(
created: Instant,
loyaltyTitle: String?,
position: String?,
): CharacterBuilder = apply {
accountInformation = AccountInformation(created, loyaltyTitle, position)
}
fun guild(rank: String, guild: String): CharacterBuilder =
apply { guildMembership = GuildMembership(guild, rank) }
fun addDeath(
occurredAt: Instant,
level: Int,
killers: List<DeathParticipant>,
assists: List<DeathParticipant>,
): CharacterBuilder = apply {
deaths.add(Death(occurredAt, level, killers, assists))
}
fun addOtherCharacter(
name: String,
world: String,
isMain: Boolean = false,
isOnline: Boolean = false,
isDeleted: Boolean = false,
isRecentlyTraded: Boolean = false,
position: String?,
): CharacterBuilder = apply {
otherCharacters.add(
AccountCharacter(
name, world, isMain, isOnline, isDeleted, isRecentlyTraded, position
)
)
}
override fun build(): CharacterInfo = CharacterInfo(
name = requireField(::name.isInitialized, "name") { name },
title = title,
formerNames = formerNames,
unlockedTitles = unlockedTitles,
sex = requireField(sex, "sex"),
vocation = requireField(vocation, "vocation"),
level = level,
achievementPoints = achievementPoints,
world = requireField(world, "world"),
formerWorld = formerWorld,
residence = requireField(residence, "residence"),
marriedTo = marriedTo,
houses = houses,
guildMembership = guildMembership,
lastLoginAt = lastLoginAt,
position = position,
comment = comment,
isPremium = isPremium,
isRecentlyTraded = isRecentlyTraded,
deletionScheduledAt = deletionScheduledAt,
badges = accountBadges,
achievements = achievements,
deaths = deaths,
accountInformation = accountInformation,
otherCharacters = otherCharacters
)
class CharacterHouseBuilder : TibiaKtBuilder<CharacterHouse> {
lateinit var name: String
var houseId: Int = 0
lateinit var town: String
lateinit var paidUntil: LocalDate
lateinit var world: String
override fun build(): CharacterHouse = CharacterHouse(
name = requireField(::name.isInitialized, "name") { name },
houseId = houseId,
town = requireField(::town.isInitialized, "town") { town },
paidUntil = requireField(::paidUntil.isInitialized, "paidUntil") { paidUntil },
world = requireField(::world.isInitialized, "world") { world },
)
}
}