metatext/MastodonAPI/Sources/MastodonAPI/Endpoints/ResultsEndpoint.swift
2021-05-09 22:10:14 -07:00

104 lines
2.6 KiB
Swift

// Copyright © 2020 Metabolist. All rights reserved.
import Foundation
import HTTP
import Mastodon
public enum ResultsEndpoint {
case search(Search)
}
public extension ResultsEndpoint {
struct Search {
public let query: String
public let type: SearchType?
public let excludeUnreviewed: Bool
public let resolve: Bool
public let limit: Int?
public let offset: Int?
public let following: Bool
public init(query: String,
type: SearchType? = nil,
excludeUnreviewed: Bool = false,
resolve: Bool = true,
limit: Int? = nil,
offset: Int? = nil,
following: Bool = false) {
self.query = query
self.type = type
self.excludeUnreviewed = excludeUnreviewed
self.resolve = resolve
self.limit = limit
self.offset = offset
self.following = following
}
}
}
public extension ResultsEndpoint.Search {
enum SearchType: String {
case accounts
case hashtags
case statuses
}
}
extension ResultsEndpoint: Endpoint {
public typealias ResultType = Results
public var APIVersion: String {
switch self {
case .search:
return "v2"
}
}
public var pathComponentsInContext: [String] {
switch self {
case .search:
return ["search"]
}
}
public var method: HTTPMethod {
switch self {
case .search:
return .get
}
}
public var queryParameters: [URLQueryItem] {
switch self {
case let .search(search):
var params = [URLQueryItem(name: "q", value: search.query)]
if let type = search.type {
params.append(.init(name: "type", value: type.rawValue))
}
if search.excludeUnreviewed {
params.append(.init(name: "exclude_unreviewed", value: "true"))
}
if search.resolve {
params.append(.init(name: "resolve", value: "true"))
}
if let limit = search.limit {
params.append(.init(name: "limit", value: String(limit)))
}
if let offset = search.offset {
params.append(.init(name: "offset", value: String(offset)))
}
if search.following {
params.append(.init(name: "following", value: "true"))
}
return params
}
}
}