2017-10-16 4 views
0

Est-il possible de créer la méthode suivante avec le niveau d'abstraction suivant avec Typesafe Config et pureconfig dans scala? Je suis conscient pour les classes de cas définies que Config Reader doit être spécifié comme follows, en raison de limitations ... mais qu'en est-il de n'importe quel type de classe de cas ... si tous leurs ConfigReaders sont implémentés?n'a pas pu trouver de valeur implicite pour le lecteur de paramètres: pureconfig.ConfigReader [T]

/** 
     * @param path the.path.to.the.branch 
     * @param config the com.typesafe.config obj 
     * @tparam T - the type of the case class obj 
     * @return the filled-in obj of type T 
     * 
     */ 
    def getConfigType[T](path: String, config :Config) :Option[T] = { 

     val renderOpts = ConfigRenderOptions.defaults 
     .setOriginComments(false).setComments(false).setJson(true) 
     val levelConfig :Config = config.getConfig(path) 
     val strConfig: String = config.getConfig(path).root().render(renderOpts) 

     loadConfig[T](ConfigFactory.parseString(strConfig)) match { 
     case Right(objFilledCaseClass) => Some(objFilledCaseClass) 
     case Left(errors) => throw new RuntimeException(s"Invalid configuration: $errors") 
     } 
    } 
    } 

Répondre

1

Je suppose que vous obtenez construire une erreur de temps comme "Erreur: (17, 18) n'a pas pu trouver la valeur implicite pour lecteur de paramètre: pureconfig.ConfigReader [T] loadConfig [T] ... "

L'erreur est que la méthode loadConfig de pureconfig ne trouve pas de valeur implicite pour son paramètre de lecteur. Une solution consiste à donner explicitement le paramètre lecteur implicite. Votre méthode getConfigType peut prendre en paramètre un lecteur implicite, de sorte que l'interface getConfigType se comportera comme si loadConfig se comportait.

Donc, la solution serait de définir l'interface comme:

import pureconfig.{ConfigReader, loadConfig} 
// Is there a reason why return type is Option? Method either returns Some or throws exception 
def getConfigType[ConfigType](path: String, config :Config)(implicit reader: ConfigReader[ConfigType]):ConfigType = 
{ 
... 
loadConfig(ConfigFactory.parseString(strConfig))(reader) match { 
... 
} 
... 
} 

Alors vous l'appelez:

case class YourCustomType() 
import eu.timepit.refined.pureconfig._ 
getConfigType[YourCustomType](path, config) 

J'espère que cela résout votre problème