in ratatool-shapeless/src/main/scala/com/spotify/ratatool/shapeless/CaseClassDiffy.scala [163:178]
override def apply(x: T, y: T): Seq[Delta] =
diff(Some(asMap(x)), Some(asMap(y)))
.filter(f => !hnilIgnore.exists(f.field.contains(_)))
private def hnilIgnore = ignore ++ Set(HNil.toString)
private def diff(left: Any, right: Any, pref: String = ""): Seq[Delta] = {
def diffMap(left: Map[String, Any], right: Map[String, Any], pref: String = pref) =
(left.keySet ++ right.keySet).toSeq
.flatMap(k => diff(left.get(k), right.get(k), if (pref.isEmpty) k else s"$pref.$k"))
(left, right) match {
case (Some(l: Map[String, Any]), Some(r: Map[String, Any])) => diffMap(l, r, pref)
case (Some(l), Some(r)) => Seq(Delta(pref, Option(l), Option(r), delta(l, r)))
}
}