OpenURLAction.swift 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. import Foundation
  2. /// Opens a URL with the default application.
  3. ///
  4. /// May present an application picker if multiple applications are registered
  5. /// for the given URL protocol.
  6. @MainActor
  7. public struct OpenURLAction {
  8. let action: (URL) -> Void
  9. init<Backend: BaseAppBackend>(backend: Backend) {
  10. action = { url in
  11. guard let backend = backend as? any BackendFeatures.ExternalURLs else {
  12. logger.warnOnce(Logger.Message(stringLiteral: "\(type(of: backend)) doesn't support opening URLs"))
  13. return
  14. }
  15. do {
  16. try backend.openExternalURL(url)
  17. } catch {
  18. logger.warning(
  19. "failed to open external url",
  20. metadata: [
  21. "url": "\(url)",
  22. "error": "\(error)",
  23. ]
  24. )
  25. }
  26. }
  27. }
  28. /// Opens a URL with the default application.
  29. ///
  30. /// - Parameter url: The URL to open.
  31. public func callAsFunction(_ url: URL) {
  32. action(url)
  33. }
  34. }