module Language.Docker.Syntax where
import Data.ByteString.Char8 (ByteString)
import Data.List.NonEmpty (NonEmpty)
import Data.String (IsString)
import Data.Time.Clock (DiffTime)
import GHC.Exts (IsList(..))
type Image = String
type Tag = String
data Protocol
= TCP
| UDP
deriving (Show, Eq, Ord)
data Port
= Port Integer
Protocol
| PortStr String
| PortRange Integer
Integer
deriving (Show, Eq, Ord)
newtype Ports = Ports
{ unPorts :: [Port]
} deriving (Show, Eq, Ord)
instance IsList Ports where
type Item Ports = Port
fromList = Ports
toList (Ports ps) = ps
type Directory = String
newtype ImageAlias = ImageAlias
{ unImageAlias :: String
} deriving (Show, Eq, Ord, IsString)
data BaseImage
= UntaggedImage Image
(Maybe ImageAlias)
| TaggedImage Image
Tag
(Maybe ImageAlias)
| DigestedImage Image
ByteString
(Maybe ImageAlias)
deriving (Eq, Ord, Show)
type Dockerfile = [InstructionPos]
newtype SourcePath = SourcePath
{ unSourcePath :: String
} deriving (Show, Eq, Ord, IsString)
newtype TargetPath = TargetPath
{ unTargetPath :: String
} deriving (Show, Eq, Ord, IsString)
data Chown
= Chown String
| NoChown
deriving (Show, Eq, Ord)
data CopySource
= CopySource String
| NoSource
deriving (Show, Eq, Ord)
newtype Duration = Duration
{ durationTime :: DiffTime
} deriving (Show, Eq, Ord, Num)
newtype Retries = Retries
{ times :: Int
} deriving (Show, Eq, Ord, Num)
data CopyArgs = CopyArgs
{ sourcePaths :: NonEmpty SourcePath
, targetPath :: TargetPath
, chownFlag :: Chown
, sourceFlag :: CopySource
} deriving (Show, Eq, Ord)
data AddArgs = AddArgs
{ sourcePaths :: NonEmpty SourcePath
, targetPath :: TargetPath
, chownFlag :: Chown
} deriving (Show, Eq, Ord)
data Check
= Check CheckArgs
| NoCheck
deriving (Show, Eq, Ord)
data CheckArgs = CheckArgs
{ checkCommand :: Arguments
, interval :: Maybe Duration
, timeout :: Maybe Duration
, startPeriod :: Maybe Duration
, retries :: Maybe Retries
} deriving (Show, Eq, Ord)
type Arguments = [String]
type Pairs = [(String, String)]
data Instruction
= From BaseImage
| Add AddArgs
| User String
| Label Pairs
| Stopsignal String
| Copy CopyArgs
| Run Arguments
| Cmd Arguments
| Shell Arguments
| Workdir Directory
| Expose Ports
| Volume String
| Entrypoint Arguments
| Maintainer String
| Env Pairs
| Arg String
(Maybe String)
| Healthcheck Check
| Comment String
| OnBuild Instruction
deriving (Eq, Ord, Show)
type Filename = String
type Linenumber = Int
data InstructionPos = InstructionPos
{ instruction :: Instruction
, sourcename :: Filename
, lineNumber :: Linenumber
} deriving (Eq, Ord, Show)