aboutsummaryrefslogtreecommitdiffstats
path: root/app
diff options
context:
space:
mode:
Diffstat (limited to 'app')
-rw-r--r--app/Main.hs56
1 files changed, 41 insertions, 15 deletions
diff --git a/app/Main.hs b/app/Main.hs
index 9cb90ca..6f754da 100644
--- a/app/Main.hs
+++ b/app/Main.hs
@@ -336,20 +336,6 @@
-- @topic rendering
-- @topic options
--- TODO Add command for listing all topics
---
--- Running `anissue topics` should list all topics including the amount of
--- issues tagged with them. By default the list should be ordered with the
--- topics first which have the most issues.
---
--- @difficulty easy
---
--- COMMENT Maybe `anissue tags @topic` could serve that purpose? I imagine
--- `anissue tags` (without a tag given) to list all tags.
---
--- \*Rationale: I would like to push for concepts out of anissue for as long as
--- feasible . Currently, there is no notion of "topics".*
-
-- TODO Add HTTP server
--
-- When running `anissue server`, an HTTP server should be started,
@@ -371,6 +357,7 @@ import Data.Function ((&))
import Data.List (find, intersperse, isPrefixOf)
import Data.Map qualified as M
import Data.Maybe (catMaybes)
+import Data.Set qualified as S
import Data.Text qualified as T
import Data.Text.IO qualified as T
import Data.Text.Lazy qualified as LT
@@ -387,6 +374,7 @@ import Issue.GroupBy qualified as I
import Issue.Provenance qualified as I
import Issue.Sort (Sort, applySorts)
import Issue.Sort qualified as I
+import Issue.Tag qualified as I
import Options.Applicative ((<**>))
import Options.Applicative qualified as O
import Prettyprinter ((<+>))
@@ -481,6 +469,7 @@ data Command
{ id :: String,
edit :: Bool
}
+ | Tags
deriving (Show)
cmd :: O.Parser Command
@@ -491,7 +480,9 @@ cmd =
O.command "log" . O.info logCmd $
O.progDesc "Show a log of all issues",
O.command "show" . O.info showCmd $
- O.progDesc "Show details of all issues"
+ O.progDesc "Show details of all issues",
+ O.command "tags" . O.info tagsCmd $
+ O.progDesc "Show all tags"
]
listCmd :: O.Parser Command
@@ -512,6 +503,10 @@ showCmd =
<$> idArg
<*> editFlag
+tagsCmd :: O.Parser Command
+tagsCmd =
+ pure Tags
+
filesArg :: O.Parser [String]
filesArg = O.many (O.strArgument (O.metavar "FILE" <> O.action "file"))
@@ -679,6 +674,37 @@ main = do
++ "\n@row "
++ show issue.start.row
++ "\n"
+ Options {colorize, noPager, width, internalTags, command = Tags} -> do
+ issues <- fst <$> getHistory
+ let tags =
+ concatMap
+ ( \issue ->
+ issue.tags
+ ++ ( if internalTags
+ then issue.internalTags
+ else []
+ )
+ )
+ issues
+ tagsAndValues =
+ M.toList
+ . M.map (S.toList . S.fromList)
+ . foldl
+ ( flip
+ ( \tag ->
+ let vs = maybe [] (: []) (I.tagValue tag)
+ in (M.alter (Just . maybe vs (vs ++))) (I.tagKey tag)
+ )
+ )
+ M.empty
+ $ tags
+ putDoc colorize noPager width . P.vsep $
+ map
+ ( \(tagKey, tagValues) ->
+ P.annotate P.bold (P.pretty ("@" <> tagKey))
+ <+> P.hsep (map P.pretty tagValues)
+ )
+ tagsAndValues
-- TODO Move `replaceText` to `Issue`