on 1238607 help sign in
elk/terminal/src/Init.hs
103 lines 3.0 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.Registry as Registry
14import qualified Deps.Solver as Solver
15import qualified Elm.Constraint as Con
16import qualified Elm.Outline as Outline
17import qualified Elm.Package as Pkg
18import qualified Elm.Version as V
19import qualified Http
20import qualified Reporting
21import qualified Reporting.Doc as D
22import qualified Reporting.Exit as Exit
23import qualified Stuff
27-- RUN
30run :: () -> () -> IO ()
31run () () =
32 Reporting.attempt Exit.initToReport $
33 do exists <- Dir.doesFileExist "elm.json"
34 if exists
35 then return (Left Exit.InitAlreadyExists)
36 else
37 do approved <- Reporting.ask question
38 if approved
39 then init
40 else
41 do putStrLn "Okay, I did not make any changes!"
42 return (Right ())
45question :: D.Doc
46question =
47 D.stack
48 [ D.fillSep
49 ["Hello!"
50 ,"Elm","projects","always","start","with","an",D.green "elm.json","file."
51 ,"I","can","create","them!"
52 ]
53 , D.reflow
54 "Now you may be wondering, what will be in this file? How do I add Elm files to\
55 \ my project? How do I see it in the browser? How will my code grow? Do I need\
56 \ more directories? What about tests? Etc."
57 , D.fillSep
58 ["Check","out",D.cyan (D.fromChars (D.makeLink "init"))
59 ,"for","all","the","answers!"
60 ]
61 , "Knowing all that, would you like me to create an elm.json file now? [Y/n]: "
62 ]
66-- INIT
69init :: IO (Either Exit.Init ())
70init =
71 do cache <- Stuff.getPackageCache
72 manager <- Http.getManager
73 eregistry <- Registry.latest manager cache
74 case eregistry of
75 Left rp ->
76 return (Left (Exit.InitRegistryProblem rp))
78 Right registry ->
79 do result <- Solver.online cache manager registry defaults
80 case result of
81 Left _ ->
82 return (Left (Exit.InitNoSolution (Map.keys defaults)))
84 Right details ->
85 let
86 solution = Map.map (\(Solver.Details vsn _) -> vsn) details
87 directs = Map.intersection solution defaults
88 indirects = Map.difference solution defaults
89 in
90 do Dir.createDirectoryIfMissing True "src"
91 Outline.write "." $ Outline.App $
92 Outline.AppOutline V.compiler ["src"] directs indirects Map.empty Map.empty
93 putStrLn "Okay, I created it. Now read that link!"
94 return (Right ())
97defaults :: Map.Map Pkg.Name Con.Constraint
98defaults =
99 Map.fromList
100 [ (Pkg.core, Con.anything)
101 , (Pkg.browser, Con.anything)
102 , (Pkg.html, Con.anything)
103 ]