]> glassweightruler.freedombox.rocks Git - xdg-ninja.git/blob - haskell/lib/EditProgram.hs
Add support for 1Password CLI. (#493)
[xdg-ninja.git] / haskell / lib / EditProgram.hs
1 {-# LANGUAGE DeriveGeneric #-}
2 {-# LANGUAGE OverloadedStrings #-}
3
4 -- I do not know haskell, this code is probably shit
5
6 module EditProgram where
7
8 import Data.Aeson
9 import Data.Aeson.Encode.Pretty
10 import Data.Aeson.Parser
11 import Data.Aeson.Types
12 import qualified Data.ByteString.Lazy as B
13 import Data.List.Extra
14 import Data.Maybe
15 import qualified Data.Text as T
16 import Data.Text.ANSI
17 import Data.UUID
18 import Data.UUID.V4
19 import GHC.Float (double2Float)
20 import GHC.Generics
21 import Program
22 import Prompts
23 import System.Console.Haskeline
24 import System.Environment (getEnv)
25 import System.Exit
26 import System.IO
27 import System.Process
28 import Text.Printf (printf)
29
30 getSupportLevel :: SupportLevel -> IO SupportLevel
31 getSupportLevel supportLevel = do
32 changed <- promptBool (blue "Has the support level changed? (y/n) ") (red "Please provide a valid answer.") "y"
33 if not changed
34 then return supportLevel
35 else do
36 movable <- promptBool (blue "Can the file be moved? (y/n) ") (red "Please provide a valid answer.") "y"
37 if movable
38 then do
39 envVars <- promptBool (blue "Do you have to export environment variables? (y/n) ") (red "Please provide a valid answer.") "y"
40 if envVars
41 then return EnvVars
42 else do
43 alias <- promptBool (blue "Do you have to set an alias? (y/n) ") (red "Please provide a valid answer.") "y"
44 if alias
45 then return Alias
46 else return Supported
47 else return Unsupported
48
49
50 getHelp :: String -> IO String
51 getHelp currentHelp = getInputMarkdown currentHelp
52
53 editFile :: File -> IO File
54 editFile f = do
55 printf "%s\n" (T.unpack (italic (cyan (T.pack (path f)))))
56 edit <- promptBool (green "Edit this file? (y/n) ") (red "Please provide a valid answer.") ""
57 if not edit
58 then return f
59 else do
60 supportLevel <- getSupportLevel (supportLevel f)
61 help <- getHelp (help f)
62 return File {path = path f, supportLevel = supportLevel, help = help}
63
64 editProgram :: String -> IO ()
65 editProgram filename = do
66 program <- readProgram filename
67 case program of
68 Nothing -> printf "%s %s\n" (T.unpack (bold (red "Error parsing file"))) (T.unpack (italic (red (T.pack filename))))
69 Just p -> do
70 printf "%s %s\n" (T.unpack (cyan ("Editing"))) (T.unpack (italic (cyan (name p))))
71 files <- return (files p)
72 newFiles <- sequence (map editFile files)
73 do_save <- promptBool (green "Save? (y/n) ") (red "Please provide a valid answer.") ""
74 if do_save
75 then save (T.pack filename) Program {name = (name p), files = newFiles}
76 else return ()