Skip to main content

intro

import co.q64.rain.api.core.database.Data
import co.q64.rain.api.core.database.Database
import co.q64.rain.api.core.database.Storage
import co.q64.rain.api.core.database.data
import co.q64.rain.api.core.database.get
import co.q64.rain.api.core.model.PlayerId
import co.q64.raindrop.annotation.Generate
import org.springframework.stereotype.Component

@Generate.Optics
data class SamplePlayerData(
override val id: String,
override val version: Int = CurrentVersion,

val experience: Int = 0
) : Data {
companion object {
const val CurrentVersion = 1
}
}

@Component
class ExperienceGetter(
private val database: Database
) {
suspend fun getExperienceOrNull(player: PlayerId): Int? {
// We can grab the entire data object if needed
val entireObject: SamplePlayerData? = database.data<SamplePlayerData>(player)

// But in this case, we're only interested in experience
// So the preferred method here would be to use the generated Optic
val experience: Int? = database.data(player, SamplePlayerData.Experience)

// database.data always returns a nullable value, since a lookup can fail
// Under typical conditions, the result will never be null, since default
// data objects are created when needed

// A result of null indicates that some part of the database infrastructure
// was unavailable. Alternatively, database.get can be used when more information
// about a potential error is desired
return when (val result = database.get(player, SamplePlayerData.Experience)) {
is Storage.Get.Fail -> {
// Do something useful with the message
val message = result.message
// Then return null
null
}
is Storage.Get.Success -> {
result.data
}
}
}
}

Tutorial Intro

Let's discover Docusaurus in less than 5 minutes.