57 lines
1.6 KiB
Swift
57 lines
1.6 KiB
Swift
|
//
|
||
|
// Router+Extensions.swift
|
||
|
// App
|
||
|
//
|
||
|
// Created by Christoph on 05.05.20.
|
||
|
//
|
||
|
|
||
|
import Vapor
|
||
|
|
||
|
extension Router {
|
||
|
|
||
|
func getCatching<T>(_ path: PathComponentsRepresentable..., call: @escaping (Request) throws -> T) {
|
||
|
self.get(path) { (request: Request) -> HTTPResponse in
|
||
|
catching(path, request: request, closure: call)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func postCatching<T>(_ path: PathComponentsRepresentable..., call: @escaping (Request) throws -> T) {
|
||
|
self.post(path) { (request: Request) -> HTTPResponse in
|
||
|
catching(path, request: request, closure: call)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private func catching<T>(_ path: PathComponentsRepresentable..., request: Request, closure: @escaping (Request) throws -> T) -> HTTPResponse {
|
||
|
|
||
|
let route = path.convertToPathComponents().map { $0.string }.joined(separator: "/")
|
||
|
do {
|
||
|
let data = try closure(request)
|
||
|
if let d = data as? Data {
|
||
|
return HTTPResponse(status: .ok, body: d)
|
||
|
} else {
|
||
|
return HTTPResponse(status: .ok)
|
||
|
}
|
||
|
} catch let error as CapError {
|
||
|
log("\(route): Error \(error)")
|
||
|
return HTTPResponse(status: error.response)
|
||
|
} catch {
|
||
|
log("\(route): Unhandled error \(error)")
|
||
|
return HTTPResponse(status: .internalServerError)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
extension PathComponent {
|
||
|
|
||
|
var string: String {
|
||
|
switch self {
|
||
|
case .constant(let value):
|
||
|
return value
|
||
|
case .parameter(let value):
|
||
|
return "<\(value)>"
|
||
|
default:
|
||
|
return "\(self)"
|
||
|
}
|
||
|
}
|
||
|
}
|