@@ -23,22 +23,41 @@ import language.existentials
23
23
/** Wraps a Kafka `Decoder`, provided for
24
24
* convenience, since it can be implicitly fetched
25
25
* from the context.
26
+ *
27
+ * @param className is the full package path to the Kafka `Decoder`
28
+ *
29
+ * @param classType is the actual [[Class ]] for [[className ]]
30
+ *
31
+ * @param constructor creates an instance of [[classType ]].
32
+ * This is defaulted with a `Deserializer.Constructor[A]` function that creates a
33
+ * new instance using an assumed empty or nullable constructor.
34
+ * Supplying this parameter allows for manual provision of the `Decoder`.
26
35
*/
27
36
final case class Deserializer [A ](
28
37
className : String ,
29
- classType : Class [_ <: KafkaDecoder [A ]]) {
38
+ classType : Class [_ <: KafkaDecoder [A ]],
39
+ constructor : Deserializer .Constructor [A ] = Deserializer .reflectCreate[A ] _) {
30
40
31
41
/** Creates a new instance. */
32
- def create (): KafkaDecoder [A ] = {
33
- val constructor = classType.getDeclaredConstructors()(0 )
42
+ def create (): KafkaDecoder [A ] =
43
+ constructor(this )
44
+ }
45
+
46
+ object Deserializer {
47
+
48
+ /** Alias for the function that provides an instance of
49
+ * the Kafka `Decoder`.
50
+ */
51
+ type Constructor [A ] = (Deserializer [A ]) => KafkaDecoder [A ]
52
+
53
+ private def reflectCreate [A ](d : Deserializer [A ]): KafkaDecoder [A ] = {
54
+ val constructor = d.classType.getDeclaredConstructors()(0 )
34
55
constructor.getParameterCount match {
35
- case 0 => classType.newInstance()
56
+ case 0 => d. classType.newInstance()
36
57
case 1 => constructor.newInstance(null ).asInstanceOf [KafkaDecoder [A ]]
37
58
}
38
59
}
39
- }
40
60
41
- object Deserializer {
42
61
implicit val forStrings : Deserializer [String ] =
43
62
Deserializer (
44
63
className = " kafka.serializer.StringDecoder" ,
0 commit comments