Update documentation a bit.
[todos:todos.git] / Todos / Config.hs
1 {-# LANGUAGE UnicodeSyntax, MultiParamTypeClasses #-}
2
3 module Todos.Config where
4
5 import Control.Monad.Reader
6
7 import Todos.Unicode
8 import Todos.Types
9 import Todos.Color
10 import Todos.Shapes
11 import Text.ParserCombinators.Parsec
12 import qualified System.Console.ANSI as ANSI
13
14 -- | Any user-specified runtime config type should belong to this class
15 class RuntimeConfig c where
16   -- | Does given TODO item match query?
17   getPredicate āˆ· DateTime ā†’ c ā†’ (TodoItem ā†’ š”¹) 
18   -- | Get basic configuration
19   toBaseConfig āˆ· c ā†’ BaseConfig
20
21 -- | Any user-specified runtime config type should include at least this properties
22 data BaseConfig = BConfig {
23       outOnlyFirst āˆ· š”¹,           -- ^ Output only first matching entry
24       outColors āˆ· š”¹,              -- ^ Show colored output
25       outIds :: š”¹,                -- ^ Show IDs
26       outHighlight āˆ· š”¹,           -- ^ Highlight matching items
27       sorting āˆ· SortingType,      -- ^ How to sort items
28       pruneL āˆ· Limit, 
29       minL   āˆ· Limit,
30       commandToRun āˆ· TodoCommand,
31       prefix āˆ· Maybe String,      -- ^ Nothing ā€” use default parser, Just p ā€” use alternate parser with prefix Ā«pĀ»
32       descrFormat āˆ· String,
33       skipStatus āˆ· š”¹,             -- ^ Skip status field in input
34       groupByFile āˆ· š”¹,
35       groupByTag āˆ· š”¹,
36       groupByStatus āˆ· š”¹,
37       forcedStatus āˆ· Maybe String,
38       topStatus āˆ· Maybe String
39       }
40     deriving (Eq, Show)
41
42 -- | Default runtime configuration type. Is read from command line and configs.
43 data DefaultConfig = DConfig {
44       baseConfig āˆ· BaseConfig,
45       query āˆ· Composed }
46     deriving (Eq,Show)
47
48 -- | Configuration for console output. Is generated in runtime from TodosConfig and Config.
49 data PrintConfig c = PConfig {
50   printConfig āˆ· c,
51   printStatusColor āˆ·  String ā†’ (ANSI.ColorIntensity, ANSI.Color),       -- ^ Color of status field from status
52   printItemColor āˆ·  TodoItem ā†’ Maybe (ANSI.ColorIntensity, ANSI.Color), -- ^ Color of item name
53   printHighlightColor āˆ· (ANSI.ColorIntensity, ANSI.Color),              -- ^ Color to use for highlighting
54   doHighlight āˆ· TodoItem ā†’ š”¹                                            -- ^ Whether to highlight given item
55   }
56
57 -- | User Todos config. User can specify it in @~/.config/todos/todos.hs@.
58 data TodosConfig c = Todos {
59      parseCommandLine āˆ· DateTime ā†’ c ā†’ [String] ā†’ CmdLineParseResult c,     -- ^ Function to parse command line
60      filterTodos āˆ· DateTime ā†’ c ā†’ [Todo] ā†’ [Todo],                          -- ^ Any function to be run to transform read TODOs tree
61      statusConsoleColor āˆ· String ā†’ (ANSI.ColorIntensity, ANSI.Color),       -- ^ Function to select a color of item's status field in console output
62      itemConsoleColor āˆ· TodoItem ā†’ Maybe (ANSI.ColorIntensity, ANSI.Color), -- ^ Function to select a color of item's name in console output
63      highlightColor āˆ· (ANSI.ColorIntensity, ANSI.Color),                    -- ^ Color to use for highlighting
64      itemColor āˆ· TodoItem ā†’ HSV,                                            -- ^ Function to select color for item's node in DOT output
65      itemShape āˆ· TodoItem ā†’ Shape,                                          -- ^ Function to select shape for item's node in DOT output
66      printTodos āˆ· PrintConfig c ā†’ [Todo] ā†’ IO (),                           -- ^ Any function to output TODOs list
67      nullConfig āˆ· c                                                         -- ^ Default Config (to be used without any options in command line and configs)
68 }
69
70 -- | Result of parsing command line
71 data CmdLineParseResult c = 
72      Parsed c [FilePath]       -- ^ Parsed successfully, got Config and list of source files
73    | ParseError String         -- ^ Some error occured
74    | CmdLineHelp               -- ^ User asked for help
75    deriving (Eq,Show)
76
77 -- | ask field from BaseConfig
78 askBase āˆ· (RuntimeConfig c) ā‡’ (BaseConfig ā†’ a) ā†’ Reader c a
79 askBase field = asks (field āˆ˜ toBaseConfig)
80