in neo4j/src/main/scala/magnolify/neo4j/ValueType.scala [66:99]
def join[T](caseClass: CaseClass[Typeclass, T]): ValueField[T] = {
if (caseClass.isValueClass) {
val p = caseClass.parameters.head
val tc = p.typeclass
new ValueField[T] {
override def from(v: Value)(cm: CaseMapper): T = caseClass.construct(_ => tc.from(v)(cm))
override def to(v: T)(cm: CaseMapper): Value = tc.to(p.dereference(v))(cm)
}
} else {
new Record[T] {
override def from(v: Value)(cm: CaseMapper): T =
caseClass.construct { p =>
val field = cm.map(p.label)
try {
p.typeclass.from(v.get(field))(cm)
} catch {
case e: ValueException =>
throw new RuntimeException(s"Failed to decode $field: ${e.getMessage}", e)
}
}
override def to(v: T)(cm: CaseMapper): Value = {
val jmap = caseClass.parameters
.foldLeft(Map.newBuilder[String, AnyRef]) { (m, p) =>
m += cm.map(p.label) -> p.typeclass.to(p.dereference(v))(cm)
m
}
.result()
.asJava
Values.value(jmap)
}
}
}
}