diff options
Diffstat (limited to 'ddl/Generate.hs')
-rw-r--r-- | ddl/Generate.hs | 28 |
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 #-} |
2 | import qualified Data.Text.Lazy as LText | 2 | import qualified Data.Text.Lazy as LText |
3 | import Text.EDE | 3 | import Text.EDE |
4 | import Text.EDE.Filters | 4 | import Text.EDE.Filters |
@@ -7,8 +7,10 @@ import Data.HashMap.Strict (HashMap) | |||
7 | import qualified Data.HashMap.Strict as HashMap | 7 | import qualified Data.HashMap.Strict as HashMap |
8 | import Data.Text (Text) | 8 | import Data.Text (Text) |
9 | import qualified Data.Map as Map | 9 | import qualified Data.Map as Map |
10 | import qualified Data.Set as Set | ||
10 | 11 | ||
11 | import System.Directory | 12 | import System.Directory |
13 | import System.FilePath | ||
12 | 14 | ||
13 | import Data.Time.Clock | 15 | import Data.Time.Clock |
14 | import Control.Monad.Writer | 16 | import 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 |