@@ -10,6 +10,7 @@ module Obelisk.Asset.Promoted
10import Obelisk.Asset.Gather
10import Obelisk.Asset.Gather
12import Data.Foldable
12import Data.Foldable
13+import qualified Data.List as L
13import Language.Haskell.TH (runQ, pprint)
14import Language.Haskell.TH (runQ, pprint)
14import Language.Haskell.TH.Syntax hiding (lift)
15import Language.Haskell.TH.Syntax hiding (lift)
15import GHC.TypeLits
16import GHC.TypeLits
@@ -17,11 +18,12 @@ import Data.Sequence (Seq)
17import qualified Data.Sequence as Seq
18import qualified Data.Sequence as Seq
18import Control.Monad.Trans.Writer
19import Control.Monad.Trans.Writer
19import System.FilePath
20import System.FilePath
21+import System.Directory
20import Data.Text (Text)
22import Data.Text (Text)
21import qualified Data.Text as T
23import qualified Data.Text as T
24+import qualified Data.Text.IO as T
22import Data.Map (Map)
25import Data.Map (Map)
23import qualified Data.Map as Map
26import qualified Data.Map as Map
24−import Obelisk.Asset.Cabal (writeCabalProject, SimplePkg(..))
26data StaticConfig = StaticConfig
28data StaticConfig = StaticConfig
27 { _staticConfig_packageName :: Text --TODO: Better type
29 { _staticConfig_packageName :: Text --TODO: Better type
@@ -30,14 +32,31 @@ data StaticConfig = StaticConfig
31writeStaticProject :: Map FilePath FilePath -> FilePath -> StaticConfig -> IO ()
33writeStaticProject :: Map FilePath FilePath -> FilePath -> StaticConfig -> IO ()
32writeStaticProject paths target cfg = do
34writeStaticProject paths target cfg = do
35+ createDirectoryIfMissing True target
36+ T.writeFile (target </> T.unpack (_staticConfig_packageName cfg) <.> "cabal") $ staticCabalFile cfg
33 let modName = _staticConfig_moduleName cfg
37 let modName = _staticConfig_moduleName cfg
38+ (modName', moduleDirPath) = case L.uncons (reverse $ T.splitOn "." modName) of
39+ Nothing -> error $ "writeStaticProject: invalid module name " <> T.unpack modName
40+ Just (name, parents) -> (name, target </> "src" </> T.unpack (T.intercalate "/" $ reverse parents))
41+ createDirectoryIfMissing True moduleDirPath
34 modContents <- staticModuleFile modName paths
42 modContents <- staticModuleFile modName paths
35− writeCabalProject target $ SimplePkg
43+ T.writeFile (moduleDirPath </> T.unpack modName' <.> "hs") modContents
36− { _simplePkg_name = _staticConfig_packageName cfg
44+
37− , _simplePkg_moduleName = _staticConfig_moduleName cfg
45+staticCabalFile :: StaticConfig -> Text
38− , _simplePkg_moduleContents = modContents
46+staticCabalFile cfg = T.unlines
39− , _simplePkg_dependencies = ["base", "ghc-prim", "text"]
47+ [ "name: " <> _staticConfig_packageName cfg
49+ , "cabal-version: >= 1.2"
50+ , "build-type: Simple"
53+ , " hs-source-dirs: src"
58+ , " exposed-modules: " <> _staticConfig_moduleName cfg
42staticModuleFile :: Text -> Map FilePath FilePath -> IO Text
61staticModuleFile :: Text -> Map FilePath FilePath -> IO Text
43staticModuleFile moduleName paths = do
62staticModuleFile moduleName paths = do
@@ -50,7 +69,7 @@ staticModuleFile moduleName paths = do
50 , "{-# LANGUAGE OverloadedStrings #-}"
69 , "{-# LANGUAGE OverloadedStrings #-}"
51 , "{-# LANGUAGE ScopedTypeVariables #-}"
70 , "{-# LANGUAGE ScopedTypeVariables #-}"
52 , "{-# LANGUAGE TypeApplications #-}"
71 , "{-# LANGUAGE TypeApplications #-}"
53− , "module " <> moduleName <> " {-# DEPRECATED \"Generate this module with the 'obelisk-asset-th-generate' executable instead.\" #-} where"
72+ , "module " <> moduleName <> " where"
55 , "import qualified GHC.Types"
74 , "import qualified GHC.Types"
56 , "import Data.Text (Text)"
75 , "import Data.Text (Text)"