Advertisement
Guest User

Untitled

a guest
Apr 6th, 2017
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.40 KB | None | 0 0
  1. private class BetterApi {
  2.  
  3. fun login(credentials: Credentials): LoginResponse {
  4. //login...
  5. TODO()
  6. }
  7.  
  8.  
  9. class LoginResponse private constructor(
  10. val user: User?,
  11. val error: Error?
  12. ) {
  13. constructor(user: User) : this(user = user, error = null)
  14. constructor(error: Error) : this(user = null, error = error)
  15.  
  16. init {
  17. if (user == null && error == null) {
  18. throw IllegalStateException("both user & error cannot be null")
  19. }
  20. if (user != null && error != null) {
  21. throw IllegalStateException("either user or error must be null")
  22. }
  23. }
  24.  
  25. val isSuccessful = user != null
  26.  
  27. abstract class Error
  28.  
  29. object InvalidCredentials : Error()
  30. object NoInternet : Error()
  31. class Unknown(val throwable: Throwable) : Error()
  32.  
  33. }
  34.  
  35. private fun BetterApiUsage() {
  36.  
  37. val api = BetterApi()
  38. val credentials = Credentials(username = "Zak", password = "designForErrorsReportDefects")
  39.  
  40. val response: LoginResponse = api.login(credentials)
  41.  
  42. if (response.isSuccessful) {
  43. //handle successful login
  44. } else {
  45. val error: LoginResponse.Error = response.error!!
  46. //handle each of the three possible error cases
  47. error.handle(
  48. { invalidCredentials: LoginResponse.InvalidCredentials -> TODO() },
  49. { noInternet: LoginResponse.NoInternet -> TODO() },
  50. { unknown: LoginResponse.Unknown -> TODO() }
  51. )
  52. }
  53.  
  54. fun observe(): Observable<LoginResponse> = Observable.just(response)
  55.  
  56. fun observeSuccessful(): Observable<User> {
  57. return observe()
  58. .filter { response: BetterApi.LoginResponse -> response.isSuccessful }
  59. .map { response: BetterApi.LoginResponse -> response.user!! }
  60. }
  61.  
  62. fun observeErrors(): Observable<BetterApi.LoginResponse.Error> {
  63. return observe()
  64. .filter { response: BetterApi.LoginResponse -> !response.isSuccessful }
  65. .map { response -> response.error!! }
  66. }
  67.  
  68. observeSuccessful().subscribe { user: User ->
  69. //handle successful login
  70. }
  71.  
  72. observeErrors().subscribe { error: BetterApi.LoginResponse.Error ->
  73. //handle different types of errors
  74. error.handle(
  75. { invalidCredentials -> TODO() },
  76. { noInternet -> TODO() },
  77. { unknown -> TODO() }
  78. )
  79. }
  80. }
  81.  
  82. private fun BetterApi.LoginResponse.Error.handle(
  83. invalidCredentials: (BetterApi.LoginResponse.InvalidCredentials) -> Nothing,
  84. noInternet: (BetterApi.LoginResponse.NoInternet) -> Nothing,
  85. unknown: (BetterApi.LoginResponse.Unknown) -> Nothing
  86. ) {
  87. if (this is BetterApi.LoginResponse.Error) {
  88. invalidCredentials.invoke(this as BetterApi.LoginResponse.InvalidCredentials)
  89.  
  90. } else if (this is BetterApi.LoginResponse.NoInternet) {
  91. noInternet.invoke((this as BetterApi.LoginResponse.NoInternet))
  92.  
  93. } else if (this is BetterApi.LoginResponse.Unknown) {
  94. unknown.invoke((this as BetterApi.LoginResponse.Unknown))
  95. } else {
  96. throw AssertionError("you did not implement all possible error scenarios")
  97. }
  98. }
  99. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement