summaryrefslogtreecommitdiff
path: root/ddl/Generate.hs
diff options
context:
space:
mode:
Diffstat (limited to 'ddl/Generate.hs')
-rw-r--r--ddl/Generate.hs28
1 files changed, 22 insertions, 6 deletions
diff --git a/ddl/Generate.hs b/ddl/Generate.hs
index 532a012..9f9b7b8 100644
--- a/ddl/Generate.hs
+++ b/ddl/Generate.hs
@@ -1,4 +1,4 @@
1{-# LANGUAGE OverloadedStrings, FlexibleInstances #-} 1{-# LANGUAGE OverloadedStrings, FlexibleInstances, LambdaCase #-}
2import qualified Data.Text.Lazy as LText 2import qualified Data.Text.Lazy as LText
3import Text.EDE 3import Text.EDE
4import Text.EDE.Filters 4import Text.EDE.Filters
@@ -7,8 +7,10 @@ import Data.HashMap.Strict (HashMap)
7import qualified Data.HashMap.Strict as HashMap 7import qualified Data.HashMap.Strict as HashMap
8import Data.Text (Text) 8import Data.Text (Text)
9import qualified Data.Map as Map 9import qualified Data.Map as Map
10import qualified Data.Set as Set
10 11
11import System.Directory 12import System.Directory
13import System.FilePath
12 14
13import Data.Time.Clock 15import Data.Time.Clock
14import Control.Monad.Writer 16import Control.Monad.Writer
@@ -32,7 +34,7 @@ main = do
32 dataCs <- eitherParseFile "templates/data.cs.ede" 34 dataCs <- eitherParseFile "templates/data.cs.ede"
33 dataHs <- eitherParseFile "templates/data.hs.ede" 35 dataHs <- eitherParseFile "templates/data.hs.ede"
34 dataPs <- eitherParseFile "templates/data.purs.ede" 36 dataPs <- eitherParseFile "templates/data.purs.ede"
35 let generate (ModuleDef name imports def) = do 37 let generate mod@(ModuleDef name imports def) = do
36 dt <- getCurrentTime 38 dt <- getCurrentTime
37 let env = fromPairs 39 let env = fromPairs
38 [ "dataAndType" .= def 40 [ "dataAndType" .= def
@@ -40,6 +42,8 @@ main = do
40 , "moduleName" .= name 42 , "moduleName" .= name
41 , "dateTime" .= dt 43 , "dateTime" .= dt
42 , "imports" .= imports 44 , "imports" .= imports
45 , "usedTypes" .= collectTypes aliasMap mod
46 , "usedCSTypes" .= (Set.fromList $ Map.elems $ Map.fromList [ (csType name aliasMap t,t) | t <- Set.toList $ collectTypes aliasMap mod])
43 ] 47 ]
44 aliasMap = Map.fromList [(n,t) | TypeAlias n t <- def] 48 aliasMap = Map.fromList [(n,t) | TypeAlias n t <- def]
45 mylib :: HashMap Text Term 49 mylib :: HashMap Text Term
@@ -50,7 +54,8 @@ main = do
50 , "hsType" @: hsType aliasMap 54 , "hsType" @: hsType aliasMap
51 , "psType" @: psType aliasMap 55 , "psType" @: psType aliasMap
52 , "cppType" @: cppType aliasMap 56 , "cppType" @: cppType aliasMap
53 , "csType" @: csType aliasMap 57 , "csType" @: csType name aliasMap
58 , "csTypeEnum" @: csTypeEnum aliasMap
54 , "javaType" @: javaType aliasMap 59 , "javaType" @: javaType aliasMap
55 , "swiftType" @: swiftType aliasMap 60 , "swiftType" @: swiftType aliasMap
56 ] 61 ]
@@ -63,12 +68,23 @@ main = do
63 either error (\x -> writeFile ("out/" ++ name ++ "2.hpp") $ LText.unpack x) $ dataHpp2 >>= (\t -> eitherRenderWith mylib t env) 68 either error (\x -> writeFile ("out/" ++ name ++ "2.hpp") $ LText.unpack x) $ dataHpp2 >>= (\t -> eitherRenderWith mylib t env)
64 either error (\x -> writeFile ("out/" ++ name ++ ".hpp") $ LText.unpack x) $ dataHpp >>= (\t -> eitherRenderWith mylib t env) 69 either error (\x -> writeFile ("out/" ++ name ++ ".hpp") $ LText.unpack x) $ dataHpp >>= (\t -> eitherRenderWith mylib t env)
65 either error (\x -> writeFile ("out/" ++ name ++ ".cpp") $ LText.unpack x) $ dataCpp >>= (\t -> eitherRenderWith mylib t env) 70 either error (\x -> writeFile ("out/" ++ name ++ ".cpp") $ LText.unpack x) $ dataCpp >>= (\t -> eitherRenderWith mylib t env)
66 {-
67 -- Java 71 -- Java
68 either error (\x -> writeFile ("out/" ++ name ++ ".java") $ LText.unpack x) $ dataJava >>= (\t -> eitherRenderWith mylib t env) 72 forM_ [a | a@DataDef{} <- def {-TODO-}] $ \d -> do
73 let env = fromPairs
74 [ "def" .= d
75 , "moduleName" .= name
76 , "dateTime" .= dt
77 , "imports" .= imports
78 ]
79 toPath a = flip map a $ \case
80 '.' -> '/'
81 c -> c
82 fname = "out/java/" ++ toPath name ++ "/" ++ dataName d ++ ".java"
83 dir = takeDirectory fname
84 createDirectoryIfMissing True dir
85 either error (\x -> writeFile fname $ LText.unpack x) $ dataJava >>= (\t -> eitherRenderWith mylib t env)
69 -- C# 86 -- C#
70 either error (\x -> writeFile ("out/" ++ name ++ ".cs") $ LText.unpack x) $ dataCs >>= (\t -> eitherRenderWith mylib t env) 87 either error (\x -> writeFile ("out/" ++ name ++ ".cs") $ LText.unpack x) $ dataCs >>= (\t -> eitherRenderWith mylib t env)
71 -}
72 -- Swift 88 -- Swift
73 either error (\x -> writeFile ("out/" ++ name ++ ".swift") $ LText.unpack x) $ dataSwift >>= (\t -> eitherRenderWith mylib t env) 89 either error (\x -> writeFile ("out/" ++ name ++ ".swift") $ LText.unpack x) $ dataSwift >>= (\t -> eitherRenderWith mylib t env)
74 mapM_ generate $ execWriter modules 90 mapM_ generate $ execWriter modules