content: -- |
  -- Module      : $header$
  -- Copyright   : (c) Laurent P René de Cotret, 2019 - present
  -- License     : GNU GPL, version 2 or above
  -- Maintainer  : laurent.decotret@outlook.com
  -- Stability   : internal
  -- Portability : portable
  --
  -- Open a file in its default program.
  module OpenFile (openFile) where
  
  import Data.List (isInfixOf)
  import System.Info (os)
  import System.Process.Typed (proc, runProcess_, shell)
  
  openFile :: FilePath -> IO ()
  openFile
    -- Aliases taken from cabal's Distribution.System module
    | os `elem` ["mingw32", "win32", "cygwin32"] = openFileWindows
    | any (`isInfixOf` os) ["linux", "bsd"] = openFileLinux
    | os `elem` ["darwin"] = openFileMacOS
    | otherwise = error $ "Unsupported OS: " <> os
  
  openFileWindows :: FilePath -> IO ()
  openFileWindows fp =
    -- Call looks like: cmd /c 'start "" "my_filepath.html"'
    runProcess_ $ shell $ mconcat ["cmd /c start ", quoted mempty, " ", quoted fp]
    where
      quoted f = mconcat ["\"", f, "\""]
  
  openFileLinux :: FilePath -> IO ()
  openFileLinux fp =
    runProcess_ (proc "sh" ["-c", "xdg-open \"$0\" 2>&1 > /dev/null", fp])
  
  openFileMacOS :: FilePath -> IO ()
  openFileMacOS fp =
    runProcess_ (proc "open" [fp])
  