Haskell.hs 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  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.Interface
  8. import Ivory.Artifact
  9. import Data.Maybe (catMaybes)
  10. import System.Exit (exitFailure, exitSuccess)
  11. haskellBackend :: TypeEnv -> InterfaceEnv -> String -> [String] -> [Artifact]
  12. haskellBackend te@(TypeEnv te') ie@(InterfaceEnv ie') pkgname namespace =
  13. cabalFileArtifact cf : (map (artifactPath "src") (tmods ++ imods))
  14. where
  15. tmods = [ typeModule (namespace ++ ["Types"]) tr
  16. | (tn, _t) <- te'
  17. , let tr = typeDescrToRepr tn te
  18. , isUserDefined tr
  19. ]
  20. imods = [ interfaceModule (namespace ++ ["Interface"]) ir
  21. | (iname, _i) <- ie'
  22. , let ir = interfaceDescrToRepr iname ie te
  23. ]
  24. cf = defaultCabalFile pkgname mods deps
  25. mods = [ filePathToPackage (artifactFileName m) | m <- (tmods ++ imods)]
  26. deps = [ "cereal", "QuickCheck" ]
  27. runHaskellBackend :: FilePath -> String -> [String] -> FilePath -> IO ()
  28. runHaskellBackend idlfile pkgname namespace outdir = do
  29. c <- readFile idlfile
  30. case parseDecls c of
  31. Left e -> print e >> exitFailure
  32. Right (te, ie) -> do
  33. let as = haskellBackend te ie pkgname namespace
  34. es <- mapM (putArtifact outdir) as
  35. case catMaybes es of
  36. [] -> exitSuccess
  37. ees -> putStrLn (unlines ees) >> exitFailure