Решение для создания операций чтения для вашего основного объекта:
implicit val userSigninReads : Reads[UserSignin] =
(JsPath \ "signin-info").read[UserSigninInfo].map(UserSignin(_))
Это потому, что оно имеет только одно поле.
Ваша конструкция была существенно:
((JsPath \ "signin-info").read[UserSigninInfo])(UserSignin.apply _)
, который просто
(JsPath \ "signin-info").read[UserSigninInfo](UserSignin.apply _)
, потому что он просто добавляет дополнительный ()
.
read
метод действительно имеет две альтернативы:
def read[T](t: T) = Reads.pure(t)
def read[T](implicit r: Reads[T]): Reads[T] = Reads.at[T](this)(r)
Он ожидаетлибо неявное чтение, либо явное значение, но вы передаете функцию, поэтому компилятор жалуется.
Когда вы объединяете несколько полей с and
, создается другой объект, например, FunctionalBuilder[M]#CanBuild2[A, B]
для 2 элементов, и у него есть метод apply
для создания окончательного Reads
экземпляра.
Поскольку у вас есть только один объект, вы можете создать Reads
, прочитав UserSigninInfo
с нужного вам пути и поместив результат в UserSignin
с помощью map
.