{-# LANGUAGE DeriveGeneric #-}
module Buffet.Parse.Print
( get
) where
import qualified Buffet.Ir.Ir as Ir
import qualified Buffet.Toolbox.DockerTools as DockerTools
import qualified Buffet.Toolbox.TextTools as TextTools
import qualified Data.Aeson as Aeson
import qualified Data.Map.Strict as Map
import qualified Data.Text as T
import qualified GHC.Generics as Generics
import qualified Language.Docker as Docker
import Prelude (Eq, FilePath, Maybe, Ord, Show, ($), (.), (<$>), fmap)
data Buffet =
Buffet
{ copyDummySourcePath :: T.Text
, optionToDish :: Map.Map Ir.Option Dish
}
deriving (Eq, Generics.Generic, Ord, Show)
instance Aeson.ToJSON Buffet where
toJSON = Aeson.genericToJSON TextTools.defaultJsonOptions
data Dish =
Dish
{ dockerfilePath :: FilePath
, metadata :: Metadata
, beforeFirstBuildStage :: DockerfilePart
, localBuildStages :: [DockerfilePart]
, globalBuildStage :: DockerfilePart
, healthCheck :: Maybe T.Text
}
deriving (Eq, Generics.Generic, Ord, Show)
instance Aeson.ToJSON Dish where
toJSON = Aeson.genericToJSON TextTools.defaultJsonOptions
data Metadata =
Metadata
{ title :: T.Text
, url :: T.Text
, tags :: Map.Map Ir.TagKey [Ir.TagValue]
}
deriving (Eq, Generics.Generic, Ord, Show)
instance Aeson.ToJSON Metadata where
toJSON = Aeson.genericToJSON TextTools.defaultJsonOptions
type DockerfilePart = [T.Text]
get :: Ir.Buffet -> T.Text
get = TextTools.prettyPrintJson . transformBuffet
transformBuffet :: Ir.Buffet -> Buffet
transformBuffet buffet =
Buffet
{ copyDummySourcePath = Ir.copyDummySourcePath buffet
, optionToDish = transformDish <$> Ir.optionToDish buffet
}
transformDish :: Ir.Dish -> Dish
transformDish dish =
Dish
{ dockerfilePath = Ir.dockerfilePath dish
, metadata = transformMetadata $ Ir.metadata dish
, beforeFirstBuildStage =
transformDockerfilePart $ Ir.beforeFirstBuildStage dish
, localBuildStages = transformDockerfilePart <$> Ir.localBuildStages dish
, globalBuildStage = transformDockerfilePart $ Ir.globalBuildStage dish
, healthCheck = Ir.healthCheck dish
}
transformMetadata :: Ir.Metadata -> Metadata
transformMetadata meta =
Metadata {title = Ir.title meta, url = Ir.url meta, tags = Ir.tags meta}
transformDockerfilePart :: Ir.DockerfilePart -> DockerfilePart
transformDockerfilePart = fmap transformInstruction
transformInstruction :: Docker.Instruction T.Text -> T.Text
transformInstruction = T.stripEnd . DockerTools.printInstruction