Files
hsfm/src/IO/Error.hs

122 lines
3.2 KiB
Haskell
Raw Normal View History

2015-12-24 18:25:05 +01:00
{--
HSFM, a filemanager written in Haskell.
Copyright (C) 2015 Julian Ospald
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
version 2 as published by the Free Software Foundation.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
--}
2015-12-17 04:42:22 +01:00
{-# OPTIONS_HADDOCK ignore-exports #-}
{-# LANGUAGE DeriveDataTypeable #-}
-- |Provides error handling.
2015-12-17 04:42:22 +01:00
module IO.Error where
2015-12-21 18:32:53 +01:00
import Control.Applicative
(
(<$>)
)
2015-12-17 04:42:22 +01:00
import Control.Exception
import Control.Monad
(
unless
, void
, when
2015-12-17 04:42:22 +01:00
)
import Data.List
(
isPrefixOf
)
2015-12-17 04:42:22 +01:00
import Data.Typeable
2015-12-18 15:37:14 +01:00
import IO.Utils
import System.Directory
(
doesDirectoryExist
, doesFileExist
)
import System.FilePath
(
equalFilePath
, isAbsolute
, takeFileName
)
2015-12-17 04:42:22 +01:00
2015-12-21 18:32:53 +01:00
import qualified System.Posix.Files as PF
2015-12-17 04:42:22 +01:00
data FmIOException = FileDoesNotExist String
| DirDoesNotExist String
2015-12-17 04:42:22 +01:00
| PathNotAbsolute String
| FileNotExecutable String
| SameFile String String
| NotAFile String
| NotADir String
| DestinationInSource String String
| DirDoesExist String
2015-12-21 18:32:53 +01:00
| IsSymlink String
2015-12-17 04:42:22 +01:00
deriving (Show, Typeable)
instance Exception FmIOException
-- Throws an exception if the filepath is not absolute
-- or the file does not exist.
fileSanityThrow :: FilePath -> IO ()
2015-12-18 15:37:14 +01:00
fileSanityThrow fp = throwNotAbsolute fp >> throwFileDoesNotExist fp
-- Throws an exception if the filepath is not absolute
-- or the dir does not exist.
dirSanityThrow :: FilePath -> IO ()
2015-12-18 15:37:14 +01:00
dirSanityThrow fp = throwNotAbsolute fp >> throwDirDoesNotExist fp
throwNotAbsolute :: FilePath -> IO ()
throwNotAbsolute fp = unless (isAbsolute fp) (throw $ PathNotAbsolute fp)
throwDirDoesExist :: FilePath -> IO ()
2015-12-18 15:37:14 +01:00
throwDirDoesExist fp =
whenM (doesDirectoryExist fp) (throw $ DirDoesExist fp)
throwDirDoesNotExist :: FilePath -> IO ()
2015-12-18 15:37:14 +01:00
throwDirDoesNotExist fp =
unlessM (doesDirectoryExist fp) (throw $ DirDoesNotExist fp)
throwFileDoesNotExist :: FilePath -> IO ()
2015-12-18 15:37:14 +01:00
throwFileDoesNotExist fp =
unlessM (doesFileExist fp) (throw $ FileDoesNotExist fp)
throwSameFile :: FilePath -- ^ should be canonicalized
-> FilePath -- ^ should be canonicalized
-> IO ()
throwSameFile fp1 fp2 = when (equalFilePath fp1 fp2) (throw $ SameFile fp1 fp2)
throwDestinationInSource :: FilePath -- ^ should be canonicalized
-> FilePath -- ^ should be canonicalized
-> IO ()
throwDestinationInSource source dest =
when (source `isPrefixOf` dest) (throw $ DestinationInSource dest source)
2015-12-21 18:32:53 +01:00
throwIsSymlink :: FilePath -> IO ()
throwIsSymlink fp =
whenM (PF.isSymbolicLink <$> PF.getSymbolicLinkStatus fp)
(throw $ IsSymlink fp)