hix-0.4.0.0: lib/Hix/Data/ComponentConfig.hs
module Hix.Data.ComponentConfig where
import Data.Aeson (FromJSON (parseJSON), FromJSONKey, withObject, (.:))
import Path (Abs, Dir, File, Path, Rel)
newtype PackagePath =
PackagePath { unPackagePath :: Path Rel Dir }
deriving stock (Eq, Show, Ord, Generic)
deriving newtype (FromJSON, FromJSONKey)
newtype SourceDir =
SourceDir { unSourceDir :: Path Rel Dir }
deriving stock (Eq, Show, Generic)
deriving newtype (FromJSON)
newtype SourceDirs =
SourceDirs { unSourceDirs :: [SourceDir] }
deriving stock (Eq, Show, Generic)
instance FromJSON SourceDirs where
parseJSON v =
(SourceDirs <$> parseJSON v)
<|>
(SourceDirs . pure <$> parseJSON v)
newtype PackageName =
PackageName { unPackageName :: Text }
deriving stock (Eq, Show, Generic)
deriving newtype (IsString, Ord, FromJSON, FromJSONKey)
newtype ModuleName =
ModuleName { unModuleName :: Text }
deriving stock (Eq, Show, Generic)
deriving newtype (IsString, Ord, FromJSON, FromJSONKey)
newtype ComponentName =
ComponentName { unComponentName :: Text }
deriving stock (Eq, Show, Generic)
deriving newtype (IsString, Ord, FromJSON, FromJSONKey)
newtype EnvName =
EnvName { unEnvName :: Text }
deriving stock (Eq, Show, Generic)
deriving newtype (IsString, Ord, FromJSON, FromJSONKey)
newtype EnvRunner =
EnvRunner (Path Abs File)
deriving stock (Eq, Show, Generic)
deriving newtype (FromJSON)
data PreludePackage =
PreludePackageName Text
|
PreludePackageSpec { name :: Text }
deriving stock (Eq, Show, Generic)
instance FromJSON PreludePackage where
parseJSON v =
hpackStruct v <|> plainName
where
hpackStruct = withObject "PreludePackageSpec" \ o -> o .: "name"
plainName = PreludePackageName <$> parseJSON v
data PreludeConfig =
PreludeConfig {
package :: PreludePackage,
module_ :: ModuleName
}
deriving stock (Eq, Show, Generic)
instance FromJSON PreludeConfig where
parseJSON =
withObject "PreludeConfig" \ o -> do
package <- o .: "package"
module_ <- o .: "module"
pure PreludeConfig {..}
data ComponentConfig =
ComponentConfig {
name :: ComponentName,
sourceDirs :: SourceDirs,
runner :: Maybe EnvRunner,
extensions :: [String],
language :: String,
ghcOptions :: [String],
prelude :: Maybe PreludeConfig
}
deriving stock (Eq, Show, Generic)
deriving anyclass (FromJSON)
data PackageConfig =
PackageConfig {
name :: PackageName,
src :: Path Rel Dir,
components :: Map ComponentName ComponentConfig
}
deriving stock (Eq, Show, Generic)
deriving anyclass (FromJSON)
type PackagesConfig = Map PackageName PackageConfig
data Target =
Target {
package :: PackageConfig,
component :: ComponentConfig,
sourceDir :: Maybe SourceDir
}
deriving stock (Eq, Show, Generic)