// // Router+Extensions.swift // App // // Created by Christoph on 05.05.20. // import Vapor extension Router { func getCatching(_ path: PathComponentsRepresentable..., call: @escaping (Request) throws -> T) { self.get(path) { (request: Request) -> HTTPResponse in catching(path, request: request, closure: call) } } func postCatching(_ path: PathComponentsRepresentable..., call: @escaping (Request) throws -> T) { self.post(path) { (request: Request) -> HTTPResponse in catching(path, request: request, closure: call) } } } private func catching(_ 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)" } } }