Không có gì trong Servant để thực hiện việc này ra khỏi hộp, tuy nhiên tất cả các bộ phận cần thiết đều có sẵn.
Trước khi chúng tôi bắt đầu, tôi đoán rằng nếu bạn có thể truyền đến một Sink, có nghĩa là bạn có một nguồn (gorsBody
của GetObjectResponse
là một RsBody
, mà là một Source)
Trước hết, Servant cho chúng ta với khả năng thêm hỗ trợ cho các loại trả lại mới, bằng cách tạo một phiên bản mới của HasServer
, vì vậy chúng tôi có thể phân phát một số EitherT ServantErr IO (Source ...)
và phát trực tuyến.
Để tạo trường hợp đó, chúng tôi phải triển khai route :: Proxy layout -> Server layout -> RoutingApplication
. Server layout
, trong trường hợp này, chỉ có nghĩa là EitherT ServantErr IO layout
, layout
là nguồn chúng tôi muốn máy chủ, do đó, đó là hàm trả về nguồn (và có thể không thành công với lỗi HTTP).
Chúng tôi phải trả lại RoutingApplication
, là (theo kiểu tiếp tục) một hàm mất Request
và trả lại RouteResult Response
, có nghĩa là lỗi lỗi chưa từng có hoặc phản hồi. Cả hai Request
và Response
đều là tiêu chuẩn không phải là Servant, vì vậy bây giờ chúng ta có thể xem phần còn lại của hệ sinh thái để tìm cách triển khai nó.
May mắn thay, chúng tôi không cần phải đi xa: Network.Wai.Conduit
chứa chỉ là những gì chúng ta cần phải thực hiện các chức năng route
: responseSource
mất một giá trị tình trạng, một số tiêu đề phản ứng và nguồn của bạn và cung cấp cho bạn một Response
.
Vì vậy, đó là khá nhiều việc phải làm, nhưng mọi thứ chúng tôi cần đều có. Tìm kiếm source of the instance HasServer * (Get ...)
có thể hữu ích.
Hiện tại, có PR trong Servant để thêm "Hỗ trợ điểm cuối dòng". https://github.com/haskell-servant/servant/pull/836 – erewok