Превращение строки в запечатанную черту, используя дымоход scala - PullRequest
4 голосов
/ 25 марта 2020
sealed trait Mode
object Mode {
  case object On extends Mode
  case object Off extends Mode
}

import io.scalaland.chimney.dsl._
"On".into[Mode].?????

Я пытался использовать withCoproductInstance, но не могу найти правильный путь

Ответы [ 2 ]

2 голосов
/ 26 марта 2020

То, что вы делаете, не является автоматическим преобразованием c на основе типов между двумя моделями данных, которые являются ADT (класс случая или запечатанный), java bean, et c или их наборы, сгенерированные безопасно при компиляции -time

Это String анализ. (Выполнено во время выполнения, поэтому возможно, что оно потерпит неудачу). Если вы часто разбираете имена перечислений в значения перечислений, я предлагаю использовать enumeratum (он также поддерживает многие другие операции над перечислениями)

import enumeratum._

sealed trait Mode extends EnumEntry

object Mode extends Enum[Mode] {
  val values = findValues

  case object On  extends Mode
  case object Off extends Mode
}

Mode.withName("On")

Это просто не вариант использования Chimney - и я говорю это как один из соавторов Chimney.

В качестве альтернативы, если вы не хотите изменять существующий код, вы можете получить класс типов для обработки всех видов реализаций перечислений, используя enumz (отказ от ответственности, я написал вещь)

io.scalaland.enumz.Enum

Enum[Mode].withName("On")
2 голосов
/ 25 марта 2020

Из коробки Chimney, кажется, преобразует классы дел в классы дел и иерархии запечатанных признаков в иерархии запечатанных признаков , а не строки в иерархии запечатанных признаков. Вы можете написать макрос или использовать Shapeless.

"On".transformInto[Mode]

//Error:Chimney can't derive transformation from String to App.Mode
//App.Mode
//  derivation from string: java.lang.String to App.Mode is not supported in Chimney!
//Consult https://scalalandio.github.io/chimney for usage examples.

import shapeless.ops.union.Selector
import shapeless.{Coproduct, LabelledGeneric}

def selectByName[A] = new PartiallyApplied[A]

class PartiallyApplied[A] {
  def apply[C <: Coproduct, S <: Symbol, V](s: S)(implicit
    gen: LabelledGeneric.Aux[A, C],
    sel: Selector.Aux[C, S, V],
    witness: ValueOf[V]
  ): V = witness.value
}

selectByName[Mode](toSymbol("On")) // On

import scala.reflect.macros.whitebox

def toSymbol(s: String): Symbol = macro impl

def impl(c: whitebox.Context)(s: c.Tree): c.Tree = {
  import c.universe._
  q"""
     import _root_.shapeless.syntax.singleton._
     _root_.scala.Symbol.apply($s).narrow
   """
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...