forked from commercialhaskell/stack
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathImage.hs
More file actions
99 lines (83 loc) · 3.35 KB
/
Copy pathImage.hs
File metadata and controls
99 lines (83 loc) · 3.35 KB
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Stack.Types.Image where
import Data.Aeson.Extended
import Data.Monoid
import Data.Map (Map)
import qualified Data.Map as Map
import Data.Maybe (maybeToList)
import Data.Text (Text)
import Prelude -- Fix redundant import warnings
-- | Image options. Currently only Docker image options.
data ImageOpts = ImageOpts
{ imgDockers :: ![ImageDockerOpts]
-- ^ One or more stanzas for docker image settings.
} deriving (Show)
data ImageDockerOpts = ImageDockerOpts
{ imgDockerBase :: !(Maybe String)
-- ^ Maybe have a docker base image name. (Although we will not
-- be able to create any Docker images without this.)
, imgDockerEntrypoints :: !(Maybe [String])
-- ^ Maybe have a specific ENTRYPOINT list that will be used to
-- create images.
, imgDockerAdd :: !(Map FilePath FilePath)
-- ^ Maybe have some static project content to include in a
-- specific directory in all the images.
, imgDockerImageName :: !(Maybe String)
-- ^ Maybe have a name for the image we are creating
, imgDockerExecutables :: !(Maybe [FilePath])
-- ^ Filenames of executables to add (if Nothing, add them all)
} deriving (Show)
data ImageOptsMonoid = ImageOptsMonoid
{ imgMonoidDockers :: ![ImageDockerOpts]
} deriving (Show)
instance FromJSON (ImageOptsMonoid, [JSONWarning]) where
parseJSON = withObjectWarnings
"ImageOptsMonoid"
(\o ->
do (oldDocker :: Maybe ImageDockerOpts) <- jsonSubWarningsT (o ..:? imgDockerOldArgName)
(dockers :: [ImageDockerOpts]) <- jsonSubWarningsT (o ..:? imgDockersArgName ..!= [])
let imgMonoidDockers = dockers ++ maybeToList oldDocker
return
ImageOptsMonoid
{ ..
})
instance Monoid ImageOptsMonoid where
mempty = ImageOptsMonoid
{ imgMonoidDockers = []
}
mappend l r = ImageOptsMonoid
{ imgMonoidDockers = imgMonoidDockers l <> imgMonoidDockers r
}
instance FromJSON (ImageDockerOpts, [JSONWarning]) where
parseJSON = withObjectWarnings
"ImageDockerOpts"
(\o ->
do imgDockerBase <- o ..:? imgDockerBaseArgName
imgDockerEntrypoints <- o ..:? imgDockerEntrypointsArgName
imgDockerAdd <- o ..:? imgDockerAddArgName ..!= Map.empty
imgDockerImageName <- o ..:? imgDockerImageNameArgName
imgDockerExecutables <- o ..:? imgDockerExecutablesArgName
return
ImageDockerOpts
{ ..
})
imgArgName :: Text
imgArgName = "image"
-- Kept for backward compatibility
imgDockerOldArgName :: Text
imgDockerOldArgName = "container"
imgDockersArgName :: Text
imgDockersArgName = "containers"
imgDockerBaseArgName :: Text
imgDockerBaseArgName = "base"
imgDockerAddArgName :: Text
imgDockerAddArgName = "add"
imgDockerEntrypointsArgName :: Text
imgDockerEntrypointsArgName = "entrypoints"
imgDockerImageNameArgName :: Text
imgDockerImageNameArgName = "name"
imgDockerExecutablesArgName :: Text
imgDockerExecutablesArgName = "executables"