@@ -1,13 +1,15 @@
11module Docker.Types where
22
3+import Control.Monad (mzero)
34import Control.Monad.Except (ExceptT, runExceptT)
45import Control.Monad.Reader (ReaderT, runReaderT)
56import Data.Aeson (FromJSON, ToJSON, encode,
6− genericParseJSON, genericToJSON,
7− parseJSON, toJSON)
7+ genericParseJSON, genericToJSON, object,
8+ parseJSON, toJSON, (.:), (.=))
89import Data.Aeson.Types (defaultOptions, fieldLabelModifier)
910import qualified Data.ByteString.Lazy as BL
1011import Data.Char (toUpper)
12+import qualified Data.Map as M
1113import Data.Text (Text)
1214import qualified Data.Text as T
1315import GHC.Generics (Generic)
@@ -26,9 +28,9 @@ type Response = HTTP.Response BL.ByteString
2628data Signal = SIGINT | SIGKILL deriving (Eq, Show)
2729
2830data DockerClientOpts m = DockerClientOpts {
29− http :: Request -> m Response
30− , apiVersion :: ApiVersion
31− , baseUrl :: URL
31+ http :: Request -> m Response
32+ , apiVer :: ApiVersion
33+ , baseUrl :: URL
3234 }
3335
3436type DockerT m a = ReaderT (DockerClientOpts m) (ExceptT String m) a
@@ -42,16 +44,19 @@ data ListOpts = ListOpts { all :: Bool } deriving (Eq, Show)
4244defaultClientOpts :: DockerClientOpts IO
4345defaultClientOpts = DockerClientOpts {
4446 http = undefined
45− , apiVersion = "v1.22"
47+ , apiVer = "v1.22"
4648 , baseUrl = "http://127.0.0.1:2375/"
4749 }
4850
4951data DockerVersion = DockerVersion {
5052 version :: Text
53+ , apiVersion :: ApiVersion
5154 , gitCommit :: Text
5255 , goVersion :: Text
56+ , os :: Text
5357 , arch :: Text
5458 , kernelVersion :: Text
59+ , buildTime :: Text
5560 } deriving (Show, Eq, Generic)
5661
5762
@@ -63,21 +68,37 @@ instance FromJSON DockerVersion where
6368 parseJSON = genericParseJSON defaultOptions {
6469 fieldLabelModifier = (\(x:xs) -> toUpper x : xs)}
6570
66−
6771data Container = Container
6872
69−data Image = Image
73+type Digest = Text
74+type Tag = Text
75+
76+data Image = DockerImage {
77+ imageId :: ImageID
78+ , imageCreated :: Integer
79+ , imageParentId :: Maybe ImageID
80+ , imageRepoTags :: [Tag]
81+ , imageRepoDigests :: [Digest]
82+ , imageSize :: Integer
83+ , imageVirtualSize :: Integer
84+ } deriving (Show, Eq, Generic)
85+
86+dropImagePrefix = drop 5
87+
88+instance FromJSON Image where
89+ parseJSON = genericParseJSON defaultOptions {
90+ fieldLabelModifier = dropImagePrefix}
7091
7192data CreateOpts = CreateOpts
7293data StartOpts = StartOpts
7394
7495data DeleteOpts = DeleteOpts {
75− v :: Bool
76− , force :: Bool
96+ deleteVolumes :: Bool
97+ , force :: Bool
7798 } deriving (Eq, Show)
7899
79100type Timestamp = Integer
80−data Tail = Integer | All deriving (Eq, Show)
101+data TailLogOpt = Tail Integer | All deriving (Eq, Show)
81102
82103data LogOpts = LogOpts {
83104 follow :: Bool
@@ -85,5 +106,6 @@ data LogOpts = LogOpts {
85106 , stderr :: Bool
86107 , since :: Timestamp
87108 , timestamps :: Bool
88− , tail :: Tail
109+ , tail :: TailLogOpt
89110 } deriving (Eq, Show)
111+