File: Browser.hs

package info (click to toggle)
haskell-open-browser 0.4.0.0-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 92 kB
  • sloc: haskell: 114; makefile: 2
file content (69 lines) | stat: -rw-r--r-- 2,422 bytes parent folder | download
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