Tech
09/27/2022, 11:25 AMsealed class Response(val success: Boolean) {
class Success : Response(true)
class Failure : Response(false)
}
So from this I'd like to do this.
// Example
val res = Response(true)
if(res.success) {
// cast to Response.Success
} else {
// cast to Response.Failure
}
I know I can probably just use the is
clause but I think it'd be a tad bit nicer to do it like this, if it's not possible I'll just use is
.
Thanks in advance!Sam
09/27/2022, 11:31 AMsealed interface Response {
object Success: Response
object Failure: Response
}
fun Response.isSuccess(): Boolean {
contract { returns(true) implies(this@isSuccess is Response.Success) }
return this is Response.Success
}
which is really just a long-winded way of doing the is
check 😄Sam
09/27/2022, 11:32 AMval res = Response(true)
won’t compile as Response
is abstractTech
09/27/2022, 11:37 AMTech
09/27/2022, 11:38 AMTech
09/27/2022, 11:43 AMsealed class ServiceResponse<out T>(
val success: Boolean
) {
@Contextual
abstract val data: T?
/**
* Represent a successful API operation.
* @param data Optional data to be passed along.
*/
@Serializable(with = ServiceResponseSerializer::class)
data class Success<T>(
override val data: T? = null
) : ServiceResponse<T>(true)
/**
* Represent a failed API operation.
* @param message Optional error message.
* @param data Optional data to be passed along.
*/
@Serializable(with = ServiceResponseSerializer::class)
data class Failure<T>(
val message: String? = null,
override val data: T? = null
) : ServiceResponse<T>(false)
}
I do it like this so with my API I can just respond with ServiceResponse.Success<Unit>()
and I also have an error handler to check if I send back a failure.Sam
09/27/2022, 11:44 AMsuccess
property out to a function it didn’t have any state any moreTech
09/27/2022, 11:50 AMis
check, but contracts seem really cool so I'll learn more about those later
Thanks for showing itephemient
09/27/2022, 11:52 AMsuccess
in a field:
sealed class Response {
abstract val isSuccess: Boolean
class Success : Response() {
override val isSuccess: Boolean
get() = true
}
class Failure : Response() {
override val isSuccess: Boolean
get() = false
}
}
the extension makes more sense to me thoughTech
09/27/2022, 11:53 AM