Haskell.hs 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. module Gidl.Backend.Haskell where
  2. import Gidl.Types
  3. import Gidl.Parse
  4. import Gidl.Interface
  5. import Gidl.Backend.Cabal
  6. import Gidl.Backend.Haskell.Types
  7. import Gidl.Backend.Haskell.Test
  8. import Gidl.Backend.Haskell.Interface
  9. import Ivory.Artifact
  10. import Data.Maybe (catMaybes)
  11. import System.Exit (exitFailure, exitSuccess)
  12. haskellBackend :: TypeEnv -> InterfaceEnv -> String -> [String] -> [Artifact]
  13. haskellBackend te@(TypeEnv te') ie@(InterfaceEnv ie') pkgname namespace =
  14. [ cabalFileArtifact cf
  15. , makefile
  16. , artifactPath "tests" serializeTestMod
  17. ] ++
  18. [ artifactPath "src" m | m <- sourceMods
  19. ]
  20. where
  21. tmods = [ typeModule (namespace ++ ["Types"]) tr
  22. | (tn, _t) <- te'
  23. , let tr = typeDescrToRepr tn te
  24. , isUserDefined tr
  25. ]
  26. imods = [ interfaceModule (namespace ++ ["Interface"]) ir
  27. | (iname, _i) <- ie'
  28. , let ir = interfaceDescrToRepr iname ie te
  29. ]
  30. sourceMods = tmods ++ imods
  31. cf = (defaultCabalFile pkgname cabalmods deps) { tests = [ serializeTest ] }
  32. cabalmods = [ filePathToPackage (artifactFileName m) | m <- sourceMods ]
  33. deps = [ "cereal", "QuickCheck" ]
  34. serializeTest = defaultCabalTest "serialize-test" "SerializeTest.hs"
  35. (pkgname:deps)
  36. serializeTestMod = serializeTestModule namespace
  37. [ interfaceDescrToRepr iname ie te | (iname, _i) <- ie']
  38. runHaskellBackend :: FilePath -> String -> [String] -> FilePath -> IO ()
  39. runHaskellBackend idlfile pkgname namespace outdir = do
  40. c <- readFile idlfile
  41. case parseDecls c of
  42. Left e -> print e >> exitFailure
  43. Right (te, ie) -> do
  44. let as = haskellBackend te ie pkgname namespace
  45. es <- mapM (putArtifact outdir) as
  46. case catMaybes es of
  47. [] -> exitSuccess
  48. ees -> putStrLn (unlines ees) >> exitFailure