2016-09-22 3 views
1

Я пишу REST api с помощью спрея и с некоторыми трудностями с json marshalling. Мой сервис возвращает cats.data.Xor [Failure, Success]. Как я могу вернуть этот тип данных из конечной точки REST? Как написать ответ marshaller для этого?спрей marshalling cats.data.Xor

ответ

0

Самое простое решение - просто позвонить toEither по значению в вашем маршрутизаторе, что позволяет взять на себя спрей Either marshaller.

Другим решением было бы обеспечить собственный маршаллер (я сделал это несколько раз сам):

import cats.data.Xor 
import spray.httpx.marshalling.ToResponseMarshaller 

implicit def xorMarshaller[A, B](implicit 
    ma: ToResponseMarshaller[A], 
    mb: ToResponseMarshaller[B] 
): ToResponseMarshaller[Xor[A, B]] = 
    ToResponseMarshaller[Xor[A, B]] { (value, ctx) => 
    value match { 
     case Xor.Left(a) => ma(a, ctx) 
     case Xor.Right(b) => mb(b, ctx) 
    } 
    } 

Это позволяет избежать как стоимость выполнения (вероятно, ничтожна) и синтаксический стоимость (за вычетом пренебрежимо малой) преобразования.

Обратите внимание, что кошки является удаление Xor в пользу стандартной библиотеки Either в будущих версиях, хотя, так что просто идти с toEither сейчас может быть наиболее практичным решением.

Смежные вопросы