on 8097a73 help sign in
134 lines 3.5 kB history raw
1{-# LANGUAGE OverloadedStrings #-}
2module Elm.Project.Root
3 ( get
4 , unsafeGet
5 , getWithReplFallback
6 )
7 where
10import Control.Monad (msum)
11import Control.Monad.Trans (liftIO)
12import qualified Data.Map as Map
13import qualified System.Directory as Dir
14import System.FilePath ((</>))
16import qualified Deps.Cache as Cache
17import qualified Deps.Explorer as Explorer
18import qualified Deps.Solver as Solver
19import qualified Elm.Compiler.Version as Elm
20import qualified Elm.Package as Pkg
21import qualified Elm.Project.Constraint as Con
22import qualified Elm.Project.Json as Project
23import qualified Elm.Project.Licenses as Licenses
24import qualified Elm.Project.Summary as Summary
25import qualified Elm.PerUserCache as PerUserCache
26import qualified File.IO as IO
27import qualified Reporting.Exit as Exit
28import qualified Reporting.Progress as Progress
29import qualified Reporting.Task as Task
30import qualified Stuff.Verify as Verify
31import qualified Json.Encode as Encode
35-- GET
38get :: Task.Task Summary.Summary
39get =
40 do root <- moveToRoot
41 project <- Project.read "elm.json"
42 Verify.verify root project
45unsafeGet :: Task.Task (FilePath, Project.Project)
46unsafeGet =
47 (,) <$> moveToRoot <*> Project.read "elm.json"
51-- MOVE TO ROOT
54moveToRoot :: Task.Task FilePath
55moveToRoot =
56 do maybeRoot <- liftIO $ IO.find "elm.json"
57 case maybeRoot of
58 Just root ->
59 do liftIO $ Dir.setCurrentDirectory root
60 return root
62 Nothing ->
63 do addElmJson
64 Task.report Progress.ElmJsonAdded
65 liftIO $ Dir.getCurrentDirectory
68addElmJson :: Task.Task ()
69addElmJson =
70 do registry <- Cache.optionalUpdate
71 maybeSolution <- Explorer.run registry $ Solver.run $
72 msum $ map Solver.solve $
73 [ defaultDependencies
74 , Map.singleton Pkg.core Con.anything
75 ]
76 case maybeSolution of
77 Nothing ->
78 Task.throw Exit.NoElmJson
80 Just solution ->
81 liftIO $ Encode.write "elm.json" $ Project.encode $ Project.App $
82 Project.AppInfo
83 Elm.version
84 ["src"]
85 (Map.intersection solution defaultDependencies)
86 Map.empty
87 (Map.difference solution defaultDependencies)
90defaultDependencies :: Map.Map Pkg.Name Con.Constraint
91defaultDependencies =
92 Map.fromList
93 [ (Pkg.browser, Con.anything)
94 , (Pkg.core, Con.anything)
95 , (Pkg.html, Con.anything)
96 , (Pkg.json, Con.anything)
97 ]
101-- GET WITH FALLBACK
104getWithReplFallback :: IO FilePath
105getWithReplFallback =
106 do maybeRoot <- IO.find "elm.json"
108 case maybeRoot of
109 Just root ->
110 do Dir.setCurrentDirectory root
111 return root
113 Nothing ->
114 do cache <- PerUserCache.getReplRoot
115 let root = cache </> "tmp"
116 Dir.createDirectoryIfMissing True root
117 Dir.setCurrentDirectory root
118 IO.removeDir "elm-stuff"
119 Encode.write "elm.json" (Project.encode (Project.Pkg replInfo))
120 return root
123replInfo :: Project.PkgInfo
124replInfo =
125 Project.PkgInfo
126 { Project._pkg_name = Pkg.dummyName
127 , Project._pkg_summary = "dummy code for the REPL"
128 , Project._pkg_license = Licenses.bsd3
129 , Project._pkg_version = Pkg.dummyVersion
130 , Project._pkg_exposed = Project.ExposedList []
131 , Project._pkg_deps = Map.singleton Pkg.core Con.anything
132 , Project._pkg_test_deps = Map.empty
133 , Project._pkg_elm_version = Con.defaultElm
134 }