Quellcode durchsuchen

gidl: add cabal file generator

Pat Hickey vor 9 Jahren
Ursprung
Commit
6579d2e5b5
3 geänderte Dateien mit 69 neuen und 4 gelöschten Zeilen
  1. 1 0
      gidl.cabal
  2. 58 0
      src/Gidl/Backend/Cabal.hs
  3. 10 4
      tests/Test.hs

+ 1 - 0
gidl.cabal

@@ -17,6 +17,7 @@ library
                        Gidl.Types,
                        Gidl.Types.AST,
                        Gidl.Types.Base,
+                       Gidl.Backend.Cabal,
                        Gidl.Backend.Haskell,
                        Gidl.Backend.Haskell.Types
 

+ 58 - 0
src/Gidl/Backend/Cabal.hs

@@ -0,0 +1,58 @@
+{-# LANGUAGE RecordWildCards #-}
+
+module Gidl.Backend.Cabal where
+
+import Ivory.Artifact
+import Text.PrettyPrint.Mainland
+
+data CabalFile =
+  CabalFile
+    { name :: String
+    , version :: String
+    , author :: String
+    , exposed_modules :: [String]
+    , build_depends :: [String]
+    , hs_source_dirs :: [String]
+    , default_language :: String
+    , ghc_options :: String
+    } deriving (Eq, Show)
+
+defaultCabalFile :: String -> [String] -> [String] -> CabalFile
+defaultCabalFile name_ exposed_modules_ build_depends_ = CabalFile
+  { name = name_
+  , version = "0.1.0.0"
+  , author = "Generated by Gidl"
+  , exposed_modules = exposed_modules_
+  , build_depends = "base >= 4.7" : build_depends_
+  , hs_source_dirs = ["src"]
+  , default_language = "Haskell2010"
+  , ghc_options = "-Wall"
+  }
+
+cabalFileArtifact :: CabalFile -> Artifact
+cabalFileArtifact CabalFile{..} = artifactText (name ++ ".cabal") $
+  prettyLazyText 80 $ stack
+    [ text "name:" <+> text name
+    , text "version:" <+> text version
+    , text "author:" <+> text author
+    , text "build-type: Simple"
+    , text "cabal-version: >=1.10"
+    , empty
+    , text "library"
+    , indent 2 $ stack
+      [ text "exposed-modules:" <+>
+          align (stack (punctuate comma (map text exposed_modules)))
+      , text "build-depends:" <+>
+          align (stack (punctuate comma (map text build_depends)))
+      , text "hs-source-dirs:" <+> sep (punctuate comma (map text hs_source_dirs))
+      , text "default-language:" <+> text default_language
+      , text "ghc-options:" <+> text ghc_options
+      ]
+    ]
+
+filePathToPackage :: String -> String
+filePathToPackage ('.':'h':'s':[]) = []
+filePathToPackage ('/':as) = '.' : filePathToPackage as
+filePathToPackage (a:as) = a : filePathToPackage as
+filePathToPackage [] = []
+

+ 10 - 4
tests/Test.hs

@@ -7,6 +7,7 @@ import Gidl.Interface
 import Gidl.Parse
 import Gidl.Schema
 import Gidl.Backend.Haskell.Types
+import Gidl.Backend.Cabal
 
 main :: IO ()
 main = test "tests/testtypes.sexpr"
@@ -19,12 +20,17 @@ test f = do
     Right (te@(TypeEnv te'), ie@(InterfaceEnv ie')) -> do
       print te
       putStrLn "---"
-      forM_ te' $ \(tn, t) -> do
+      as <- forM te' $ \(tn, t) -> do
         putStrLn (tn ++ ":")
         print (typeLeaves t)
-        printArtifact (typeModule (words "Sample IDL Haskell Types")
-                                  (typeDescrToRepr tn te))
-
+        let a = typeModule (words "Sample IDL Haskell Types")
+                           (typeDescrToRepr tn te)
+        printArtifact a
+        return a
+      let c = cabalFileArtifact $ defaultCabalFile "sample-idl-haskell"
+                                    (map (filePathToPackage . artifactFileName) as)
+                                    []
+      printArtifact c
       {-
       putStrLn "---"
       print ie