diff options
| author | Akshay Nair <phenax5@gmail.com> | 2025-11-07 12:25:47 +0530 |
|---|---|---|
| committer | Akshay Nair <phenax5@gmail.com> | 2025-11-08 17:09:25 +0530 |
| commit | a16933476187a349d619ab29f73dbcae81c8cb24 (patch) | |
| tree | eab12977c61a2c3b9ac88b22637f5511c21f9d18 /lib/Daffm/State.hs | |
| parent | 6c3f7442b92f2fbf2308d93ece448cf3dd759a58 (diff) | |
| download | daffm-a16933476187a349d619ab29f73dbcae81c8cb24.tar.gz daffm-a16933476187a349d619ab29f73dbcae81c8cb24.zip | |
Show error messages (permission error + path not found + invalid command error)
Diffstat (limited to 'lib/Daffm/State.hs')
| -rw-r--r-- | lib/Daffm/State.hs | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/lib/Daffm/State.hs b/lib/Daffm/State.hs index 040d244..902b6c6 100644 --- a/lib/Daffm/State.hs +++ b/lib/Daffm/State.hs @@ -17,7 +17,7 @@ import qualified Data.Set as Set import qualified Data.Text as Text import qualified Data.Text.Zipper.Generic as Zipper import qualified Data.Vector as Vec -import System.Directory (doesDirectoryExist, doesPathExist, getCurrentDirectory, getHomeDirectory, getSymbolicLinkTarget, listDirectory, makeAbsolute, setCurrentDirectory) +import System.Directory (doesDirectoryExist, doesPathExist, getCurrentDirectory, getHomeDirectory, getPermissions, getSymbolicLinkTarget, listDirectory, makeAbsolute, readable, setCurrentDirectory) import System.FilePath (joinPath, takeDirectory) import System.PosixCompat (fileExist) import qualified System.PosixCompat as Posix @@ -29,6 +29,7 @@ mkEmptyAppState :: Configuration -> AppState mkEmptyAppState config = AppState { stateFiles = L.list FocusMain (Vec.fromList []) 1, + stateMessage = Nothing, stateCmdlineEditor = mkEditor "", stateFocusTarget = FocusMain, stateListPositionHistory = Map.empty, @@ -84,17 +85,34 @@ loadDirToState dir' appState@(AppState {stateCwd, stateListPositionHistory}) = d if Posix.isDirectory stat then (normalizedDir, Nothing) else (textAsString takeDirectory normalizedDir, Just normalizedDir) - doesDirectoryExist (Text.unpack dir) >>= \case - True -> do + isReadable <- readable <$> getPermissions (Text.unpack dir) + if isReadable + then do setCurrentDirectory $ Text.unpack dir + newState <- dirToAppState dir targetFilePath + doesPathExist (Text.unpack dir') >>= \case + True -> pure newState + _ -> pure newState {stateMessage = Just $ "No such file or directory: " <> dir'} + else do + let list = L.list FocusMain (Vec.fromList []) 1 + pure $ (withNewDir dir list appState) {stateMessage = Just "Unable to read directory"} + where + withNewDir dir fileList st = + st + { stateCwd = dir, + stateFiles = fileList, + stateMessage = Nothing, + stateSearchIndex = 0, + stateSearchMatches = Vec.empty + } + dirToAppState dir targetFilePath = do files <- listFilesInDir dir let prevDirPos = findIndex ((== stateCwd) . filePath) files let cachedPos = Map.lookup dir stateListPositionHistory let targetFilePos = targetFilePath >>= \target -> findIndex ((== target) . filePath) files let pos = fromMaybe 0 (targetFilePos <|> cachedPos <|> prevDirPos) let list = L.listMoveTo pos $ L.list FocusMain (Vec.fromList files) 1 - pure $ appState {stateFiles = list, stateCwd = dir, stateSearchIndex = 0, stateSearchMatches = Vec.empty} - False -> pure appState + pure $ withNewDir dir list appState fileTypeFromStatus :: Posix.FileStatus -> FileType fileTypeFromStatus s = |
