@@ -20,6 +20,7 @@ import Control.Monad (filterM, liftM)
20import Data.Binary (Binary, get, put, getWord8, putWord8)
20import Data.Binary (Binary, get, put, getWord8, putWord8)
21import Data.Foldable (traverse_)
21import Data.Foldable (traverse_)
22import qualified Data.Map as Map
22import qualified Data.Map as Map
23+import qualified Data.NonEmptyList as NE
23import qualified Data.Utf8 as Utf8
24import qualified Data.Utf8 as Utf8
24import qualified System.Directory as Dir
25import qualified System.Directory as Dir
25import System.FilePath ((</>))
26import System.FilePath ((</>))
@@ -47,7 +48,7 @@ data Outline
47data AppOutline =
48data AppOutline =
48 AppOutline
49 AppOutline
49 { _app_elm_version :: V.Version
50 { _app_elm_version :: V.Version
50− , _app_source_dirs :: [FilePath]
51+ , _app_source_dirs :: NE.List FilePath
51 , _app_deps_direct :: Map.Map Pkg.Name V.Version
52 , _app_deps_direct :: Map.Map Pkg.Name V.Version
52 , _app_deps_indirect :: Map.Map Pkg.Name V.Version
53 , _app_deps_indirect :: Map.Map Pkg.Name V.Version
53 , _app_test_direct :: Map.Map Pkg.Name V.Version
54 , _app_test_direct :: Map.Map Pkg.Name V.Version
@@ -115,7 +116,7 @@ encode outline =
115 App (AppOutline elm srcDirs depsDirect depsTrans testDirect testTrans) ->
116 App (AppOutline elm srcDirs depsDirect depsTrans testDirect testTrans) ->
117 [ "type" ==> E.string "application"
118 [ "type" ==> E.string "application"
118− , "source-directories" ==> E.list (E.string . Utf8.fromChars) srcDirs
119+ , "source-directories" ==> E.list (E.string . Utf8.fromChars) (NE.toList srcDirs)
119 , "elm-version" ==> V.encode elm
120 , "elm-version" ==> V.encode elm
120 , "dependencies" ==>
121 , "dependencies" ==>
@@ -185,7 +186,7 @@ read root =
185 return $ Right outline
186 return $ Right outline
187 App (AppOutline _ srcDirs _ _ _ _) ->
188 App (AppOutline _ srcDirs _ _ _ _) ->
188− do badDirs <- filterM (isBadSrcDir root) srcDirs
189+ do badDirs <- filterM (isBadSrcDir root) (NE.toList srcDirs)
189 case badDirs of
190 case badDirs of
190 [] -> return $ Right outline
191 [] -> return $ Right outline
191 d:ds -> return $ Left (Exit.OutlineHasBadSrcDirs d ds)
192 d:ds -> return $ Left (Exit.OutlineHasBadSrcDirs d ds)
@@ -222,7 +223,7 @@ appDecoder :: Decoder AppOutline
222appDecoder =
223appDecoder =
223 AppOutline
224 AppOutline
224 <$> D.field "elm-version" versionDecoder
225 <$> D.field "elm-version" versionDecoder
225− <*> D.field "source-directories" (D.list dirDecoder)
226+ <*> D.field "source-directories" dirsDecoder
226 <*> D.field "dependencies" (D.field "direct" (depsDecoder versionDecoder))
227 <*> D.field "dependencies" (D.field "direct" (depsDecoder versionDecoder))
227 <*> D.field "dependencies" (D.field "indirect" (depsDecoder versionDecoder))
228 <*> D.field "dependencies" (D.field "indirect" (depsDecoder versionDecoder))
228 <*> D.field "test-dependencies" (D.field "direct" (depsDecoder versionDecoder))
229 <*> D.field "test-dependencies" (D.field "direct" (depsDecoder versionDecoder))
@@ -281,9 +282,12 @@ validateKey (key, value) =
281 D.failure (Exit.OP_BadDependencyName key)
282 D.failure (Exit.OP_BadDependencyName key)
284−dirDecoder :: Decoder FilePath
285+dirsDecoder :: Decoder (NE.List FilePath)
285−dirDecoder =
286+dirsDecoder =
287+ do dirs <- D.list D.string
286− Utf8.toChars <$> D.string
288+ case map Utf8.toChars dirs of
289+ d:ds -> return (NE.List d ds)
290+ [] -> D.failure Exit.OP_NoSrcDirs