aboutsummaryrefslogtreecommitdiff
path: root/lib/Daffm/State.hs
diff options
context:
space:
mode:
authorAkshay Nair <phenax5@gmail.com>2025-11-07 12:25:47 +0530
committerAkshay Nair <phenax5@gmail.com>2025-11-08 17:09:25 +0530
commita16933476187a349d619ab29f73dbcae81c8cb24 (patch)
treeeab12977c61a2c3b9ac88b22637f5511c21f9d18 /lib/Daffm/State.hs
parent6c3f7442b92f2fbf2308d93ece448cf3dd759a58 (diff)
downloaddaffm-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.hs28
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 =