diff options
| author | tv <tv@krebsco.de> | 2026-04-02 05:13:31 +0200 |
|---|---|---|
| committer | tv <tv@krebsco.de> | 2026-04-02 05:13:31 +0200 |
| commit | fd4c3dc8a0114f529dc6d6f53f9175c9c646205c (patch) | |
| tree | 9501db707dc5c253c1748c221ec223fdcc34eea9 /src/Much/TreeView.hs | |
| parent | 74a1f3986dcd5e87a11a4108297a36954d179a62 (diff) | |
explicitly load primary message part
Previously the primary part was loaded only for text/plain,
because notmuch show included it automatically.
Now any MIME type can be loaded.
Diffstat (limited to 'src/Much/TreeView.hs')
| -rw-r--r-- | src/Much/TreeView.hs | 42 |
1 files changed, 39 insertions, 3 deletions
diff --git a/src/Much/TreeView.hs b/src/Much/TreeView.hs index 02ccde0..b3d36e8 100644 --- a/src/Much/TreeView.hs +++ b/src/Much/TreeView.hs @@ -133,11 +133,11 @@ isQuoteLine s0 = do -- Loading / Unloading -- - loadSubForest :: TreeView -> IO (Either String (Forest TreeView)) loadSubForest = \case TVMessage m -> - Right + pure . Right =<< + loadPrimaryMessagePart m =<< id . unloadPartsWithFilename . map unloadReadSubForests . concatMap subForest @@ -172,7 +172,13 @@ loadSubForest = \case $ xconvPart m mp' TVSearchResult sr -> - Right + pure . Right =<< + mapM + (\case + Node tv@(TVMessage m) parts -> Node tv <$> loadPrimaryMessagePart m parts + node -> pure node + ) + =<< id . unloadPartsWithFilename . map unloadReadSubForests . fromMessageForest @@ -193,6 +199,36 @@ loadSubForest = \case termFromSearchResult = unThreadID . searchThread +loadPrimaryMessagePart :: Message -> Forest TreeView -> IO (Forest TreeView) +loadPrimaryMessagePart m parts = + mapM (rewriteTreeIO isPrimaryPart loadNode) parts + where + pid = partID (primaryMessagePart (messageBody m)) + mid = messageId m + + isPrimaryPart :: TreeView -> Bool + isPrimaryPart = \case + TVMessagePart m' mp -> + messageId m' == mid && partID mp == pid + _ -> False + + loadNode :: Tree TreeView -> IO (Tree TreeView) + loadNode node@(Node tv _) = + loadSubForest tv >>= \case + Right subForest' -> pure (Node tv subForest') + Left _ -> pure node + + +rewriteTreeIO :: (a -> Bool) -> (Tree a -> IO (Tree a)) -> Tree a -> IO (Tree a) +rewriteTreeIO shouldRewrite f t@(Node v children) + | shouldRewrite v = do + Node v' children' <- f t + Node v' <$> mapM (rewriteTreeIO shouldRewrite f) children' + + | otherwise = do + Node v <$> mapM (rewriteTreeIO shouldRewrite f) children + + unloadSubForest :: Tree TreeView -> Forest TreeView unloadSubForest t = case rootLabel t of TVMessage _ -> |
