{-# LANGUAGE DeriveFunctor #-}

module Language.Docker.EDSL.Types where

import Data.ByteString.Char8 (ByteString)
import Data.List.NonEmpty (NonEmpty)
import Data.String
import qualified Language.Docker.Syntax as Syntax

data EBaseImage
    = EUntaggedImage String
                     (Maybe Syntax.ImageAlias)
    | ETaggedImage String
                   String
                   (Maybe Syntax.ImageAlias)
    | EDigestedImage String
                     ByteString
                     (Maybe Syntax.ImageAlias)
    deriving (Show, Eq, Ord)

instance IsString EBaseImage where
    fromString = flip EUntaggedImage Nothing

data EInstruction next
    = From EBaseImage
           next
    | AddArgs (NonEmpty Syntax.SourcePath)
              Syntax.TargetPath
              Syntax.Chown
              next
    | User String
           next
    | Label Syntax.Pairs
            next
    | StopSignal String
                 next
    | CopyArgs (NonEmpty Syntax.SourcePath)
               Syntax.TargetPath
               Syntax.Chown
               Syntax.CopySource
               next
    | RunArgs Syntax.Arguments
              next
    | CmdArgs Syntax.Arguments
              next
    | Shell Syntax.Arguments
            next
    | Workdir Syntax.Directory
              next
    | Expose Syntax.Ports
             next
    | Volume String
             next
    | EntrypointArgs Syntax.Arguments
                     next
    | Maintainer String
                 next
    | Env Syntax.Pairs
          next
    | Arg String (Maybe String)
          next
    | Comment String
              next
    | Healthcheck Syntax.Check
                  next
    | OnBuildRaw Syntax.Instruction
                 next
    | Embed [Syntax.InstructionPos]
            next
    deriving (Functor)