Skip to content

Instantly share code, notes, and snippets.

@lawloretienne
Created August 27, 2019 06:12
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lawloretienne/d7b7353d36ed76b9e62d1d250b80cd28 to your computer and use it in GitHub Desktop.
Save lawloretienne/d7b7353d36ed76b9e62d1d250b80cd28 to your computer and use it in GitHub Desktop.
package com.getsomeheadspace.android.foundation.utils
// https://proandroiddev.com/briefly-about-rxjava-logging-20308b013e6d
import io.reactivex.*
import timber.log.Timber
inline fun <reified T> printEvent(tag: String, success: T?, error: Throwable?) =
when {
success == null && error == null -> Timber.d("$tag Complete") /* Only with Maybe */
success != null -> Timber.d("$tag Success $success")
error != null -> Timber.d("$tag Error $error")
else -> -1 /* Cannot happen*/
}
inline fun printEvent(tag: String, error: Throwable?) =
when {
error != null -> Timber.d("$tag Error $error")
else -> Timber.d("$tag Complete")
}
/**
* Example usage of [log]:
Single.timer(1, TimeUnit.SECONDS)
.log()
.subscribe({ }, { })
*/
inline fun tag() =
Thread.currentThread().stackTrace
.first { it.fileName.endsWith(".kt") }
.let { stack -> "${stack.fileName.removeSuffix(".kt")}$${stack.methodName}:${stack.lineNumber}:" }
inline fun <reified T> Single<T>.log(): Single<T> {
val tag = tag()
return doOnEvent { success, error -> printEvent(tag, success, error) }
.doOnSubscribe { Timber.d("$tag Subscribe") }
.doOnDispose { Timber.d("$tag Dispose") }
}
inline fun <reified T> Maybe<T>.log(): Maybe<T> {
val tag = tag()
return doOnEvent { success, error -> printEvent(tag, success, error) }
.doOnSubscribe { Timber.d("$tag Subscribe") }
.doOnDispose { Timber.d("$tag Dispose") }
}
inline fun Completable.log(): Completable {
val tag = tag()
return doOnEvent { printEvent(tag, it) }
.doOnSubscribe { Timber.d("$tag Subscribe") }
.doOnDispose { Timber.d("$tag Dispose") }
}
inline fun <reified T> Observable<T>.log(): Observable<T> {
val line = tag()
return doOnEach { Timber.d("$line Each $it") }
.doOnSubscribe { Timber.d("$line Subscribe") }
.doOnDispose { Timber.d("$line Dispose") }
}
inline fun <reified T> Flowable<T>.log(): Flowable<T> {
val line = tag()
return doOnEach { Timber.d("$line Each $it") }
.doOnSubscribe { Timber.d("$line Subscribe") }
.doOnCancel { Timber.d("$line Cancel") }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment