RedditSubmitURLBuilder.swift 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. import Foundation
  2. enum RedditSubmitURLBuilder {
  3. static func submitURL(for draft: PostDraft) throws -> URL {
  4. try PostDraftValidator.validateForExport(draft)
  5. let subreddit = PostDraftValidator.normalizedSubreddit(draft.subreddit)
  6. var components = URLComponents()
  7. components.scheme = "https"
  8. components.host = "www.reddit.com"
  9. components.path = "/r/\(subreddit)/submit"
  10. var queryItems = [
  11. URLQueryItem(name: "title", value: draft.title.trimmingCharacters(in: .whitespaces)),
  12. ]
  13. switch draft.postType {
  14. case .text:
  15. queryItems.append(URLQueryItem(name: "selftext", value: "true"))
  16. let body = draft.body.trimmingCharacters(in: .whitespaces)
  17. if !body.isEmpty {
  18. queryItems.append(URLQueryItem(name: "text", value: body))
  19. }
  20. case .link:
  21. queryItems.append(
  22. URLQueryItem(name: "url", value: draft.linkURL.trimmingCharacters(in: .whitespaces))
  23. )
  24. case .image, .video, .poll:
  25. queryItems.append(URLQueryItem(name: "selftext", value: "true"))
  26. let body = draft.body.trimmingCharacters(in: .whitespaces)
  27. if !body.isEmpty {
  28. queryItems.append(URLQueryItem(name: "text", value: body))
  29. }
  30. }
  31. components.queryItems = queryItems
  32. guard let url = components.url else {
  33. throw PostDraftValidationError.invalidSubreddit
  34. }
  35. return url
  36. }
  37. }