The "get" DSL produces an internal failure if it finds a setter.
The "set" DSL produces an unhelpful error message if it finds a getter or fold.
case class Potato(i: Int)
case class Banana(p: Potato)
case class Beetroot(b: Banana)
val getBanana = monocle.Getter[Beetroot, Banana](_.b)
val setBanana = monocle.Setter[Beetroot, Banana](f => br => br.copy(b = f(br.b)))
val foldBanana = new monocle.Fold[Beetroot, Banana] { def foldMap[M: scalaz.Monoid](f: Banana => M)(br: Beetroot): M = f(br.b)}
val br = Beetroot(Banana(Potato(4)))
scala> get"$br.$setBanana.p.i"
<console>:20: error: The macro internally failed to get values from optic Setter.
Please consider filing an issue at https://github.com/kenbot/goggles/issues.
get"$br.$setBanana.p.i"
scala> set"$br.$getBanana.p.i" := 5
<console>:20: error: value asSetter is not a member of monocle.Getter[Unit,Int]
set"$br.$getBanana.p.i" := 5
^
scala> set"$br.$foldBanana.p.i"
<console>:20: error: value asSetter is not a member of monocle.Fold[Unit,Int]
set"$br.$foldBanana.p.i"
get"$br.$setBanana and set"$br.$getBanana are minimal test cases. It's fixed now; there are new MacroUserErrors GetterOpticRequired and SetterOpticRequired.