on efe80bc help sign in
elk/terminal/src/Init.hs
100 lines 2.7 kB history raw
1{-# LANGUAGE OverloadedStrings #-}
2module Init
3 ( run
4 )
5 where
8import Prelude hiding (init)
9import Control.Monad.Trans (liftIO)
10import qualified Data.Map as Map
11import qualified System.Directory as Dir
13import qualified Deps.Cache as Cache
14import qualified Deps.Explorer as Explorer
15import qualified Deps.Solver as Solver
16import qualified Elm.Constraint as Con
17import qualified Elm.Package as Pkg
18import qualified Elm.Project.Json as Project
19import qualified Elm.Version as V
20import qualified Reporting.Doc as D
21import qualified Reporting.Exit as Exit
22import qualified Reporting.Exit.Init as E
23import qualified Reporting.Task as Task
24import qualified Reporting.Progress.Terminal as Terminal
28-- RUN
31run :: () -> () -> IO ()
32run () () =
33 do reporter <- Terminal.create
34 exists <- Dir.doesFileExist "elm.json"
35 Task.run reporter $
36 if exists then
37 Task.throw (Exit.Init E.AlreadyStarted)
38 else
39 do approved <- Task.getApproval question
40 if approved
41 then
42 do init
43 liftIO $ putStrLn "Okay, I created it. Now read that link!"
44 else
45 liftIO $ putStrLn "Okay, I did not make any changes!"
48question :: D.Doc
49question =
50 D.stack
51 [ D.fillSep
52 ["Hello!"
53 ,"Elm","projects","always","start","with","an",D.green "elm.json","file."
54 ,"I","can","create","them!"
55 ]
56 , D.reflow
57 "Now you may be wondering, what will be in this file? How do I add Elm files to\
58 \ my project? How do I see it in the browser? How will my code grow? Do I need\
59 \ more directories? What about tests? Etc."
60 , D.fillSep
61 ["Check","out",D.cyan (D.fromChars (D.makeLink "init"))
62 ,"for","all","the","answers!"
63 ]
64 , "Knowing all that, would you like me to create an elm.json file now? [Y/n]: "
65 ]
69-- INIT
72init :: Task.Task ()
73init =
74 do registry <- Cache.optionalUpdate
76 maybeSolution <-
77 Explorer.run registry $ Solver.run $ Solver.solve defaults
79 case maybeSolution of
80 Just solution ->
81 let
82 directs = Map.intersection solution defaults
83 indirects = Map.difference solution defaults
84 in
85 liftIO $
86 do Dir.createDirectoryIfMissing True "src"
87 Project.write "." $ Project.App $
88 Project.AppInfo V.compiler ["src"] directs indirects Map.empty Map.empty
90 Nothing ->
91 Task.throw (Exit.Init (E.NoSolution (Map.keys defaults)))
94defaults :: Map.Map Pkg.Name Con.Constraint
95defaults =
96 Map.fromList
97 [ (Pkg.core, Con.anything)
98 , (Pkg.browser, Con.anything)
99 , (Pkg.html, Con.anything)
100 ]