language-docker-9.0.0: src/Language/Docker/Parser/Instruction.hs
{-# LANGUAGE OverloadedStrings #-}
module Language.Docker.Parser.Instruction
( parseInstruction,
parseShell,
parseStopSignal,
parseArg,
parseUser,
parseWorkdir,
parseVolume,
parseEntryPoint,
parseMaintainer,
parseOnbuild,
parseComment,
)
where
import Language.Docker.Parser.Arguments (arguments)
import Language.Docker.Parser.Cmd (parseCmd)
import Language.Docker.Parser.Copy (parseAdd, parseCopy)
import Language.Docker.Parser.Expose (parseExpose)
import Language.Docker.Parser.From (parseFrom)
import Language.Docker.Parser.Healthcheck (parseHealthcheck)
import Language.Docker.Parser.Pairs (parseEnv, parseLabel)
import Language.Docker.Parser.Prelude
import Language.Docker.Parser.Run (parseRun)
import Language.Docker.Syntax
parseShell :: Parser (Instruction Text)
parseShell = do
reserved "SHELL"
Shell <$> arguments
parseStopSignal :: Parser (Instruction Text)
parseStopSignal = do
reserved "STOPSIGNAL"
args <- untilEol "the stop signal"
return $ Stopsignal args
parseArg :: Parser (Instruction Text)
parseArg = do
reserved "ARG"
(try nameWithDefault <?> "the arg name")
<|> Arg <$> untilEol "the argument name" <*> pure Nothing
where
nameWithDefault = do
name <- someUnless "the argument name" (== '=')
void $ char '='
df <- untilEol "the argument value"
return $ Arg name (Just df)
parseUser :: Parser (Instruction Text)
parseUser = do
reserved "USER"
username <- untilEol "the user"
return $ User username
parseWorkdir :: Parser (Instruction Text)
parseWorkdir = do
reserved "WORKDIR"
directory <- untilEol "the workdir path"
return $ Workdir directory
parseVolume :: Parser (Instruction Text)
parseVolume = do
reserved "VOLUME"
directory <- untilEol "the volume path"
return $ Volume directory
parseMaintainer :: Parser (Instruction Text)
parseMaintainer = do
reserved "MAINTAINER"
name <- untilEol "the maintainer name"
return $ Maintainer name
parseEntryPoint :: Parser (Instruction Text)
parseEntryPoint = do
reserved "ENTRYPOINT"
Entrypoint <$> arguments
parseOnbuild :: Parser (Instruction Text)
parseOnbuild = do
reserved "ONBUILD"
OnBuild <$> parseInstruction
parseComment :: Parser (Instruction Text)
parseComment = Comment <$> comment
parseInstruction :: Parser (Instruction Text)
parseInstruction =
choice
[ parseOnbuild,
parseFrom,
parseCopy,
parseRun,
parseWorkdir,
parseEntryPoint,
parseVolume,
parseExpose,
parseEnv,
parseArg,
parseUser,
parseLabel,
parseStopSignal,
parseCmd,
parseShell,
parseMaintainer,
parseAdd,
parseComment,
parseHealthcheck
]