{-# LANGUAGE DuplicateRecordFields #-}

module Language.Docker.Parser.Run
  ( parseRun,
    runFlags,
  )
where

import Data.Functor (($>))
import qualified Data.Set as Set
import Language.Docker.Parser.Arguments (arguments)
import Language.Docker.Parser.Prelude
import Language.Docker.Syntax

data RunFlag
  = RunFlagMount RunMount
  | RunFlagSecurity RunSecurity
  | RunFlagNetwork RunNetwork
  deriving (Int -> RunFlag -> ShowS
[RunFlag] -> ShowS
RunFlag -> String
(Int -> RunFlag -> ShowS)
-> (RunFlag -> String) -> ([RunFlag] -> ShowS) -> Show RunFlag
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [RunFlag] -> ShowS
$cshowList :: [RunFlag] -> ShowS
show :: RunFlag -> String
$cshow :: RunFlag -> String
showsPrec :: Int -> RunFlag -> ShowS
$cshowsPrec :: Int -> RunFlag -> ShowS
Show)

data RunMountArg
  = MountArgFromImage Text
  | MountArgGid Integer
  | MountArgId Text
  | MountArgMode Text
  | MountArgReadOnly Bool
  | MountArgRequired Bool
  | MountArgSharing CacheSharing
  | MountArgSource SourcePath
  | MountArgTarget TargetPath
  | MountArgType Text
  | MountArgUid Integer
  deriving (Int -> RunMountArg -> ShowS
[RunMountArg] -> ShowS
RunMountArg -> String
(Int -> RunMountArg -> ShowS)
-> (RunMountArg -> String)
-> ([RunMountArg] -> ShowS)
-> Show RunMountArg
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [RunMountArg] -> ShowS
$cshowList :: [RunMountArg] -> ShowS
show :: RunMountArg -> String
$cshow :: RunMountArg -> String
showsPrec :: Int -> RunMountArg -> ShowS
$cshowsPrec :: Int -> RunMountArg -> ShowS
Show)

data MountType
  = Bind
  | Cache
  | Tmpfs
  | Secret
  | Ssh

parseRun :: (?esc :: Char) => Parser (Instruction Text)
parseRun :: Parser (Instruction Text)
parseRun = do
  (?esc::Char) => Text -> Parser ()
Text -> Parser ()
reserved Text
"RUN"
  RunArgs Text -> Instruction Text
forall args. RunArgs args -> Instruction args
Run (RunArgs Text -> Instruction Text)
-> ParsecT DockerfileError Text Identity (RunArgs Text)
-> Parser (Instruction Text)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT DockerfileError Text Identity (RunArgs Text)
(?esc::Char) =>
ParsecT DockerfileError Text Identity (RunArgs Text)
runArguments

runArguments :: (?esc :: Char) => Parser (RunArgs Text)
runArguments :: ParsecT DockerfileError Text Identity (RunArgs Text)
runArguments = do
  RunFlags
presentFlags <- [ParsecT DockerfileError Text Identity RunFlags]
-> ParsecT DockerfileError Text Identity RunFlags
forall (f :: * -> *) (m :: * -> *) a.
(Foldable f, Alternative m) =>
f (m a) -> m a
choice [ParsecT DockerfileError Text Identity RunFlags
(?esc::Char) => ParsecT DockerfileError Text Identity RunFlags
runFlags ParsecT DockerfileError Text Identity RunFlags
-> Parser () -> ParsecT DockerfileError Text Identity RunFlags
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
(?esc::Char) => Parser ()
requiredWhitespace, RunFlags -> ParsecT DockerfileError Text Identity RunFlags
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Maybe RunMount -> Maybe RunSecurity -> Maybe RunNetwork -> RunFlags
RunFlags Maybe RunMount
forall a. Maybe a
Nothing Maybe RunSecurity
forall a. Maybe a
Nothing Maybe RunNetwork
forall a. Maybe a
Nothing)]
  Arguments Text
args <- Parser (Arguments Text)
(?esc::Char) => Parser (Arguments Text)
arguments
  RunArgs Text
-> ParsecT DockerfileError Text Identity (RunArgs Text)
forall (m :: * -> *) a. Monad m => a -> m a
return (RunArgs Text
 -> ParsecT DockerfileError Text Identity (RunArgs Text))
-> RunArgs Text
-> ParsecT DockerfileError Text Identity (RunArgs Text)
forall a b. (a -> b) -> a -> b
$ Arguments Text -> RunFlags -> RunArgs Text
forall args. Arguments args -> RunFlags -> RunArgs args
RunArgs Arguments Text
args RunFlags
presentFlags

runFlags :: (?esc :: Char) => Parser RunFlags
runFlags :: ParsecT DockerfileError Text Identity RunFlags
runFlags = do
  [RunFlag]
flags <- Parser RunFlag
(?esc::Char) => Parser RunFlag
runFlag Parser RunFlag
-> ParsecT DockerfileError Text Identity Text
-> ParsecT DockerfileError Text Identity [RunFlag]
forall (m :: * -> *) a sep. MonadPlus m => m a -> m sep -> m [a]
`sepBy` ParsecT DockerfileError Text Identity Text
flagSeparator
  RunFlags -> ParsecT DockerfileError Text Identity RunFlags
forall (m :: * -> *) a. Monad m => a -> m a
return (RunFlags -> ParsecT DockerfileError Text Identity RunFlags)
-> RunFlags -> ParsecT DockerfileError Text Identity RunFlags
forall a b. (a -> b) -> a -> b
$ (RunFlag -> RunFlags -> RunFlags)
-> RunFlags -> [RunFlag] -> RunFlags
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr RunFlag -> RunFlags -> RunFlags
toRunFlags RunFlags
emptyFlags [RunFlag]
flags
  where
    flagSeparator :: ParsecT DockerfileError Text Identity Text
flagSeparator = ParsecT DockerfileError Text Identity Text
-> ParsecT DockerfileError Text Identity Text
forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m a
try (Parser ()
(?esc::Char) => Parser ()
requiredWhitespace Parser ()
-> ParsecT DockerfileError Text Identity Text
-> ParsecT DockerfileError Text Identity Text
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ParsecT DockerfileError Text Identity Text
-> ParsecT DockerfileError Text Identity Text
forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m a
lookAhead (Tokens Text -> ParsecT DockerfileError Text Identity (Tokens Text)
forall e s (m :: * -> *).
MonadParsec e s m =>
Tokens s -> m (Tokens s)
string Tokens Text
"--")) ParsecT DockerfileError Text Identity Text
-> ParsecT DockerfileError Text Identity Text
-> ParsecT DockerfileError Text Identity Text
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> String -> ParsecT DockerfileError Text Identity Text
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"expected flag"
    emptyFlags :: RunFlags
emptyFlags = Maybe RunMount -> Maybe RunSecurity -> Maybe RunNetwork -> RunFlags
RunFlags Maybe RunMount
forall a. Maybe a
Nothing Maybe RunSecurity
forall a. Maybe a
Nothing Maybe RunNetwork
forall a. Maybe a
Nothing
    toRunFlags :: RunFlag -> RunFlags -> RunFlags
toRunFlags (RunFlagMount RunMount
m) RunFlags
rf = RunFlags
rf {$sel:mount:RunFlags :: Maybe RunMount
mount = RunMount -> Maybe RunMount
forall a. a -> Maybe a
Just RunMount
m}
    toRunFlags (RunFlagNetwork RunNetwork
n) RunFlags
rf = RunFlags
rf {$sel:network:RunFlags :: Maybe RunNetwork
network = RunNetwork -> Maybe RunNetwork
forall a. a -> Maybe a
Just RunNetwork
n}
    toRunFlags (RunFlagSecurity RunSecurity
s) RunFlags
rf = RunFlags
rf {$sel:security:RunFlags :: Maybe RunSecurity
security = RunSecurity -> Maybe RunSecurity
forall a. a -> Maybe a
Just RunSecurity
s}

runFlag :: (?esc :: Char) => Parser RunFlag
runFlag :: Parser RunFlag
runFlag =
  [Parser RunFlag] -> Parser RunFlag
forall (f :: * -> *) (m :: * -> *) a.
(Foldable f, Alternative m) =>
f (m a) -> m a
choice
    [ RunMount -> RunFlag
RunFlagMount (RunMount -> RunFlag)
-> ParsecT DockerfileError Text Identity RunMount -> Parser RunFlag
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT DockerfileError Text Identity RunMount
(?esc::Char) => ParsecT DockerfileError Text Identity RunMount
runFlagMount,
      RunSecurity -> RunFlag
RunFlagSecurity (RunSecurity -> RunFlag)
-> ParsecT DockerfileError Text Identity RunSecurity
-> Parser RunFlag
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT DockerfileError Text Identity RunSecurity
runFlagSecurity,
      RunNetwork -> RunFlag
RunFlagNetwork (RunNetwork -> RunFlag)
-> ParsecT DockerfileError Text Identity RunNetwork
-> Parser RunFlag
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT DockerfileError Text Identity RunNetwork
runFlagNetwork
    ]

runFlagSecurity :: Parser RunSecurity
runFlagSecurity :: ParsecT DockerfileError Text Identity RunSecurity
runFlagSecurity = do
  ParsecT DockerfileError Text Identity Text -> Parser ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (ParsecT DockerfileError Text Identity Text -> Parser ())
-> ParsecT DockerfileError Text Identity Text -> Parser ()
forall a b. (a -> b) -> a -> b
$ Tokens Text -> ParsecT DockerfileError Text Identity (Tokens Text)
forall e s (m :: * -> *).
MonadParsec e s m =>
Tokens s -> m (Tokens s)
string Tokens Text
"--security="
  [ParsecT DockerfileError Text Identity RunSecurity]
-> ParsecT DockerfileError Text Identity RunSecurity
forall (f :: * -> *) (m :: * -> *) a.
(Foldable f, Alternative m) =>
f (m a) -> m a
choice [RunSecurity
Insecure RunSecurity
-> ParsecT DockerfileError Text Identity Text
-> ParsecT DockerfileError Text Identity RunSecurity
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Tokens Text -> ParsecT DockerfileError Text Identity (Tokens Text)
forall e s (m :: * -> *).
MonadParsec e s m =>
Tokens s -> m (Tokens s)
string Tokens Text
"insecure", RunSecurity
Sandbox RunSecurity
-> ParsecT DockerfileError Text Identity Text
-> ParsecT DockerfileError Text Identity RunSecurity
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Tokens Text -> ParsecT DockerfileError Text Identity (Tokens Text)
forall e s (m :: * -> *).
MonadParsec e s m =>
Tokens s -> m (Tokens s)
string Tokens Text
"sandbox"]

runFlagNetwork :: Parser RunNetwork
runFlagNetwork :: ParsecT DockerfileError Text Identity RunNetwork
runFlagNetwork = do
  ParsecT DockerfileError Text Identity Text -> Parser ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (ParsecT DockerfileError Text Identity Text -> Parser ())
-> ParsecT DockerfileError Text Identity Text -> Parser ()
forall a b. (a -> b) -> a -> b
$ Tokens Text -> ParsecT DockerfileError Text Identity (Tokens Text)
forall e s (m :: * -> *).
MonadParsec e s m =>
Tokens s -> m (Tokens s)
string Tokens Text
"--network="
  [ParsecT DockerfileError Text Identity RunNetwork]
-> ParsecT DockerfileError Text Identity RunNetwork
forall (f :: * -> *) (m :: * -> *) a.
(Foldable f, Alternative m) =>
f (m a) -> m a
choice [RunNetwork
NetworkNone RunNetwork
-> ParsecT DockerfileError Text Identity Text
-> ParsecT DockerfileError Text Identity RunNetwork
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Tokens Text -> ParsecT DockerfileError Text Identity (Tokens Text)
forall e s (m :: * -> *).
MonadParsec e s m =>
Tokens s -> m (Tokens s)
string Tokens Text
"none", RunNetwork
NetworkHost RunNetwork
-> ParsecT DockerfileError Text Identity Text
-> ParsecT DockerfileError Text Identity RunNetwork
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Tokens Text -> ParsecT DockerfileError Text Identity (Tokens Text)
forall e s (m :: * -> *).
MonadParsec e s m =>
Tokens s -> m (Tokens s)
string Tokens Text
"host", RunNetwork
NetworkDefault RunNetwork
-> ParsecT DockerfileError Text Identity Text
-> ParsecT DockerfileError Text Identity RunNetwork
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Tokens Text -> ParsecT DockerfileError Text Identity (Tokens Text)
forall e s (m :: * -> *).
MonadParsec e s m =>
Tokens s -> m (Tokens s)
string Tokens Text
"default"]

runFlagMount :: (?esc :: Char) => Parser RunMount
runFlagMount :: ParsecT DockerfileError Text Identity RunMount
runFlagMount = do
  ParsecT DockerfileError Text Identity Text -> Parser ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (ParsecT DockerfileError Text Identity Text -> Parser ())
-> ParsecT DockerfileError Text Identity Text -> Parser ()
forall a b. (a -> b) -> a -> b
$ Tokens Text -> ParsecT DockerfileError Text Identity (Tokens Text)
forall e s (m :: * -> *).
MonadParsec e s m =>
Tokens s -> m (Tokens s)
string Tokens Text
"--mount="
  Maybe MountType
maybeType <-
    [ParsecT DockerfileError Text Identity (Maybe MountType)]
-> ParsecT DockerfileError Text Identity (Maybe MountType)
forall (f :: * -> *) (m :: * -> *) a.
(Foldable f, Alternative m) =>
f (m a) -> m a
choice
      [ Tokens Text -> ParsecT DockerfileError Text Identity (Tokens Text)
forall e s (m :: * -> *).
MonadParsec e s m =>
Tokens s -> m (Tokens s)
string Tokens Text
"type="
          ParsecT DockerfileError Text Identity Text
-> ParsecT DockerfileError Text Identity (Maybe MountType)
-> ParsecT DockerfileError Text Identity (Maybe MountType)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> [ParsecT DockerfileError Text Identity (Maybe MountType)]
-> ParsecT DockerfileError Text Identity (Maybe MountType)
forall (f :: * -> *) (m :: * -> *) a.
(Foldable f, Alternative m) =>
f (m a) -> m a
choice
            [ MountType -> Maybe MountType
forall a. a -> Maybe a
Just MountType
Bind Maybe MountType
-> ParsecT DockerfileError Text Identity Text
-> ParsecT DockerfileError Text Identity (Maybe MountType)
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Tokens Text -> ParsecT DockerfileError Text Identity (Tokens Text)
forall e s (m :: * -> *).
MonadParsec e s m =>
Tokens s -> m (Tokens s)
string Tokens Text
"bind",
              MountType -> Maybe MountType
forall a. a -> Maybe a
Just MountType
Cache Maybe MountType
-> ParsecT DockerfileError Text Identity Text
-> ParsecT DockerfileError Text Identity (Maybe MountType)
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Tokens Text -> ParsecT DockerfileError Text Identity (Tokens Text)
forall e s (m :: * -> *).
MonadParsec e s m =>
Tokens s -> m (Tokens s)
string Tokens Text
"cache",
              MountType -> Maybe MountType
forall a. a -> Maybe a
Just MountType
Tmpfs Maybe MountType
-> ParsecT DockerfileError Text Identity Text
-> ParsecT DockerfileError Text Identity (Maybe MountType)
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Tokens Text -> ParsecT DockerfileError Text Identity (Tokens Text)
forall e s (m :: * -> *).
MonadParsec e s m =>
Tokens s -> m (Tokens s)
string Tokens Text
"tmpfs",
              MountType -> Maybe MountType
forall a. a -> Maybe a
Just MountType
Secret Maybe MountType
-> ParsecT DockerfileError Text Identity Text
-> ParsecT DockerfileError Text Identity (Maybe MountType)
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Tokens Text -> ParsecT DockerfileError Text Identity (Tokens Text)
forall e s (m :: * -> *).
MonadParsec e s m =>
Tokens s -> m (Tokens s)
string Tokens Text
"secret",
              MountType -> Maybe MountType
forall a. a -> Maybe a
Just MountType
Ssh Maybe MountType
-> ParsecT DockerfileError Text Identity Text
-> ParsecT DockerfileError Text Identity (Maybe MountType)
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Tokens Text -> ParsecT DockerfileError Text Identity (Tokens Text)
forall e s (m :: * -> *).
MonadParsec e s m =>
Tokens s -> m (Tokens s)
string Tokens Text
"ssh"
            ],
        Maybe MountType
-> ParsecT DockerfileError Text Identity (Maybe MountType)
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe MountType
forall a. Maybe a
Nothing
      ]
  (MountType
mountType, Parser [RunMountArg]
args) <- (MountType, Parser [RunMountArg])
-> ParsecT
     DockerfileError Text Identity (MountType, Parser [RunMountArg])
forall (m :: * -> *) a. Monad m => a -> m a
return ((MountType, Parser [RunMountArg])
 -> ParsecT
      DockerfileError Text Identity (MountType, Parser [RunMountArg]))
-> (MountType, Parser [RunMountArg])
-> ParsecT
     DockerfileError Text Identity (MountType, Parser [RunMountArg])
forall a b. (a -> b) -> a -> b
$
    case Maybe MountType
maybeType of
      Maybe MountType
Nothing -> (MountType
Bind, (?esc::Char) => MountType -> Parser [RunMountArg]
MountType -> Parser [RunMountArg]
argsParser MountType
Bind)
      Just MountType
Ssh -> (MountType
Ssh, [Parser [RunMountArg]] -> Parser [RunMountArg]
forall (f :: * -> *) (m :: * -> *) a.
(Foldable f, Alternative m) =>
f (m a) -> m a
choice [Tokens Text -> ParsecT DockerfileError Text Identity (Tokens Text)
forall e s (m :: * -> *).
MonadParsec e s m =>
Tokens s -> m (Tokens s)
string Tokens Text
"," ParsecT DockerfileError Text Identity Text
-> Parser [RunMountArg] -> Parser [RunMountArg]
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> (?esc::Char) => MountType -> Parser [RunMountArg]
MountType -> Parser [RunMountArg]
argsParser MountType
Ssh, [RunMountArg] -> Parser [RunMountArg]
forall (f :: * -> *) a. Applicative f => a -> f a
pure []])
      Just MountType
t -> (MountType
t, Tokens Text -> ParsecT DockerfileError Text Identity (Tokens Text)
forall e s (m :: * -> *).
MonadParsec e s m =>
Tokens s -> m (Tokens s)
string Tokens Text
"," ParsecT DockerfileError Text Identity Text
-> Parser [RunMountArg] -> Parser [RunMountArg]
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> (?esc::Char) => MountType -> Parser [RunMountArg]
MountType -> Parser [RunMountArg]
argsParser MountType
t)
  case MountType
mountType of
    MountType
Bind -> BindOpts -> RunMount
BindMount (BindOpts -> RunMount)
-> ParsecT DockerfileError Text Identity BindOpts
-> ParsecT DockerfileError Text Identity RunMount
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ([RunMountArg] -> ParsecT DockerfileError Text Identity BindOpts
bindMount ([RunMountArg] -> ParsecT DockerfileError Text Identity BindOpts)
-> Parser [RunMountArg]
-> ParsecT DockerfileError Text Identity BindOpts
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Parser [RunMountArg]
args)
    MountType
Cache -> CacheOpts -> RunMount
CacheMount (CacheOpts -> RunMount)
-> ParsecT DockerfileError Text Identity CacheOpts
-> ParsecT DockerfileError Text Identity RunMount
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ([RunMountArg] -> ParsecT DockerfileError Text Identity CacheOpts
cacheMount ([RunMountArg] -> ParsecT DockerfileError Text Identity CacheOpts)
-> Parser [RunMountArg]
-> ParsecT DockerfileError Text Identity CacheOpts
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Parser [RunMountArg]
args)
    MountType
Tmpfs -> TmpOpts -> RunMount
TmpfsMount (TmpOpts -> RunMount)
-> ParsecT DockerfileError Text Identity TmpOpts
-> ParsecT DockerfileError Text Identity RunMount
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ([RunMountArg] -> ParsecT DockerfileError Text Identity TmpOpts
tmpfsMount ([RunMountArg] -> ParsecT DockerfileError Text Identity TmpOpts)
-> Parser [RunMountArg]
-> ParsecT DockerfileError Text Identity TmpOpts
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Parser [RunMountArg]
args)
    MountType
Secret -> SecretOpts -> RunMount
SecretMount (SecretOpts -> RunMount)
-> ParsecT DockerfileError Text Identity SecretOpts
-> ParsecT DockerfileError Text Identity RunMount
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ([RunMountArg] -> ParsecT DockerfileError Text Identity SecretOpts
secretMount ([RunMountArg] -> ParsecT DockerfileError Text Identity SecretOpts)
-> Parser [RunMountArg]
-> ParsecT DockerfileError Text Identity SecretOpts
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Parser [RunMountArg]
args)
    MountType
Ssh -> SecretOpts -> RunMount
SshMount (SecretOpts -> RunMount)
-> ParsecT DockerfileError Text Identity SecretOpts
-> ParsecT DockerfileError Text Identity RunMount
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ([RunMountArg] -> ParsecT DockerfileError Text Identity SecretOpts
secretMount ([RunMountArg] -> ParsecT DockerfileError Text Identity SecretOpts)
-> Parser [RunMountArg]
-> ParsecT DockerfileError Text Identity SecretOpts
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Parser [RunMountArg]
args)

argsParser :: (?esc :: Char) => MountType -> Parser [RunMountArg]
argsParser :: MountType -> Parser [RunMountArg]
argsParser MountType
mountType = (?esc::Char) => MountType -> Parser RunMountArg
MountType -> Parser RunMountArg
mountChoices MountType
mountType Parser RunMountArg
-> ParsecT DockerfileError Text Identity Text
-> Parser [RunMountArg]
forall (m :: * -> *) a sep. MonadPlus m => m a -> m sep -> m [a]
`sepBy1` Tokens Text -> ParsecT DockerfileError Text Identity (Tokens Text)
forall e s (m :: * -> *).
MonadParsec e s m =>
Tokens s -> m (Tokens s)
string Tokens Text
","

bindMount :: [RunMountArg] -> Parser BindOpts
bindMount :: [RunMountArg] -> ParsecT DockerfileError Text Identity BindOpts
bindMount [RunMountArg]
args =
  case Text
-> Set Text
-> Set Text
-> [RunMountArg]
-> Either DockerfileError [RunMountArg]
forall (t :: * -> *).
Foldable t =>
Text
-> Set Text
-> Set Text
-> t RunMountArg
-> Either DockerfileError [RunMountArg]
validArgs Text
"bind" Set Text
allowed Set Text
required [RunMountArg]
args of
    Left DockerfileError
e -> DockerfileError -> ParsecT DockerfileError Text Identity BindOpts
forall a. DockerfileError -> Parser a
customError DockerfileError
e
    Right [RunMountArg]
as -> BindOpts -> ParsecT DockerfileError Text Identity BindOpts
forall (m :: * -> *) a. Monad m => a -> m a
return (BindOpts -> ParsecT DockerfileError Text Identity BindOpts)
-> BindOpts -> ParsecT DockerfileError Text Identity BindOpts
forall a b. (a -> b) -> a -> b
$ (RunMountArg -> BindOpts -> BindOpts)
-> BindOpts -> [RunMountArg] -> BindOpts
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr RunMountArg -> BindOpts -> BindOpts
bindOpts BindOpts
forall a. Default a => a
def [RunMountArg]
as
  where
    allowed :: Set Text
allowed = [Text] -> Set Text
forall a. Ord a => [a] -> Set a
Set.fromList [Text
"target", Text
"source", Text
"from", Text
"ro"]
    required :: Set Text
required = Text -> Set Text
forall a. a -> Set a
Set.singleton Text
"target"
    bindOpts :: RunMountArg -> BindOpts -> BindOpts
    bindOpts :: RunMountArg -> BindOpts -> BindOpts
bindOpts (MountArgTarget TargetPath
path) BindOpts
bo = BindOpts
bo {$sel:bTarget:BindOpts :: TargetPath
bTarget = TargetPath
path}
    bindOpts (MountArgSource SourcePath
path) BindOpts
bo = BindOpts
bo {$sel:bSource:BindOpts :: Maybe SourcePath
bSource = SourcePath -> Maybe SourcePath
forall a. a -> Maybe a
Just SourcePath
path}
    bindOpts (MountArgFromImage Text
img) BindOpts
bo = BindOpts
bo {$sel:bFromImage:BindOpts :: Maybe Text
bFromImage = Text -> Maybe Text
forall a. a -> Maybe a
Just Text
img}
    bindOpts (MountArgReadOnly Bool
ro) BindOpts
bo = BindOpts
bo {$sel:bReadOnly:BindOpts :: Maybe Bool
bReadOnly = Bool -> Maybe Bool
forall a. a -> Maybe a
Just Bool
ro}
    bindOpts RunMountArg
invalid BindOpts
_ = String -> BindOpts
forall a. HasCallStack => String -> a
error (String -> BindOpts) -> String -> BindOpts
forall a b. (a -> b) -> a -> b
$ String
"unhandled " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> RunMountArg -> String
forall a. Show a => a -> String
show RunMountArg
invalid String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
" please report this bug"

cacheMount :: [RunMountArg] -> Parser CacheOpts
cacheMount :: [RunMountArg] -> ParsecT DockerfileError Text Identity CacheOpts
cacheMount [RunMountArg]
args =
  case Text
-> Set Text
-> Set Text
-> [RunMountArg]
-> Either DockerfileError [RunMountArg]
forall (t :: * -> *).
Foldable t =>
Text
-> Set Text
-> Set Text
-> t RunMountArg
-> Either DockerfileError [RunMountArg]
validArgs Text
"cache" Set Text
allowed Set Text
required [RunMountArg]
args of
    Left DockerfileError
e -> DockerfileError -> ParsecT DockerfileError Text Identity CacheOpts
forall a. DockerfileError -> Parser a
customError DockerfileError
e
    Right [RunMountArg]
as -> CacheOpts -> ParsecT DockerfileError Text Identity CacheOpts
forall (m :: * -> *) a. Monad m => a -> m a
return (CacheOpts -> ParsecT DockerfileError Text Identity CacheOpts)
-> CacheOpts -> ParsecT DockerfileError Text Identity CacheOpts
forall a b. (a -> b) -> a -> b
$ (RunMountArg -> CacheOpts -> CacheOpts)
-> CacheOpts -> [RunMountArg] -> CacheOpts
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr RunMountArg -> CacheOpts -> CacheOpts
cacheOpts CacheOpts
forall a. Default a => a
def [RunMountArg]
as
  where
    allowed :: Set Text
allowed = [Text] -> Set Text
forall a. Ord a => [a] -> Set a
Set.fromList [Text
"target", Text
"sharing", Text
"id", Text
"ro", Text
"from", Text
"source", Text
"mode", Text
"uid", Text
"gid"]
    required :: Set Text
required = Text -> Set Text
forall a. a -> Set a
Set.singleton Text
"target"
    cacheOpts :: RunMountArg -> CacheOpts -> CacheOpts
    cacheOpts :: RunMountArg -> CacheOpts -> CacheOpts
cacheOpts (MountArgTarget TargetPath
path) CacheOpts
co = CacheOpts
co {$sel:cTarget:CacheOpts :: TargetPath
cTarget = TargetPath
path}
    cacheOpts (MountArgSharing CacheSharing
sh) CacheOpts
co = CacheOpts
co {$sel:cSharing:CacheOpts :: Maybe CacheSharing
cSharing = CacheSharing -> Maybe CacheSharing
forall a. a -> Maybe a
Just CacheSharing
sh}
    cacheOpts (MountArgId Text
i) CacheOpts
co = CacheOpts
co {$sel:cCacheId:CacheOpts :: Maybe Text
cCacheId = Text -> Maybe Text
forall a. a -> Maybe a
Just Text
i}
    cacheOpts (MountArgReadOnly Bool
ro) CacheOpts
co = CacheOpts
co {$sel:cReadOnly:CacheOpts :: Maybe Bool
cReadOnly = Bool -> Maybe Bool
forall a. a -> Maybe a
Just Bool
ro}
    cacheOpts (MountArgFromImage Text
img) CacheOpts
co = CacheOpts
co {$sel:cFromImage:CacheOpts :: Maybe Text
cFromImage = Text -> Maybe Text
forall a. a -> Maybe a
Just Text
img}
    cacheOpts (MountArgSource SourcePath
path) CacheOpts
co = CacheOpts
co {$sel:cSource:CacheOpts :: Maybe SourcePath
cSource = SourcePath -> Maybe SourcePath
forall a. a -> Maybe a
Just SourcePath
path}
    cacheOpts (MountArgMode Text
m) CacheOpts
co = CacheOpts
co {$sel:cMode:CacheOpts :: Maybe Text
cMode = Text -> Maybe Text
forall a. a -> Maybe a
Just Text
m}
    cacheOpts (MountArgUid Integer
u) CacheOpts
co = CacheOpts
co {$sel:cUid:CacheOpts :: Maybe Integer
cUid = Integer -> Maybe Integer
forall a. a -> Maybe a
Just Integer
u}
    cacheOpts (MountArgGid Integer
g) CacheOpts
co = CacheOpts
co {$sel:cGid:CacheOpts :: Maybe Integer
cGid = Integer -> Maybe Integer
forall a. a -> Maybe a
Just Integer
g}
    cacheOpts RunMountArg
invalid CacheOpts
_ = String -> CacheOpts
forall a. HasCallStack => String -> a
error (String -> CacheOpts) -> String -> CacheOpts
forall a b. (a -> b) -> a -> b
$ String
"unhandled " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> RunMountArg -> String
forall a. Show a => a -> String
show RunMountArg
invalid String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
" please report this bug"

tmpfsMount :: [RunMountArg] -> Parser TmpOpts
tmpfsMount :: [RunMountArg] -> ParsecT DockerfileError Text Identity TmpOpts
tmpfsMount [RunMountArg]
args =
  case Text
-> Set Text
-> Set Text
-> [RunMountArg]
-> Either DockerfileError [RunMountArg]
forall (t :: * -> *).
Foldable t =>
Text
-> Set Text
-> Set Text
-> t RunMountArg
-> Either DockerfileError [RunMountArg]
validArgs Text
"tmpfs" Set Text
required Set Text
required [RunMountArg]
args of
    Left DockerfileError
e -> DockerfileError -> ParsecT DockerfileError Text Identity TmpOpts
forall a. DockerfileError -> Parser a
customError DockerfileError
e
    Right [RunMountArg]
as -> TmpOpts -> ParsecT DockerfileError Text Identity TmpOpts
forall (m :: * -> *) a. Monad m => a -> m a
return (TmpOpts -> ParsecT DockerfileError Text Identity TmpOpts)
-> TmpOpts -> ParsecT DockerfileError Text Identity TmpOpts
forall a b. (a -> b) -> a -> b
$ (RunMountArg -> TmpOpts -> TmpOpts)
-> TmpOpts -> [RunMountArg] -> TmpOpts
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr RunMountArg -> TmpOpts -> TmpOpts
tmpOpts TmpOpts
forall a. Default a => a
def [RunMountArg]
as
  where
    required :: Set Text
required = Text -> Set Text
forall a. a -> Set a
Set.singleton Text
"target"
    tmpOpts :: RunMountArg -> TmpOpts -> TmpOpts
    tmpOpts :: RunMountArg -> TmpOpts -> TmpOpts
tmpOpts (MountArgTarget TargetPath
path) TmpOpts
t = TmpOpts
t {$sel:tTarget:TmpOpts :: TargetPath
tTarget = TargetPath
path}
    tmpOpts RunMountArg
invalid TmpOpts
_ = String -> TmpOpts
forall a. HasCallStack => String -> a
error (String -> TmpOpts) -> String -> TmpOpts
forall a b. (a -> b) -> a -> b
$ String
"unhandled " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> RunMountArg -> String
forall a. Show a => a -> String
show RunMountArg
invalid String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
" please report this bug"

secretMount :: [RunMountArg] -> Parser SecretOpts
secretMount :: [RunMountArg] -> ParsecT DockerfileError Text Identity SecretOpts
secretMount [RunMountArg]
args =
  case Text
-> Set Text
-> Set Text
-> [RunMountArg]
-> Either DockerfileError [RunMountArg]
forall (t :: * -> *).
Foldable t =>
Text
-> Set Text
-> Set Text
-> t RunMountArg
-> Either DockerfileError [RunMountArg]
validArgs Text
"secret" Set Text
allowed Set Text
forall a. Set a
required [RunMountArg]
args of
    Left DockerfileError
e -> DockerfileError -> ParsecT DockerfileError Text Identity SecretOpts
forall a. DockerfileError -> Parser a
customError DockerfileError
e
    Right [RunMountArg]
as -> SecretOpts -> ParsecT DockerfileError Text Identity SecretOpts
forall (m :: * -> *) a. Monad m => a -> m a
return (SecretOpts -> ParsecT DockerfileError Text Identity SecretOpts)
-> SecretOpts -> ParsecT DockerfileError Text Identity SecretOpts
forall a b. (a -> b) -> a -> b
$ (RunMountArg -> SecretOpts -> SecretOpts)
-> SecretOpts -> [RunMountArg] -> SecretOpts
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr RunMountArg -> SecretOpts -> SecretOpts
secretOpts SecretOpts
forall a. Default a => a
def [RunMountArg]
as
  where
    allowed :: Set Text
allowed = [Text] -> Set Text
forall a. Ord a => [a] -> Set a
Set.fromList [Text
"target", Text
"id", Text
"required", Text
"source", Text
"mode", Text
"uid", Text
"gid"]
    required :: Set a
required = Set a
forall a. Set a
Set.empty
    secretOpts :: RunMountArg -> SecretOpts -> SecretOpts
    secretOpts :: RunMountArg -> SecretOpts -> SecretOpts
secretOpts (MountArgTarget TargetPath
path) SecretOpts
co = SecretOpts
co {$sel:sTarget:SecretOpts :: Maybe TargetPath
sTarget = TargetPath -> Maybe TargetPath
forall a. a -> Maybe a
Just TargetPath
path}
    secretOpts (MountArgId Text
i) SecretOpts
co = SecretOpts
co {$sel:sCacheId:SecretOpts :: Maybe Text
sCacheId = Text -> Maybe Text
forall a. a -> Maybe a
Just Text
i}
    secretOpts (MountArgRequired Bool
r) SecretOpts
co = SecretOpts
co {$sel:sIsRequired:SecretOpts :: Maybe Bool
sIsRequired = Bool -> Maybe Bool
forall a. a -> Maybe a
Just Bool
r}
    secretOpts (MountArgSource SourcePath
path) SecretOpts
co = SecretOpts
co {$sel:sSource:SecretOpts :: Maybe SourcePath
sSource = SourcePath -> Maybe SourcePath
forall a. a -> Maybe a
Just SourcePath
path}
    secretOpts (MountArgMode Text
m) SecretOpts
co = SecretOpts
co {$sel:sMode:SecretOpts :: Maybe Text
sMode = Text -> Maybe Text
forall a. a -> Maybe a
Just Text
m}
    secretOpts (MountArgUid Integer
u) SecretOpts
co = SecretOpts
co {$sel:sUid:SecretOpts :: Maybe Integer
sUid = Integer -> Maybe Integer
forall a. a -> Maybe a
Just Integer
u}
    secretOpts (MountArgGid Integer
g) SecretOpts
co = SecretOpts
co {$sel:sGid:SecretOpts :: Maybe Integer
sGid = Integer -> Maybe Integer
forall a. a -> Maybe a
Just Integer
g}
    secretOpts RunMountArg
invalid SecretOpts
_ = String -> SecretOpts
forall a. HasCallStack => String -> a
error (String -> SecretOpts) -> String -> SecretOpts
forall a b. (a -> b) -> a -> b
$ String
"unhandled " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> RunMountArg -> String
forall a. Show a => a -> String
show RunMountArg
invalid String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
" please report this bug"

validArgs ::
  Foldable t =>
  Text ->
  Set.Set Text ->
  Set.Set Text ->
  t RunMountArg ->
  Either DockerfileError [RunMountArg]
validArgs :: Text
-> Set Text
-> Set Text
-> t RunMountArg
-> Either DockerfileError [RunMountArg]
validArgs Text
typeName Set Text
allowed Set Text
required t RunMountArg
args =
  let (Either DockerfileError [RunMountArg]
result, Set Text
seen) = (RunMountArg
 -> (Either DockerfileError [RunMountArg], Set Text)
 -> (Either DockerfileError [RunMountArg], Set Text))
-> (Either DockerfileError [RunMountArg], Set Text)
-> t RunMountArg
-> (Either DockerfileError [RunMountArg], Set Text)
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr RunMountArg
-> (Either DockerfileError [RunMountArg], Set Text)
-> (Either DockerfileError [RunMountArg], Set Text)
checkValidArg ([RunMountArg] -> Either DockerfileError [RunMountArg]
forall a b. b -> Either a b
Right [], Set Text
forall a. Set a
Set.empty) t RunMountArg
args
   in case Set Text -> [Text]
forall a. Set a -> [a]
Set.toList (Set Text -> Set Text -> Set Text
forall a. Ord a => Set a -> Set a -> Set a
Set.difference Set Text
required Set Text
seen) of
        [] -> Either DockerfileError [RunMountArg]
result
        [Text]
missing -> DockerfileError -> Either DockerfileError [RunMountArg]
forall a b. a -> Either a b
Left (DockerfileError -> Either DockerfileError [RunMountArg])
-> DockerfileError -> Either DockerfileError [RunMountArg]
forall a b. (a -> b) -> a -> b
$ [Text] -> DockerfileError
MissingArgument [Text]
missing
  where
    checkValidArg :: RunMountArg
-> (Either DockerfileError [RunMountArg], Set Text)
-> (Either DockerfileError [RunMountArg], Set Text)
checkValidArg RunMountArg
_ x :: (Either DockerfileError [RunMountArg], Set Text)
x@(Left DockerfileError
_, Set Text
_) = (Either DockerfileError [RunMountArg], Set Text)
x
    checkValidArg RunMountArg
a (Right [RunMountArg]
as, Set Text
seen) =
      let name :: Text
name = RunMountArg -> Text
toArgName RunMountArg
a
       in case (Text -> Set Text -> Bool
forall a. Ord a => a -> Set a -> Bool
Set.member Text
name Set Text
allowed, Text -> Set Text -> Bool
forall a. Ord a => a -> Set a -> Bool
Set.member Text
name Set Text
seen) of
            (Bool
False, Bool
_) -> (DockerfileError -> Either DockerfileError [RunMountArg]
forall a b. a -> Either a b
Left (Text -> Text -> DockerfileError
UnexpectedArgument Text
name Text
typeName), Set Text
seen)
            (Bool
_, Bool
True) -> (DockerfileError -> Either DockerfileError [RunMountArg]
forall a b. a -> Either a b
Left (Text -> DockerfileError
DuplicateArgument Text
name), Set Text
seen)
            (Bool
True, Bool
False) -> ([RunMountArg] -> Either DockerfileError [RunMountArg]
forall a b. b -> Either a b
Right (RunMountArg
a RunMountArg -> [RunMountArg] -> [RunMountArg]
forall a. a -> [a] -> [a]
: [RunMountArg]
as), Text -> Set Text -> Set Text
forall a. Ord a => a -> Set a -> Set a
Set.insert Text
name Set Text
seen)

mountChoices :: (?esc :: Char) => MountType -> Parser RunMountArg
mountChoices :: MountType -> Parser RunMountArg
mountChoices MountType
mountType =
  [Parser RunMountArg] -> Parser RunMountArg
forall (f :: * -> *) (m :: * -> *) a.
(Foldable f, Alternative m) =>
f (m a) -> m a
choice ([Parser RunMountArg] -> Parser RunMountArg)
-> [Parser RunMountArg] -> Parser RunMountArg
forall a b. (a -> b) -> a -> b
$
    case MountType
mountType of
      MountType
Bind ->
        [ Parser RunMountArg
(?esc::Char) => Parser RunMountArg
mountArgTarget,
          Parser RunMountArg
(?esc::Char) => Parser RunMountArg
mountArgSource,
          Parser RunMountArg
(?esc::Char) => Parser RunMountArg
mountArgFromImage,
          Parser RunMountArg
mountArgReadOnly,
          Parser RunMountArg
mountArgReadWrite
        ]
      MountType
Cache ->
        [ Parser RunMountArg
(?esc::Char) => Parser RunMountArg
mountArgTarget,
          Parser RunMountArg
(?esc::Char) => Parser RunMountArg
mountArgSource,
          Parser RunMountArg
(?esc::Char) => Parser RunMountArg
mountArgFromImage,
          Parser RunMountArg
mountArgReadOnly,
          Parser RunMountArg
mountArgReadWrite,
          Parser RunMountArg
(?esc::Char) => Parser RunMountArg
mountArgId,
          Parser RunMountArg
mountArgSharing,
          Parser RunMountArg
(?esc::Char) => Parser RunMountArg
mountArgMode,
          Parser RunMountArg
mountArgUid,
          Parser RunMountArg
mountArgGid
        ]
      MountType
Tmpfs -> [Parser RunMountArg
(?esc::Char) => Parser RunMountArg
mountArgTarget]
      MountType
_ -> -- Secret and Ssh
        [ Parser RunMountArg
(?esc::Char) => Parser RunMountArg
mountArgTarget,
          Parser RunMountArg
(?esc::Char) => Parser RunMountArg
mountArgId,
          Parser RunMountArg
mountArgRequired,
          Parser RunMountArg
(?esc::Char) => Parser RunMountArg
mountArgSource,
          Parser RunMountArg
(?esc::Char) => Parser RunMountArg
mountArgMode,
          Parser RunMountArg
mountArgUid,
          Parser RunMountArg
mountArgGid
        ]

stringArg :: (?esc :: Char) => Parser Text
stringArg :: ParsecT DockerfileError Text Identity Text
stringArg = [ParsecT DockerfileError Text Identity Text]
-> ParsecT DockerfileError Text Identity Text
forall (f :: * -> *) (m :: * -> *) a.
(Foldable f, Alternative m) =>
f (m a) -> m a
choice [ParsecT DockerfileError Text Identity Text
stringLiteral, (?esc::Char) =>
String
-> (Char -> Bool) -> ParsecT DockerfileError Text Identity Text
String
-> (Char -> Bool) -> ParsecT DockerfileError Text Identity Text
someUnless String
"a string" (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
',')]

key :: Text -> Parser a -> Parser a
key :: Text -> Parser a -> Parser a
key Text
name Parser a
p = Tokens Text -> ParsecT DockerfileError Text Identity (Tokens Text)
forall e s (m :: * -> *).
MonadParsec e s m =>
Tokens s -> m (Tokens s)
string (Text
name Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"=") ParsecT DockerfileError Text Identity Text -> Parser a -> Parser a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser a
p

cacheSharing :: Parser CacheSharing
cacheSharing :: Parser CacheSharing
cacheSharing =
  [Parser CacheSharing] -> Parser CacheSharing
forall (f :: * -> *) (m :: * -> *) a.
(Foldable f, Alternative m) =>
f (m a) -> m a
choice [CacheSharing
Private CacheSharing
-> ParsecT DockerfileError Text Identity Text
-> Parser CacheSharing
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Tokens Text -> ParsecT DockerfileError Text Identity (Tokens Text)
forall e s (m :: * -> *).
MonadParsec e s m =>
Tokens s -> m (Tokens s)
string Tokens Text
"private", CacheSharing
Shared CacheSharing
-> ParsecT DockerfileError Text Identity Text
-> Parser CacheSharing
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Tokens Text -> ParsecT DockerfileError Text Identity (Tokens Text)
forall e s (m :: * -> *).
MonadParsec e s m =>
Tokens s -> m (Tokens s)
string Tokens Text
"shared", CacheSharing
Locked CacheSharing
-> ParsecT DockerfileError Text Identity Text
-> Parser CacheSharing
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Tokens Text -> ParsecT DockerfileError Text Identity (Tokens Text)
forall e s (m :: * -> *).
MonadParsec e s m =>
Tokens s -> m (Tokens s)
string Tokens Text
"locked"]

mountArgFromImage :: (?esc :: Char) => Parser RunMountArg
mountArgFromImage :: Parser RunMountArg
mountArgFromImage = Text -> RunMountArg
MountArgFromImage (Text -> RunMountArg)
-> ParsecT DockerfileError Text Identity Text -> Parser RunMountArg
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Text
-> ParsecT DockerfileError Text Identity Text
-> ParsecT DockerfileError Text Identity Text
forall a. Text -> Parser a -> Parser a
key Text
"from" ParsecT DockerfileError Text Identity Text
(?esc::Char) => ParsecT DockerfileError Text Identity Text
stringArg

mountArgGid :: Parser RunMountArg
mountArgGid :: Parser RunMountArg
mountArgGid = Integer -> RunMountArg
MountArgGid (Integer -> RunMountArg)
-> ParsecT DockerfileError Text Identity Integer
-> Parser RunMountArg
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Text
-> ParsecT DockerfileError Text Identity Integer
-> ParsecT DockerfileError Text Identity Integer
forall a. Text -> Parser a -> Parser a
key Text
"gid" ParsecT DockerfileError Text Identity Integer
natural

mountArgId :: (?esc :: Char) => Parser RunMountArg
mountArgId :: Parser RunMountArg
mountArgId = Text -> RunMountArg
MountArgId (Text -> RunMountArg)
-> ParsecT DockerfileError Text Identity Text -> Parser RunMountArg
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Text
-> ParsecT DockerfileError Text Identity Text
-> ParsecT DockerfileError Text Identity Text
forall a. Text -> Parser a -> Parser a
key Text
"id" ParsecT DockerfileError Text Identity Text
(?esc::Char) => ParsecT DockerfileError Text Identity Text
stringArg

mountArgMode :: (?esc :: Char) => Parser RunMountArg
mountArgMode :: Parser RunMountArg
mountArgMode = Text -> RunMountArg
MountArgMode (Text -> RunMountArg)
-> ParsecT DockerfileError Text Identity Text -> Parser RunMountArg
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Text
-> ParsecT DockerfileError Text Identity Text
-> ParsecT DockerfileError Text Identity Text
forall a. Text -> Parser a -> Parser a
key Text
"mode" ParsecT DockerfileError Text Identity Text
(?esc::Char) => ParsecT DockerfileError Text Identity Text
stringArg

mountArgReadOnly :: Parser RunMountArg
mountArgReadOnly :: Parser RunMountArg
mountArgReadOnly = Bool -> RunMountArg
MountArgReadOnly (Bool -> RunMountArg)
-> ParsecT DockerfileError Text Identity Bool -> Parser RunMountArg
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ([ParsecT DockerfileError Text Identity Text]
-> ParsecT DockerfileError Text Identity Text
forall (f :: * -> *) (m :: * -> *) a.
(Foldable f, Alternative m) =>
f (m a) -> m a
choice [ParsecT DockerfileError Text Identity Text
"ro", ParsecT DockerfileError Text Identity Text
"readonly"] ParsecT DockerfileError Text Identity Text
-> Bool -> ParsecT DockerfileError Text Identity Bool
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Bool
True)

mountArgReadWrite :: Parser RunMountArg
mountArgReadWrite :: Parser RunMountArg
mountArgReadWrite = Bool -> RunMountArg
MountArgReadOnly (Bool -> RunMountArg)
-> ParsecT DockerfileError Text Identity Bool -> Parser RunMountArg
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ([ParsecT DockerfileError Text Identity Text]
-> ParsecT DockerfileError Text Identity Text
forall (f :: * -> *) (m :: * -> *) a.
(Foldable f, Alternative m) =>
f (m a) -> m a
choice [ParsecT DockerfileError Text Identity Text
"rw", ParsecT DockerfileError Text Identity Text
"readwrite"] ParsecT DockerfileError Text Identity Text
-> Bool -> ParsecT DockerfileError Text Identity Bool
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Bool
False)

mountArgRequired :: Parser RunMountArg
mountArgRequired :: Parser RunMountArg
mountArgRequired = Bool -> RunMountArg
MountArgRequired (Bool -> RunMountArg)
-> ParsecT DockerfileError Text Identity Bool -> Parser RunMountArg
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [ParsecT DockerfileError Text Identity Bool]
-> ParsecT DockerfileError Text Identity Bool
forall (f :: * -> *) (m :: * -> *) a.
(Foldable f, Alternative m) =>
f (m a) -> m a
choice
    [ [ParsecT DockerfileError Text Identity Text]
-> ParsecT DockerfileError Text Identity Text
forall (f :: * -> *) (m :: * -> *) a.
(Foldable f, Alternative m) =>
f (m a) -> m a
choice [ParsecT DockerfileError Text Identity Text
"required=true",
              ParsecT DockerfileError Text Identity Text
"required=True"
             ] ParsecT DockerfileError Text Identity Text
-> Bool -> ParsecT DockerfileError Text Identity Bool
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Bool
True,
      [ParsecT DockerfileError Text Identity Text]
-> ParsecT DockerfileError Text Identity Text
forall (f :: * -> *) (m :: * -> *) a.
(Foldable f, Alternative m) =>
f (m a) -> m a
choice [ParsecT DockerfileError Text Identity Text
"required=false",
              ParsecT DockerfileError Text Identity Text
"required=False"
             ] ParsecT DockerfileError Text Identity Text
-> Bool -> ParsecT DockerfileError Text Identity Bool
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Bool
False,
      Tokens Text -> ParsecT DockerfileError Text Identity (Tokens Text)
forall e s (m :: * -> *).
MonadParsec e s m =>
Tokens s -> m (Tokens s)
string Tokens Text
"required" ParsecT DockerfileError Text Identity Text
-> Bool -> ParsecT DockerfileError Text Identity Bool
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Bool
True  -- This must come last in the list!
    ]

mountArgSharing :: Parser RunMountArg
mountArgSharing :: Parser RunMountArg
mountArgSharing = CacheSharing -> RunMountArg
MountArgSharing (CacheSharing -> RunMountArg)
-> Parser CacheSharing -> Parser RunMountArg
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Text -> Parser CacheSharing -> Parser CacheSharing
forall a. Text -> Parser a -> Parser a
key Text
"sharing" Parser CacheSharing
cacheSharing

mountArgSource :: (?esc :: Char) => Parser RunMountArg
mountArgSource :: Parser RunMountArg
mountArgSource = do
  String
-> ParsecT DockerfileError Text Identity Text
-> ParsecT DockerfileError Text Identity Text
forall e s (m :: * -> *) a.
MonadParsec e s m =>
String -> m a -> m a
label String
"source=" (ParsecT DockerfileError Text Identity Text
 -> ParsecT DockerfileError Text Identity Text)
-> ParsecT DockerfileError Text Identity Text
-> ParsecT DockerfileError Text Identity Text
forall a b. (a -> b) -> a -> b
$ [ParsecT DockerfileError Text Identity Text]
-> ParsecT DockerfileError Text Identity Text
forall (f :: * -> *) (m :: * -> *) a.
(Foldable f, Alternative m) =>
f (m a) -> m a
choice [Tokens Text -> ParsecT DockerfileError Text Identity (Tokens Text)
forall e s (m :: * -> *).
MonadParsec e s m =>
Tokens s -> m (Tokens s)
string Tokens Text
"source=", Tokens Text -> ParsecT DockerfileError Text Identity (Tokens Text)
forall e s (m :: * -> *).
MonadParsec e s m =>
Tokens s -> m (Tokens s)
string Tokens Text
"src="]
  SourcePath -> RunMountArg
MountArgSource (SourcePath -> RunMountArg)
-> (Text -> SourcePath) -> Text -> RunMountArg
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> SourcePath
SourcePath (Text -> RunMountArg)
-> ParsecT DockerfileError Text Identity Text -> Parser RunMountArg
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT DockerfileError Text Identity Text
(?esc::Char) => ParsecT DockerfileError Text Identity Text
stringArg

mountArgTarget :: (?esc :: Char) => Parser RunMountArg
mountArgTarget :: Parser RunMountArg
mountArgTarget = do
  String
-> ParsecT DockerfileError Text Identity Text
-> ParsecT DockerfileError Text Identity Text
forall e s (m :: * -> *) a.
MonadParsec e s m =>
String -> m a -> m a
label String
"target=" (ParsecT DockerfileError Text Identity Text
 -> ParsecT DockerfileError Text Identity Text)
-> ParsecT DockerfileError Text Identity Text
-> ParsecT DockerfileError Text Identity Text
forall a b. (a -> b) -> a -> b
$ [ParsecT DockerfileError Text Identity Text]
-> ParsecT DockerfileError Text Identity Text
forall (f :: * -> *) (m :: * -> *) a.
(Foldable f, Alternative m) =>
f (m a) -> m a
choice [Tokens Text -> ParsecT DockerfileError Text Identity (Tokens Text)
forall e s (m :: * -> *).
MonadParsec e s m =>
Tokens s -> m (Tokens s)
string Tokens Text
"target=", Tokens Text -> ParsecT DockerfileError Text Identity (Tokens Text)
forall e s (m :: * -> *).
MonadParsec e s m =>
Tokens s -> m (Tokens s)
string Tokens Text
"dst=", Tokens Text -> ParsecT DockerfileError Text Identity (Tokens Text)
forall e s (m :: * -> *).
MonadParsec e s m =>
Tokens s -> m (Tokens s)
string Tokens Text
"destination="]
  TargetPath -> RunMountArg
MountArgTarget (TargetPath -> RunMountArg)
-> (Text -> TargetPath) -> Text -> RunMountArg
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> TargetPath
TargetPath (Text -> RunMountArg)
-> ParsecT DockerfileError Text Identity Text -> Parser RunMountArg
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT DockerfileError Text Identity Text
(?esc::Char) => ParsecT DockerfileError Text Identity Text
stringArg

mountArgUid :: Parser RunMountArg
mountArgUid :: Parser RunMountArg
mountArgUid = Integer -> RunMountArg
MountArgUid (Integer -> RunMountArg)
-> ParsecT DockerfileError Text Identity Integer
-> Parser RunMountArg
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Text
-> ParsecT DockerfileError Text Identity Integer
-> ParsecT DockerfileError Text Identity Integer
forall a. Text -> Parser a -> Parser a
key Text
"uid" ParsecT DockerfileError Text Identity Integer
natural

toArgName :: RunMountArg -> Text
toArgName :: RunMountArg -> Text
toArgName (MountArgFromImage Text
_) = Text
"from"
toArgName (MountArgGid Integer
_) = Text
"gid"
toArgName (MountArgId Text
_) = Text
"id"
toArgName (MountArgMode Text
_) = Text
"mode"
toArgName (MountArgReadOnly Bool
_) = Text
"ro"
toArgName (MountArgRequired Bool
_) = Text
"required"
toArgName (MountArgSharing CacheSharing
_) = Text
"sharing"
toArgName (MountArgSource SourcePath
_) = Text
"source"
toArgName (MountArgTarget TargetPath
_) = Text
"target"
toArgName (MountArgType Text
_) = Text
"type"
toArgName (MountArgUid Integer
_) = Text
"uid"