summaryrefslogtreecommitdiff
path: root/protocols/codegen/Wayland/CodeGen/BuildGen.hs
blob: 42d4b1dec9942b0d3bee5758ce11a7530b9ea7a7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
module Wayland.CodeGen.BuildGen
  ( generateBuild
  ) where

import Wayland.CodeGen.Types
import Wayland.CodeGen.Utils

data ModuleInfo
  = ModuleInfo { modProtocol  :: !Protocol
               , modInterface :: !InterfaceDesc
               }

generateBuild :: [Protocol] -> String
generateBuild protocols = unlines ([ "cabal-version:      3.0"
                                   , "name:               highway-protocols"
                                   , "version:            1.0.0"
                                   , "synopsis:           Generated bindings for some Wayland protocols."
                                   , "build-type:         Simple"
                                   , ""
                                   , "common warnings"
                                   , "    ghc-options: -Wall -Wno-unused-imports -Wno-dodgy-exports"
                                   , ""
                                   , "library"
                                   , "    import:           warnings"
                                   , "    build-depends:    base,"
                                   , "                      hashable,"
                                   , "                      bytestring,"
                                   , "                      highway-wayland"
                                   , "    default-language: Haskell2010" ]
                                   ++ exposedModules (collectModules protocols))
  where exposedModules  []     = []
        exposedModules  [m]    = ["    exposed-modules:  " ++ formatModule m]
        exposedModules  (m:ms) = ("    exposed-modules:  " ++ formatModule m ++ ",") : exposedModules' ms
        exposedModules' [m]    = ["                      " ++ formatModule m]
        exposedModules' (m:ms) = ("                      " ++ formatModule m ++ ",") : exposedModules' ms
        exposedModules' []     = []

formatModule :: ModuleInfo -> String
formatModule m = fullModule (modProtocol m) (modInterface m)

collectModules :: [Protocol] -> [ModuleInfo]
collectModules = concatMap singleProtocol
  where singleProtocol  p   = fmap (singleInterface p) (protInterfaces p)
        singleInterface p i = ModuleInfo { modProtocol  = p
                                         , modInterface = i
                                         }