Как установить Rx Action Consumer в Kotlin DSL - PullRequest
0 голосов
/ 28 марта 2019

Я изучаю разработку Kotlin DSL для RxKotlin команд

У меня что-то работает, но я бы хотел улучшить свой подход к настройке Rx Action (s) и Consumer (s).

Код, который я сейчас имею, похож на этот: -

@SequenceDsl
class ExperimentalBuilder {

    companion object {
        private val emptyAction = Action { }
        private val emptyConsumer: Consumer<in Throwable> = Consumer { }
    }


    var uuid: String = ""
    var onError: Consumer<in Throwable> = emptyConsumer
    var onComplete: Action = emptyAction
    var doFinally: Action = emptyAction
    var doLoginRefreshFail: Action = emptyAction

    fun build(): Experimental = Experimental(uuid, onError, onComplete, doFinally, doLoginRefreshFail)

}

import io.reactivex.Single
import io.reactivex.functions.Action
import io.reactivex.functions.Consumer
import io.reactivex.schedulers.Schedulers

data class Experimental(
    val uuid: String,
    val onError: Consumer<in Throwable>,
    val onComplete: Action,
    val doFinally: Action,
    val doLoginRefreshFail: Action
) : Morpheme() {

    override fun execute() {

        Single.just("")
            .subscribeOn(Schedulers.single())
            .ignoreElement()
            .doOnSubscribe {disposable -> COMPOSITE_DISPOSABLE.add(disposable) }
            .doOnComplete(onComplete)
            .doOnError(onError)
            .doFinally(doFinally)
            .doAfterTerminate(doAfterTerminate())
            .subscribe()
    }
}

и я использую этот код следующим образом: -

  val experimental = Dsl().experimental {
            uuid = "09876"

            onComplete = Action {
                Log.d("EXPERIMENT", "ON COMPLETE")
                Log.d("EXPERIMENT", "ON COMPLETE")
            }

            onError = Consumer {
                    throwable -> Log.e("EXPERIMENT", "ON ERROR", throwable)
            }

            doFinally =  Action {
                Log.d("EXPERIMENT", "DO FINALLY")
            }

            doLoginRefreshFail =  Action {
                Log.d("EXPERIMENT", "DO LOGIN REFRESH FAIL")
            }
        }

        experimental.execute()

        Log.d("DSL", "what $experimental")

Код, который я хотел бы «улучшить», заключается в следующем: при установке Action или Consumer

  onComplete = Action {
    Log.d("EXPERIMENT", "ON COMPLETE")
    Log.d("EXPERIMENT", "ON COMPLETE")
  }

  onError = Consumer {
    throwable -> Log.e("EXPERIMENT", "ON ERROR", throwable)
  }

Это единственный метод, который я могу использовать для установки действия "onCompile"?

например. Нужно ли упоминать «Action {}» или есть «сокращенная» версия, которую я могу использовать для достижения того же результата?

1 Ответ

1 голос
/ 28 марта 2019

вы можете определить такие функции в DSL

fun onComplete(onCompleteCallback: ()->Unit) {
  onComplete = Action(onCompleteCallback)
}

, который можно использовать так:

onComplete {
    Log.d("EXPERIMENT", "ON COMPLETE")
    Log.d("EXPERIMENT", "ON COMPLETE")
}

я надеюсь, что не будет слишком много тех, кому это нужно

часто kotlin может помочь с преобразованием SAM, но, похоже, это действительно применимо только к вызовам функций, а не к настройке напрямую. и как только вы сможете определить функцию, вы можете также убедиться, что упаковка сделана правильно Также рассмотрите возможность выполнения этих функций inline

...