Advertisement
Guest User

Untitled

a guest
Dec 10th, 2016
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.47 KB | None | 0 0
  1. package swag
  2.  
  3. import com.typesafe.config.Config
  4. import shapeless._
  5. import shapeless.labelled._
  6.  
  7.  
  8. object FromConfig {
  9. sealed trait Error
  10.  
  11. //case class FieldMissing(fieldName: String) extends Error
  12. //case class WrongType(fieldName: String) extends Error
  13.  
  14. def instance[A](f: String => Config => A) = new FromConfig[A] {
  15. override def read(path: String)(implicit conf: Config): A = f(path)(conf)
  16. }
  17.  
  18. implicit val strConfig: FromConfig[String] = instance(path => conf => conf.getString(path) )
  19. implicit val intConfig: FromConfig[Int] = instance(path => conf => conf.getInt(path) )
  20. implicit val fromConfigHNil: FromConfig[HNil] = instance(path => conf => HNil)
  21.  
  22. implicit def fromConfigHlist[K <: Symbol, H, T <: HList](implicit witness: Witness.Aux[K],
  23. hDec: FromConfig[H],
  24. tDec: FromConfig[T])
  25. : FromConfig[FieldType[K, H] :: T] = instance { path => implicit conf =>
  26. val hName = witness.value.name
  27. val h = field[K](hDec.read(path + "." + hName))
  28. val t = tDec.read(path)
  29. h :: t
  30. }
  31.  
  32. implicit def fromConfigGen[A,B](implicit gen: LabelledGeneric.Aux[A, B],
  33. bDec: FromConfig[B]): FromConfig[A] = instance { path => implicit conf =>
  34. gen.from(bDec.read(path))
  35. }
  36.  
  37. def read[A: FromConfig](root: String, conf: Config): A =
  38. implicitly[FromConfig[A]].read(root)(conf)
  39.  
  40. }
  41.  
  42.  
  43. trait FromConfig[A] {
  44. def read(path: String)(implicit conf: Config): A
  45. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement