Tower.hs 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. module Gidl.Backend.Tower where
  2. import Data.List (intercalate)
  3. import Ivory.Artifact
  4. import Ivory.Artifact.Template
  5. import qualified Paths_gidl as P
  6. import Gidl.Types
  7. import Gidl.Interface
  8. import Gidl.Schema
  9. import Gidl.Backend.Cabal
  10. import Gidl.Backend.Ivory (dotwords, ivorySources)
  11. import Gidl.Backend.Ivory.Schema (ifModuleName)
  12. import Gidl.Backend.Tower.Schema
  13. import Gidl.Backend.Tower.Server
  14. towerBackend :: TypeEnv -> InterfaceEnv -> String -> String -> [Artifact]
  15. towerBackend te ie pkgname namespace_raw =
  16. [ cabalFileArtifact cf
  17. , makefile
  18. , defaultconf
  19. , artifactPath "tests" (codegenTest ie namespace)
  20. ] ++ map (artifactPath "src") sources
  21. where
  22. namespace = dotwords namespace_raw
  23. sources = isources ++ [ attrModule (namespace ++ ["Tower"]) ] ++ tsources
  24. tsources = towerSources ie (namespace ++ ["Tower"])
  25. isources = ivorySources te ie (namespace ++ ["Ivory"])
  26. cf = (defaultCabalFile pkgname cabalmods deps) { executables = [ cg_exe ] }
  27. cabalmods = map (filePathToPackage . artifactFileName) sources
  28. deps = words "ivory ivory-stdlib ivory-serialize tower"
  29. cg_exe = defaultCabalExe (pkgname ++ "-gen") "CodeGen.hs"
  30. (deps ++ (words "tower-config tower-freertos-stm32") ++ [pkgname])
  31. towerSources :: InterfaceEnv -> [String] -> [Artifact]
  32. towerSources (InterfaceEnv ie) namespace = towerInterfaces
  33. where
  34. towerInterfaces = concat
  35. [ [ schemaModule ifnamespace i (producerSchema i)
  36. , schemaModule ifnamespace i (consumerSchema i)
  37. , serverModule ifnamespace i
  38. , umbrellaModule ifnamespace i
  39. ]
  40. | (_iname, i) <- ie ]
  41. ifnamespace = namespace ++ ["Interface"]
  42. makefile :: Artifact
  43. makefile = artifactCabalFile P.getDataDir "support/tower/Makefile"
  44. defaultconf :: Artifact
  45. defaultconf = artifactCabalFile P.getDataDir "support/tower/default.conf"
  46. codegenTest :: InterfaceEnv -> [String] -> Artifact
  47. codegenTest (InterfaceEnv ie) modulepath =
  48. artifactCabalFileTemplate P.getDataDir fname
  49. [("module_path",intercalate "." modulepath)
  50. ,("imports", intercalate "\n"
  51. [ "import "
  52. ++ interfaceImport (ifModuleName i) "Producer"
  53. ++ "\n"
  54. ++ "import "
  55. ++ interfaceImport (ifModuleName i) "Consumer"
  56. | (_, i) <- ie
  57. ])
  58. ,("app_body", intercalate "\n " (concat [ interfaceTest i | (_, i) <- ie ]))
  59. ]
  60. where
  61. fname = "support/tower/CodeGen.hs.template"
  62. interfaceImport i j = intercalate "." (modulepath ++ ["Tower", "Interface", i, j])
  63. interfaceTest :: Interface -> [String]
  64. interfaceTest i = [ schemaTest (producerSchema i)
  65. , schemaTest (consumerSchema i)
  66. ]
  67. where
  68. schemaTest :: Schema -> String
  69. schemaTest (Schema _ []) = []
  70. schemaTest (Schema schemaName _)
  71. = (inputFuncName ((ifModuleName i) ++ schemaName))
  72. ++ " (snd c) >>= \\i -> "
  73. ++ (outputFuncName ((ifModuleName i) ++ schemaName))
  74. ++ " i >>= \\(_ :: ChanOutput (Array 80 (Stored Uint8))) -> return ()"
  75. attrModule :: [String] -> Artifact
  76. attrModule modulepath =
  77. artifactPath (intercalate "/" modulepath) $
  78. artifactCabalFileTemplate P.getDataDir fname
  79. [("module_path", intercalate "." modulepath )]
  80. where
  81. fname = "support/tower/Attr.hs.template"