Arun Joseph
02/23/2023, 11:14 AMsealed interface UserAccountInfo {
/** No user info, no token */
object UnAuthenticated : UserAccountInfo
/** No token info */
data class LoggedOut(val userInfo: String) : UserAccountInfo
/** User info is present, token is expired */
data class HasExpiredToken(val userInfo: String,
val token: String,
val userId: String) : UserAccountInfo
/** User info and token are present, token might be expired */
data class LoggedIn(val userInfo: String,
val token: String,
val userId: String): UserAccountInfo
}
fun main() {
val userAccountInfo: UserAccountInfo = UserAccountInfo.UnAuthenticated
when (userAccountInfo) {
is UserAccountInfo.HasExpiredToken, is UserAccountInfo.LoggedIn -> {
val token = userAccountInfo.token
val userInfo = userAccountInfo.userInfo
val userId = userAccountInfo.userId
}
else -> {
println("Can not refresh token due to lack of authentication data")
}
}
}
Gives Unresolved reference: token
error.
But if I repeat code, it can work
is UserAccountInfo.HasExpiredToken -> {
val token = userAccountInfo.token
val userInfo = userAccountInfo.userInfo
val userId = userAccountInfo.userId
}
is UserAccountInfo.LoggedIn -> {
val token = userAccountInfo.token
val userInfo = userAccountInfo.userInfo
val userId = userAccountInfo.userId
}
Is there a way to remove code duplication? https://pl.kotl.in/eT1mSAOfkAdam S
02/23/2023, 11:19 AMsealed interface UserAccountInfo {
sealed interface WithToken { val token: String }
}
and implement WithToken
in HasExpiredToken
and LoggedIn
, and then in your when-statement, check for is UserAccountInfo.WithToken -> {}
Adam S
02/23/2023, 11:23 AMx
be?
when (userAccountInfo) {
is UserAccountInfo.HasExpiredToken, is UserAccountInfo.LoggedIn -> {
val x: TYPE= userAccountInfo
}
Maybe one day we will have union types…
val x: UserAccountInfo.HasExpiredToken | UserAccountInfo.LoggedIn= userAccountInfo
But not yet.Wout Werkman
02/23/2023, 12:20 PMWout Werkman
02/23/2023, 12:31 PMArun Joseph
02/23/2023, 3:09 PM