RedditSubmitURLBuilder.swift 2.0 KB

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