-
-
Notifications
You must be signed in to change notification settings - Fork 37
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #19 from vapor/typesafe-rework
Parameterizable and type safe routing rework
- Loading branch information
Showing
14 changed files
with
331 additions
and
2,404 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
public protocol Parameterizable { | ||
/// the unique key to use as a slug in route building | ||
static var uniqueSlug: String { get } | ||
|
||
// returns the found model for the resolved url parameter | ||
static func make(for parameter: String) throws -> Self | ||
} | ||
|
||
extension Parameterizable { | ||
/// The key to be used when a result of this type is extracted from a route. | ||
/// | ||
/// Given the following example: | ||
/// | ||
/// ``` | ||
/// drop.get("users", User.parameter) { req in | ||
/// let user = try req.parameters.get(User.self) | ||
/// } | ||
/// | ||
/// ``` | ||
/// | ||
/// the generated route will be /users/**:user** | ||
public static var parameter: String { | ||
return ":" + uniqueSlug | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
import Node | ||
|
||
public final class ParametersContext: Context { | ||
internal static let shared = ParametersContext() | ||
fileprivate init() {} | ||
} | ||
|
||
public let parametersContext = ParametersContext.shared | ||
|
||
public struct Parameters: StructuredDataWrapper { | ||
public static var defaultContext: Context? = parametersContext | ||
public var wrapped: StructuredData | ||
public let context: Context | ||
|
||
public init(_ wrapped: StructuredData, in context: Context? = defaultContext) { | ||
self.wrapped = wrapped | ||
self.context = context ?? parametersContext | ||
} | ||
} | ||
|
||
extension Parameters { | ||
public mutating func next<P: Parameterizable>(_ p: P.Type = P.self) throws -> P { | ||
let error = ParametersError.noMoreParametersFound(forKey: P.uniqueSlug) | ||
guard let param = self[P.uniqueSlug] else { throw error } | ||
|
||
var array = param.array ?? [param] | ||
guard !array.isEmpty else { throw error } | ||
|
||
let rawValue = array.remove(at: 0) | ||
guard let value = rawValue.string else { throw error } | ||
|
||
self[P.uniqueSlug] = .array(array) | ||
return try P.make(for: value) | ||
} | ||
} | ||
|
||
public enum ParametersError: Swift.Error { | ||
case noMoreParametersFound(forKey: String) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.