Haskell.hs 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. module Gidl.Backend.Haskell where
  2. import Gidl.Types
  3. import Gidl.Interface
  4. import Gidl.Backend.Cabal
  5. import Gidl.Backend.Haskell.Types
  6. import Gidl.Backend.Haskell.Test
  7. import Gidl.Backend.Haskell.Interface
  8. import Ivory.Artifact
  9. import Data.Char (isSpace)
  10. haskellBackend :: TypeEnv -> InterfaceEnv -> String -> String -> [Artifact]
  11. haskellBackend te@(TypeEnv te') ie@(InterfaceEnv ie') pkgname namespace_raw =
  12. [ cabalFileArtifact cf
  13. , makefile
  14. , artifactPath "tests" serializeTestMod
  15. ] ++
  16. [ artifactPath "src" m | m <- sourceMods
  17. ]
  18. where
  19. tmods = [ typeModule (namespace ++ ["Types"]) tr
  20. | (tn, _t) <- te'
  21. , let tr = typeDescrToRepr tn te
  22. , isUserDefined tr
  23. ]
  24. imods = [ interfaceModule (namespace ++ ["Interface"]) ir
  25. | (iname, _i) <- ie'
  26. , let ir = interfaceDescrToRepr iname ie te
  27. ]
  28. sourceMods = tmods ++ imods
  29. cf = (defaultCabalFile pkgname cabalmods deps) { tests = [ serializeTest ] }
  30. cabalmods = [ filePathToPackage (artifactFileName m) | m <- sourceMods ]
  31. deps = [ "cereal", "QuickCheck" ]
  32. serializeTest = defaultCabalTest "serialize-test" "SerializeTest.hs"
  33. (pkgname:deps)
  34. serializeTestMod = serializeTestModule namespace
  35. [ interfaceDescrToRepr iname ie te | (iname, _i) <- ie']
  36. namespace = dotwords namespace_raw
  37. dotwords :: String -> [String]
  38. dotwords s = case dropWhile isDot s of
  39. "" -> []
  40. s' -> let (w, s'') = break isDot s' in w : dotwords s''
  41. isDot c = (c == '.') || isSpace c