@@ -10,6 +10,7 @@ module Obelisk.Asset.Promoted
1010import Obelisk.Asset.Gather
1111
1212import Data.Foldable
13+import qualified Data.List as L
1314import Language.Haskell.TH (runQ, pprint)
1415import Language.Haskell.TH.Syntax hiding (lift)
1516import GHC.TypeLits
@@ -17,11 +18,12 @@ import Data.Sequence (Seq)
1718import qualified Data.Sequence as Seq
1819import Control.Monad.Trans.Writer
1920import System.FilePath
21+import System.Directory
2022import Data.Text (Text)
2123import qualified Data.Text as T
24+import qualified Data.Text.IO as T
2225import Data.Map (Map)
2326import qualified Data.Map as Map
24−import Obelisk.Asset.Cabal (writeCabalProject, SimplePkg(..))
2527
2628data StaticConfig = StaticConfig
2729 { _staticConfig_packageName :: Text --TODO: Better type
@@ -30,14 +32,31 @@ data StaticConfig = StaticConfig
3032
3133writeStaticProject :: Map FilePath FilePath -> FilePath -> StaticConfig -> IO ()
3234writeStaticProject paths target cfg = do
35+ createDirectoryIfMissing True target
36+ T.writeFile (target </> T.unpack (_staticConfig_packageName cfg) <.> "cabal") $ staticCabalFile cfg
3337 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
3442 modContents <- staticModuleFile modName paths
35− writeCabalProject target $ SimplePkg
36− { _simplePkg_name = _staticConfig_packageName cfg
37− , _simplePkg_moduleName = _staticConfig_moduleName cfg
38− , _simplePkg_moduleContents = modContents
39− , _simplePkg_dependencies = ["base", "ghc-prim", "text"]
40− }
43+ T.writeFile (moduleDirPath </> T.unpack modName' <.> "hs") modContents
44+
45+staticCabalFile :: StaticConfig -> Text
46+staticCabalFile cfg = T.unlines
47+ [ "name: " <> _staticConfig_packageName cfg
48+ , "version: 0"
49+ , "cabal-version: >= 1.2"
50+ , "build-type: Simple"
51+ , ""
52+ , "library"
53+ , " hs-source-dirs: src"
54+ , " build-depends:"
55+ , " base,"
56+ , " ghc-prim,"
57+ , " text"
58+ , " exposed-modules: " <> _staticConfig_moduleName cfg
59+ ]
4160
4261staticModuleFile :: Text -> Map FilePath FilePath -> IO Text
4362staticModuleFile moduleName paths = do
@@ -50,7 +69,7 @@ staticModuleFile moduleName paths = do
5069 , "{-# LANGUAGE OverloadedStrings #-}"
5170 , "{-# LANGUAGE ScopedTypeVariables #-}"
5271 , "{-# LANGUAGE TypeApplications #-}"
53− , "module " <> moduleName <> " {-# DEPRECATED \"Generate this module with the 'obelisk-asset-th-generate' executable instead.\" #-} where"
72+ , "module " <> moduleName <> " where"
5473 , ""
5574 , "import qualified GHC.Types"
5675 , "import Data.Text (Text)"