packages feed

fficxx-0.6: src/FFICXX/Generate/Type/Module.hs

module FFICXX.Generate.Type.Module where

import FFICXX.Runtime.CodeGen.Cxx ( HeaderName(..), Namespace(..) )
--
import FFICXX.Generate.Type.Cabal ( AddCInc, AddCSrc )
import FFICXX.Generate.Type.Class ( Class, TemplateClass, TopLevel )


-- | C++ side
--   HPkg is generated C++ headers by fficxx, CPkg is original C++ headers
data ClassImportHeader =
  ClassImportHeader {
    cihClass :: Class
  , cihSelfHeader :: HeaderName -- ^ fficxx-side main header
  , cihNamespace :: [Namespace]
  , cihSelfCpp :: String
  , cihImportedClasses :: [Either TemplateClass Class]  -- ^ Dependencies TODO: clarify this.
  , cihIncludedHPkgHeadersInH   :: [HeaderName]         -- TODO: Explain why we need to have these two
  , cihIncludedHPkgHeadersInCPP :: [HeaderName]         --       separately.
  , cihIncludedCPkgHeaders      :: [HeaderName] -- ^ C++-side headers
  } deriving (Show)


-------------------------
-- Haskell side module --
-------------------------

data ClassModule =
  ClassModule {
    cmModule :: String
  , cmCIH :: ClassImportHeader
  , cmImportedModulesHighNonSource :: [Either TemplateClass Class]
    -- ^ imported modules that do not need source
    -- NOTE: source means the same cabal package.
    -- TODO: rename Source to something more clear.
  , cmImportedModulesRaw :: [Either TemplateClass Class]
    -- ^ imported modules for raw types.
  , cmImportedModulesHighSource :: [Either TemplateClass Class]
    -- ^ imported modules that need source
  , cmImportedModulesForFFI :: [Either TemplateClass Class]
  , cmExtraImport :: [String]
  } deriving (Show)


data TemplateClassModule =
  TCM {
    tcmModule :: String
  , tcmTCIH :: TemplateClassImportHeader
  } deriving (Show)


data TemplateClassImportHeader =
  TCIH {
    tcihTClass :: TemplateClass
  , tcihCxxHeaders :: [HeaderName] -- ^ C++-side headers
  } deriving (Show)

data TopLevelImportHeader =
  TopLevelImportHeader {
    tihHeaderFileName    :: String
  , tihClassDep          :: [ClassImportHeader]
  , tihExtraClassDep     :: [Either TemplateClass Class]
    -- ^ Extra class dependencies outside current package.
    --   NOTE: we cannot fully construct ClassImportHeader for them.
  , tihFuncs             :: [TopLevel]
  , tihNamespaces        :: [Namespace]
  , tihExtraHeadersInH   :: [HeaderName]
  , tihExtraHeadersInCPP :: [HeaderName]
  } deriving (Show)

data PackageConfig =
  PkgConfig {
    pcfg_classModules :: [ClassModule]
  , pcfg_classImportHeaders :: [ClassImportHeader]
  , pcfg_topLevelImportHeader :: TopLevelImportHeader
  , pcfg_templateClassModules :: [TemplateClassModule]
  , pcfg_templateClassImportHeaders :: [TemplateClassImportHeader]
  , pcfg_additional_c_incs :: [AddCInc]
  , pcfg_additional_c_srcs :: [AddCSrc]
  }