]> glassweightruler.freedombox.rocks Git - xdg-ninja.git/blob - haskell/lib/Prompts.hs
Add vital vst entry (#406)
[xdg-ninja.git] / haskell / lib / Prompts.hs
1 module Prompts where
2
3 import Data.List.Extra
4 import qualified Data.Text as T
5 import Data.UUID
6 import Data.UUID.V4
7 import Program
8 import System.Console.Haskeline
9 import System.Environment (getEnv)
10 import System.Exit
11 import System.Process
12 import Text.Printf (printf)
13
14 getInputMarkdown :: String -> IO String
15 getInputMarkdown placeholder = do
16 id <- toString <$> Data.UUID.V4.nextRandom
17 editor <- appendFile ("/tmp/xdg-ninja." ++ id ++ ".md") placeholder >> (getEnv "EDITOR")
18 (_, _, _, p) <- createProcess (shell (editor ++ " /tmp/xdg-ninja." ++ id ++ ".md"))
19 f <- waitForProcess p
20 case f of
21 ExitSuccess -> readFile ("/tmp/xdg-ninja." ++ id ++ ".md")
22 ExitFailure a -> return ""
23
24 getProp :: T.Text -> T.Text -> IO String
25 getProp prompt placeholder = do
26 let string_prompt = T.unpack prompt
27 let string_placeholder = T.unpack placeholder
28 x <- runInputT defaultSettings (getInputLineWithInitial string_prompt (string_placeholder, ""))
29 case x of
30 Just s -> return s
31 Nothing -> return ""
32
33 data Answer = Yes | No | Unknown
34
35 stringToBool :: String -> Answer
36 stringToBool s = case lower s of
37 "yes" -> Yes
38 "y" -> Yes
39 "1" -> Yes
40 "no" -> No
41 "n" -> No
42 "0" -> No
43 _ -> Unknown
44
45 promptBool :: T.Text -> T.Text -> T.Text -> IO Bool
46 promptBool prompt prompt_unrecognised placeholder = do
47 x <- getProp prompt placeholder
48 case stringToBool x of
49 Yes -> return True
50 No -> return False
51 Unknown -> printf "%s\n" prompt_unrecognised >> promptBool prompt prompt_unrecognised placeholder
52