К сожалению, сообщение об ошибке, когда задействованы такие сложные импликации и макросы, далеко от совершенства. Сообщение, которое вы видите, на самом деле означает, что некоторые требуемые последствия для реального генератора (MkShow.genericDerivedShowProduct
в данном случае) не были найдены, и поиск вернулся к некоторым базовым вещам, где есть неоднозначность. А то, чего не хватает, в основном очень простое, например неявное для Show[Int]
или Show[String]
. Самый простой способ получить их все - это import cats.implicits._
, но это также принесет catsStdShowForDuration
, то есть Show[Duration]
. Но поскольку его реализация действительно такая же, как и ваша, ее проще удалить. Еще одна вещь, которой не хватает, это Show[NonEmptyString]
, и ее легко создать
implicit def showNonEmptyString: Show[NonEmptyString] = Show.show(nes => nes)
Подводя итог, когда я определяю ваш showConfig
как
implicit val showConfig: Show[Config] = {
import cats.implicits._
// is already defined in cats.implicits._
//implicit val showDuration: Show[Duration] = Show.fromToString
implicit val showInetAddress: Show[InetAddress] = Show.fromToString
implicit def showEnumEntry[E <: EnumEntry]: Show[E] = Show.show(_.entryName)
implicit def showNonEmptyString: Show[NonEmptyString] = Show.show(nes => nes)
// Show.show[Config](x => s"api = ${x.api} appName = ${x.appName} environment ${x.environment}")
semi.show
}
это компилируется для меня.
P.S. есть ли веская причина, по которой вы положили AppEnvironment
в пакет ciris.*
? Я бы сказал, что в целом размещение вашего пользовательского кода в пакетах сторонней библиотеки - это простой способ испортить ситуацию.