@@ -11,6 +11,7 @@ import qualified Data.List as List
1111import qualified Data.Map as Map
1212import qualified Data.Maybe as Maybe
1313import qualified Data.Name as Name
14+import qualified Data.NonEmptyList as NE
1415
1516import qualified Build
1617import Deps.Diff (PackageChanges(..), ModuleChanges(..), Changes(..))
@@ -20,6 +21,7 @@ import qualified Elm.Compiler.Type as Type
2021import qualified Elm.Details as Details
2122import qualified Elm.Docs as Docs
2223import qualified Elm.Magnitude as M
24+import qualified Elm.Outline as Outline
2325import qualified Elm.Package as Pkg
2426import qualified Elm.Version as V
2527import qualified Http
@@ -58,7 +60,7 @@ run args () =
5860
5961data Env =
6062 Env
61− { _root :: Maybe FilePath
63+ { _maybeRoot :: Maybe FilePath
6264 , _cache :: Stuff.PackageCache
6365 , _manager :: Http.Manager
6466 , _registry :: Registry.Registry
@@ -67,11 +69,11 @@ data Env =
6769
6870getEnv :: Task Env
6971getEnv =
70− do root <- Task.io $ Stuff.findRoot
71− cache <- Task.io $ Stuff.getPackageCache
72− manager <- Task.io $ Http.getManager
73− registry <- Task.eio Exit.DiffBadRegistry $ Registry.latest manager cache
74− return (Env root cache manager registry)
72+ do maybeRoot <- Task.io $ Stuff.findRoot
73+ cache <- Task.io $ Stuff.getPackageCache
74+ manager <- Task.io $ Http.getManager
75+ registry <- Task.eio Exit.DiffBadRegistry $ Registry.latest manager cache
76+ return (Env maybeRoot cache manager registry)
7577
7678
7779
@@ -96,21 +98,19 @@ diff env@(Env _ _ _ registry) args =
9698 Task.throw $ Exit.DiffUnknownPackage name suggestions
9799
98100 LocalInquiry v1 v2 ->
99− do (_, name, vsns) <- getDetails env
101+ do (name, vsns) <- readOutline env
100102 oldDocs <- getDocs env name vsns (min v1 v2)
101103 newDocs <- getDocs env name vsns (max v1 v2)
102104 writeDiff oldDocs newDocs
103105
104106 CodeVsLatest ->
105− do (details, name, vsns) <- getDetails env
107+ do (newDocs, name, vsns) <- generateDocs env
106108 oldDocs <- getLatestDocs env name vsns
107− newDocs <- Build.generateDocs details
108109 writeDiff oldDocs newDocs
109110
110111 CodeVsExactly version ->
111− do (details, name, vsns) <- getDetails env
112+ do (newDocs, name, vsns) <- generateDocs env
112113 oldDocs <- getDocs env name vsns version
113− newDocs <- Build.generateDocs details
114114 writeDiff oldDocs newDocs
115115
116116
@@ -131,32 +131,70 @@ getLatestDocs (Env _ cache manager _) name (Registry.KnownVersions latest _) =
131131
132132
133133
134−-- GET DETAILS
134+-- READ OUTLINE
135135
136136
137−getDetails :: Env -> Task (Details.Details, Pkg.Name, Registry.KnownVersions)
138−getDetails (Env maybeRoot _ _ registry) =
137+readOutline :: Env -> Task (Pkg.Name, Registry.KnownVersions)
138+readOutline (Env maybeRoot _ _ registry) =
139139 case maybeRoot of
140140 Nothing ->
141141 Task.throw $ Exit.DiffNoOutline
142142
143143 Just root ->
144− do details <- Task.eio Exit.DiffBadDetails $ Details.load Reporting.silent root
144+ do result <- Task.io $ Outline.read root
145+ case result of
146+ Left err ->
147+ Task.throw $ Exit.DiffBadOutline err
148+
149+ Right outline ->
150+ case outline of
151+ Outline.App _ ->
152+ Task.throw $ Exit.DiffApplication
153+
154+ Outline.Pkg (Outline.PkgOutline pkg _ _ _ _ _ _ _) ->
155+ case Registry.getVersions pkg registry of
156+ Just vsns -> return (pkg, vsns)
157+ Nothing -> Task.throw Exit.DiffUnpublished
158+
159+
160+
161+-- GENERATE DOCS
162+
163+
164+generateDocs :: Env -> Task (Docs.Documentation, Pkg.Name, Registry.KnownVersions)
165+generateDocs (Env maybeRoot _ _ registry) =
166+ case maybeRoot of
167+ Nothing ->
168+ Task.throw $ Exit.DiffNoOutline
169+
170+ Just root ->
171+ do details <-
172+ Task.eio Exit.DiffBadDetails $
173+ Details.load Reporting.silent root
174+
145175 case Details._outline details of
146176 Details.ValidApp _ ->
147177 Task.throw $ Exit.DiffApplication
148178
149− Details.ValidPkg pkg _ ->
179+ Details.ValidPkg pkg exposed ->
150180 case Registry.getVersions pkg registry of
151181 Just vsns ->
152− return (details, pkg, vsns)
182+ case exposed of
183+ [] ->
184+ Task.throw Exit.DiffNoExposed
185+
186+ e:es ->
187+ do docs <-
188+ Task.eio Exit.DiffBadBuild $
189+ Build.fromExposed Reporting.silent root details Build.KeepDocs (NE.List e es)
190+ return ( docs, pkg, vsns )
153191
154192 Nothing ->
155193 Task.throw Exit.DiffUnpublished
156194
157195
158196
159−-- WRITE DOC
197+-- WRITE DIFF
160198
161199
162200writeDiff :: Docs.Documentation -> Docs.Documentation -> Task ()