packages feed

fficxx-0.7.0.0: src/FFICXX/Generate/Type/Cabal.hs

{-# LANGUAGE DeriveGeneric #-}

module FFICXX.Generate.Type.Cabal where

import Data.Aeson
  ( FromJSON (..),
    ToJSON (..),
    defaultOptions,
    genericParseJSON,
    genericToJSON,
  )
import Data.Aeson.Types (fieldLabelModifier)
import Data.Text (Text)
import GHC.Generics (Generic)

data AddCInc = AddCInc FilePath String

data AddCSrc = AddCSrc FilePath String

-- TODO: change String to Text
newtype CabalName = CabalName {unCabalName :: String}
  deriving (Show, Eq, Ord)

data BuildType
  = Simple
  | -- | dependencies
    Custom [CabalName]

-- TODO: change String to Text
data Cabal = Cabal
  { cabal_pkgname :: CabalName,
    cabal_version :: String,
    cabal_cheaderprefix :: String,
    cabal_moduleprefix :: String,
    cabal_additional_c_incs :: [AddCInc],
    cabal_additional_c_srcs :: [AddCSrc],
    cabal_additional_pkgdeps :: [CabalName],
    cabal_license :: Maybe String,
    cabal_licensefile :: Maybe String,
    cabal_extraincludedirs :: [FilePath],
    cabal_extralibdirs :: [FilePath],
    cabal_extrafiles :: [FilePath],
    cabal_pkg_config_depends :: [String],
    cabal_buildType :: BuildType
  }

data GeneratedCabalInfo = GeneratedCabalInfo
  { gci_pkgname :: Text,
    gci_version :: Text,
    gci_synopsis :: Text,
    gci_description :: Text,
    gci_homepage :: Text,
    gci_license :: Text,
    gci_licenseFile :: Text,
    gci_author :: Text,
    gci_maintainer :: Text,
    gci_category :: Text,
    gci_buildtype :: Text,
    gci_extraFiles :: [Text],
    gci_csrcFiles :: [Text],
    gci_sourcerepository :: Text,
    gci_cxxOptions :: [Text],
    gci_pkgdeps :: [Text],
    gci_exposedModules :: [Text],
    gci_otherModules :: [Text],
    gci_extraLibDirs :: [Text],
    gci_extraLibraries :: [Text],
    gci_extraIncludeDirs :: [Text],
    gci_pkgconfigDepends :: [Text],
    gci_includeFiles :: [Text],
    gci_cppFiles :: [Text]
  }
  deriving (Show, Generic)

instance ToJSON GeneratedCabalInfo where
  toJSON = genericToJSON defaultOptions {fieldLabelModifier = drop 4}

instance FromJSON GeneratedCabalInfo where
  parseJSON = genericParseJSON defaultOptions {fieldLabelModifier = drop 4}