1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
|
{-# LANGUAGE LambdaCase #-}
{-|
Module : Web.Browser
Description : Open a web browser from Haskell
Copyright : (c) rightfold 2015
License : BSD3
Maintainer : public@pilgrem.com
Open a web browser from Haskell. Supported operating systems are Windows, macOS,
Linux and BSD.
-}
module Web.Browser
( openBrowser
-- * Utilities
, openBrowserWithExitCode
) where
import Control.Exception ( Exception (..), SomeException, try)
import System.Exit ( ExitCode (..) )
import qualified Web.Browser.OS as OS
-- | Seeks to open the given item, silently. If the item is a URL or another
-- item associated with a web browser (for example, it represents a local
-- @.html@ file), seeks to open it in the user's preferred web browser. Returns
-- whether or not the operation succeeded.
--
-- No checks are performed on the nature or validity of the given item.
--
-- Implemented using:
--
-- * on Windows, the \'open\' operation provided by the Win32 API. For an item
-- that represents a file, equivalent double-clicking on the file's icon;
--
-- * on macOS, the \'open\' application, if it is on the user's PATH. For an
-- item that represents a file, equivalent to double-clicking on the file's
-- icon; and
--
-- * on Linux, FreeBSD, OpenBSD or NetBSD, the \'xdg-open\' script, if it
-- is on the user's PATH.
--
-- On other operating systems, the operation always fails.
--
-- @since 0.1.0.0
openBrowser ::
String
-- ^ URL or other item to try to open.
-> IO Bool
openBrowser url = tryOpenUrl >>= \case
Left _ -> pure False
Right (ec, _, _) -> pure $ ec == ExitSuccess
where
tryOpenUrl :: IO (Either SomeException (ExitCode, String, String))
tryOpenUrl = openBrowserWithExitCode url
-- | Exported to help with debugging. As for 'openBrowser' but returns either an
-- exception or, as a triple, the 'ExitCode' of the opening mechanism and any
-- output to the standard output and standard error channels. On failure, the
-- meaning of the exit code will depend on the operating system; for unsupported
-- operating systems, it will be 'ExitFailure' @1@.
--
-- @since 0.4.0.0
openBrowserWithExitCode ::
Exception e
=> String
-- ^ URL or other item to try to open.
-> IO (Either e (ExitCode, String, String))
openBrowserWithExitCode url = try $ OS.openBrowserWithExitCode url
|