Как установить Rx Action Consumer в Kotlin DSL

#kotlin #dsl #rx-kotlin2

#kotlin #dsl #rx-kotlin2

Вопрос:

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

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

Код, который у меня есть в настоящее время, напоминает этот:-

 @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:

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

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

это можно было бы использовать следующим образом:

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

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

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