Skip to content

Commit

Permalink
add get content to request
Browse files Browse the repository at this point in the history
  • Loading branch information
paulofaria committed May 17, 2017
1 parent 075893d commit 22dc8a5
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 5 deletions.
16 changes: 11 additions & 5 deletions Sources/Core/Parameters/Parameters.swift
Original file line number Diff line number Diff line change
Expand Up @@ -22,15 +22,21 @@ public protocol ParametersInitializable {
}

extension URI.Parameters {
public mutating func set(_ parameter: String, for parameterKey: String) {
parameters[parameterKey] = parameter
public mutating func set(_ parameter: String, for key: String) {
parameters[key] = parameter
}

public func get<P : LosslessStringConvertible>(_ parameterKey: String) throws -> P {
guard let string = parameters[parameterKey] else {
throw ParametersError.valueNotFound(key: parameterKey, parameters: self)
public func get(_ key: String) throws -> String {
guard let string = parameters[key] else {
throw ParametersError.valueNotFound(key: key, parameters: self)
}

return string
}

public func get<P : LosslessStringConvertible>(_ key: String) throws -> P {
let string = try get(key)

guard let parameter = P(string) else {
throw ParametersError.cannotInitialize(type: P.self, parameter: string)
}
Expand Down
34 changes: 34 additions & 0 deletions Sources/HTTP/Request/Request.swift
Original file line number Diff line number Diff line change
Expand Up @@ -206,8 +206,42 @@ extension Request : CustomStringConvertible {
}
}

// TODO: Make error CustomStringConvertible and ResponseRepresentable
public enum RequestContentError : Error {
case noReadableBody
case noContentTypeHeader
case unsupportedMediaType
}

extension Request {
public func getParameters<P : ParametersInitializable>() throws -> P {
return try P(parameters: uri.parameters)
}

public func getContent(
_ contentType: ContentType,
deadline: Deadline = 5.minutes.fromNow()
) throws -> Content {
guard let mediaType = self.contentType else {
throw RequestContentError.noContentTypeHeader
}

guard mediaType == contentType.mediaType else {
throw RequestContentError.unsupportedMediaType
}

guard let stream = body.readable else {
throw RequestContentError.noReadableBody
}

return try contentType.parser.parse(stream, deadline: deadline)
}

public func getContent<C : ContentInitializable>(
_ contentType: ContentType,
deadline: Deadline = 5.minutes.fromNow()
) throws -> C {
let content = try getContent(contentType, deadline: deadline)
return try C(content: content)
}
}

0 comments on commit 22dc8a5

Please sign in to comment.