on master help sign in
Update Elm.Project.Json for Elm.Version, Data.Utf8, etc.
commit1e0616a22b77c6c5666860cba6fb0b6507987c26 authorEvan Czaplicki <evancz@users.noreply.github.com> dateThu 27 Dec 2018, 12:30 (8 years ago) parent059dc43
1 file changed+67−103
builder/src/Elm/Project/Json.hs+67−103
builder/src/Elm/Project/Json.hs+67−103
@@ -22,21 +22,17 @@ module Elm.Project.Json
2222
2323import Prelude hiding (read)
2424import Control.Monad.Trans (liftIO)
25−import qualified Data.ByteString as BS
2625import Data.Foldable (traverse_)
27−import Data.Map (Map)
28−import Data.Text (Text)
2926import qualified Data.Map as Map
30−import qualified Data.Text as Text
27+import qualified Data.Utf8 as Utf8
3128import qualified System.Directory as Dir
3229import System.FilePath ((</>))
3330
31+import qualified Elm.Constraint as Con
32+import qualified Elm.Licenses as Licenses
3433import qualified Elm.ModuleName as ModuleName
3534import qualified Elm.Package as Pkg
36−import Elm.Package (Name, Version)
37−
38−import qualified Elm.Project.Constraint as Con
39−import qualified Elm.Project.Licenses as Licenses
35+import qualified Elm.Version as V
4036import qualified Json.Decode as D
4137import qualified Json.Encode as E
4238import qualified Reporting.Exit as Exit
@@ -59,12 +55,12 @@ data Project
5955
6056data AppInfo =
6157 AppInfo
62− { _app_elm_version :: Version
58+ { _app_elm_version :: V.Version
6359 , _app_source_dirs :: [FilePath]
64− , _app_deps_direct :: Map Name Version
65− , _app_deps_trans :: Map Name Version
66− , _app_test_direct :: Map Name Version
67− , _app_test_trans :: Map Name Version
60+ , _app_deps_direct :: Map.Map Pkg.Name V.Version
61+ , _app_deps_trans :: Map.Map Pkg.Name V.Version
62+ , _app_test_direct :: Map.Map Pkg.Name V.Version
63+ , _app_test_trans :: Map.Map Pkg.Name V.Version
6864 }
6965
7066
@@ -74,27 +70,27 @@ data AppInfo =
7470
7571data PkgInfo =
7672 PkgInfo
77− { _pkg_name :: Name
78− , _pkg_summary :: Text
73+ { _pkg_name :: Pkg.Name
74+ , _pkg_summary :: Utf8.String
7975 , _pkg_license :: Licenses.License
80− , _pkg_version :: Version
76+ , _pkg_version :: V.Version
8177 , _pkg_exposed :: Exposed
82− , _pkg_deps :: Map Name Con.Constraint
83− , _pkg_test_deps :: Map Name Con.Constraint
78+ , _pkg_deps :: Map.Map Pkg.Name Con.Constraint
79+ , _pkg_test_deps :: Map.Map Pkg.Name Con.Constraint
8480 , _pkg_elm_version :: Con.Constraint
8581 }
8682
8783
8884data Exposed
8985 = ExposedList [ModuleName.Raw]
90− | ExposedDict [(Text, [ModuleName.Raw])]
86+ | ExposedDict [(Utf8.String, [ModuleName.Raw])]
9187
9288
9389
9490-- DEFAULTS
9591
9692
97−defaultSummary :: Text
93+defaultSummary :: Utf8.String
9894defaultSummary =
9995 "helpful summary of your project, less than 80 characters"
10096
@@ -117,7 +113,7 @@ isPlatformPackage project =
117113 author == "elm" || author == "elm-explorations"
118114
119115
120−getName :: Project -> Name
116+getName :: Project -> Pkg.Name
121117getName project =
122118 case project of
123119 App _ ->
@@ -174,32 +170,32 @@ encode project =
174170 case project of
175171 App (AppInfo elm srcDirs depsDirect depsTrans testDirect testTrans) ->
176172 E.object
177− [ "type" ==> E.text "application"
178− , "source-directories" ==> E.list (E.text . Text.pack) srcDirs
179− , "elm-version" ==> encodeVersion elm
173+ [ "type" ==> E.string "application"
174+ , "source-directories" ==> E.list (E.string . Utf8.fromChars) srcDirs
175+ , "elm-version" ==> V.encode elm
180176 , "dependencies" ==>
181177 E.object
182− [ "direct" ==> encodeDeps encodeVersion depsDirect
183− , "indirect" ==> encodeDeps encodeVersion depsTrans
178+ [ "direct" ==> encodeDeps V.encode depsDirect
179+ , "indirect" ==> encodeDeps V.encode depsTrans
184180 ]
185181 , "test-dependencies" ==>
186182 E.object
187− [ "direct" ==> encodeDeps encodeVersion testDirect
188− , "indirect" ==> encodeDeps encodeVersion testTrans
183+ [ "direct" ==> encodeDeps V.encode testDirect
184+ , "indirect" ==> encodeDeps V.encode testTrans
189185 ]
190186 ]
191187
192188 Pkg (PkgInfo name summary license version exposed deps tests elm) ->
193189 E.object
194− [ "type" ==> E.text "package"
195− , "name" ==> E.text (Pkg.toText name)
196− , "summary" ==> E.text summary
190+ [ "type" ==> E.string "package"
191+ , "name" ==> E.string (Pkg.toString name)
192+ , "summary" ==> E.string summary
197193 , "license" ==> Licenses.encode license
198− , "version" ==> E.text (Pkg.versionToText version)
194+ , "version" ==> V.encode version
199195 , "exposed-modules" ==> encodeExposed exposed
200− , "elm-version" ==> encodeConstraint elm
201− , "dependencies" ==> encodeDeps encodeConstraint deps
202− , "test-dependencies" ==> encodeDeps encodeConstraint tests
196+ , "elm-version" ==> Con.encode elm
197+ , "dependencies" ==> encodeDeps Con.encode deps
198+ , "test-dependencies" ==> encodeDeps Con.encode tests
203199 ]
204200
205201
@@ -223,19 +219,9 @@ encodeModule name =
223219 E.name name
224220
225221
226−encodeDeps :: (a -> E.Value) -> Map Pkg.Name a -> E.Value
222+encodeDeps :: (a -> E.Value) -> Map.Map Pkg.Name a -> E.Value
227223encodeDeps encodeValue deps =
228− E.dict Pkg.toText encodeValue deps
229−
230−
231−encodeConstraint :: Con.Constraint -> E.Value
232−encodeConstraint constraint =
233− E.text (Con.toText constraint)
234−
235−
236−encodeVersion :: Pkg.Version -> E.Value
237−encodeVersion version =
238− E.text (Pkg.versionToText version)
224+ E.dict Pkg.toString encodeValue deps
239225
240226
241227
@@ -244,17 +230,19 @@ encodeVersion version =
244230
245231read :: FilePath -> Task.Task Project
246232read path =
247− do bytes <- liftIO $ BS.readFile path
248− case D.parse "project" E.badContentToDocs decoder bytes of
249− Left err ->
250− throwBadJson (E.BadJson err)
233+ do result <- liftIO $ D.fromFile decoder path
234+ case result of
235+ Right project ->
236+ case project of
237+ Pkg _ ->
238+ do return project
251239
252− Right project@(Pkg _) ->
253− return project
240+ App (AppInfo _ srcDirs _ _ _ _) ->
241+ do mapM_ doesDirectoryExist srcDirs
242+ return project
254243
255− Right project@(App (AppInfo _ srcDirs _ _ _ _)) ->
256− do mapM_ doesDirectoryExist srcDirs
257− return project
244+ Left err ->
245+ throwBadJson (error "TODO bad json" err)
258246
259247
260248throwBadJson :: E.ElmJsonProblem -> Task.Task a
@@ -280,16 +268,16 @@ type Decoder a =
280268
281269decoder :: Decoder Project
282270decoder =
283− do tipe <- D.field "type" D.text
271+ do tipe <- D.field "type" D.string
284272 case tipe of
285273 "application" ->
286− D.map App appDecoder
274+ App <$> appDecoder
287275
288276 "package" ->
289− D.map Pkg pkgDecoder
277+ Pkg <$> pkgDecoder
290278
291279 other ->
292− D.fail (E.BadType other)
280+ D.failure (E.BadType other)
293281
294282
295283appDecoder :: Decoder AppInfo
@@ -325,73 +313,49 @@ pkgNameDecoder =
325313 D.mapError E.BadPkgName Pkg.decoder
326314
327315
328−summaryDecoder :: Decoder Text
316+summaryDecoder :: Decoder Utf8.String
329317summaryDecoder =
330− do summary <- D.text
331− if Text.length summary < 80
332− then D.succeed summary
333− else D.fail E.BadSummaryTooLong
318+ do summary <- D.string
319+ if Utf8.size summary < 80
320+ then return summary
321+ else D.failure E.BadSummaryTooLong
334322
335323
336324licenseDecoder :: Decoder Licenses.License
337325licenseDecoder =
338− do txt <- D.text
339− case Licenses.check txt of
340− Left suggestions ->
341− D.fail (E.BadLicense txt suggestions)
342−
343− Right license ->
344− D.succeed license
326+ Licenses.decoder E.BadLicense
345327
346328
347−versionDecoder :: Decoder Version
329+versionDecoder :: Decoder V.Version
348330versionDecoder =
349− do txt <- D.text
350− case Pkg.versionFromText txt of
351− Just version ->
352− D.succeed version
353−
354− Nothing ->
355− D.fail (E.BadVersion txt)
331+ D.mapError E.BadVersion V.decoder
356332
357333
358334constraintDecoder :: Decoder Con.Constraint
359335constraintDecoder =
360− do txt <- D.text
361− case Con.fromText txt of
362− Right constraint ->
363− D.succeed constraint
336+ D.mapError E.BadConstraint Con.decoder
364337
365− Left msg ->
366− D.fail (E.BadConstraint msg)
367338
368−
369−depsDecoder :: Decoder a -> Decoder (Map Name a)
339+depsDecoder :: Decoder a -> Decoder (Map.Map Pkg.Name a)
370340depsDecoder valueDecoder =
371341 Map.fromList <$> (
372342 traverse validateKey =<< D.pairs valueDecoder
373343 )
374344
375345
376−validateKey :: (Text, a) -> Decoder (Name, a)
346+validateKey :: (Utf8.String, a) -> Decoder (Pkg.Name, a)
377347validateKey (key, value) =
378− case Pkg.fromText key of
348+ case Pkg.fromString key of
379349 Right name ->
380− D.succeed (name, value)
350+ return (name, value)
381351
382352 Left _ ->
383− D.fail (E.BadDependencyName key)
353+ D.failure (E.BadDependencyName key)
384354
385355
386356dirDecoder :: Decoder FilePath
387357dirDecoder =
388− do maybeText <- D.maybe D.text
389− case maybeText of
390− Nothing ->
391− D.fail E.BadDirectoryNotString
392−
393− Just txt ->
394− D.succeed (Text.unpack txt)
358+ Utf8.toChars <$> D.string
395359
396360
397361
@@ -413,9 +377,9 @@ moduleDecoder =
413377 D.mapError E.BadModuleName ModuleName.decoder
414378
415379
416−checkHeader :: Text -> Decoder ()
380+checkHeader :: Utf8.String -> Decoder ()
417381checkHeader header =
418− if Text.length header < 20 then
419− D.succeed ()
382+ if Utf8.size header < 20 then
383+ return ()
420384 else
421− D.fail (E.BadModuleHeaderTooLong header)
385+ D.failure (E.BadModuleHeaderTooLong header)