module Language.Docker.Parser.From
  ( parseFrom,
  )
where

import qualified Data.Text as T
import Language.Docker.Parser.Prelude
import Language.Docker.Syntax

parseRegistry :: (?esc :: Char) => Parser Registry
parseRegistry :: (?esc::Char) => Parser Registry
parseRegistry = do
  Text
domain <- (?esc::Char) => String -> (Char -> Bool) -> Parser Text
someUnless String
"a domain name" (forall a. Eq a => a -> a -> Bool
== Char
'.')
  forall (f :: * -> *) a. Functor f => f a -> f ()
void forall a b. (a -> b) -> a -> b
$ forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Char
'.'
  Text
tld <- (?esc::Char) => String -> (Char -> Bool) -> Parser Text
someUnless String
"a TLD" (forall a. Eq a => a -> a -> Bool
== Char
'/')
  forall (f :: * -> *) a. Functor f => f a -> f ()
void forall a b. (a -> b) -> a -> b
$ forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Char
'/'
  forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ Text -> Registry
Registry (Text
domain forall a. Semigroup a => a -> a -> a
<> Text
"." forall a. Semigroup a => a -> a -> a
<> Text
tld)

parsePlatform :: (?esc :: Char) => Parser Platform
parsePlatform :: (?esc::Char) => Parser Text
parsePlatform = do
  forall (f :: * -> *) a. Functor f => f a -> f ()
void forall a b. (a -> b) -> a -> b
$ forall e s (m :: * -> *).
MonadParsec e s m =>
Tokens s -> m (Tokens s)
string Tokens Text
"--platform="
  Text
p <- (?esc::Char) => String -> (Char -> Bool) -> Parser Text
someUnless String
"the platform for the FROM image" (forall a. Eq a => a -> a -> Bool
== Char
' ')
  (?esc::Char) => ParsecT DockerfileError Text Identity ()
requiredWhitespace
  forall (m :: * -> *) a. Monad m => a -> m a
return Text
p

parseBaseImage :: (?esc :: Char) => (Text -> Parser (Maybe Tag)) -> Parser BaseImage
parseBaseImage :: (?esc::Char) => (Text -> Parser (Maybe Tag)) -> Parser BaseImage
parseBaseImage Text -> Parser (Maybe Tag)
tagParser = do
  Maybe Text
maybePlatform <- (forall a. a -> Maybe a
Just forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m a
try (?esc::Char) => Parser Text
parsePlatform) forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall (m :: * -> *) a. Monad m => a -> m a
return forall a. Maybe a
Nothing
  forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m ()
notFollowedBy (forall e s (m :: * -> *).
MonadParsec e s m =>
Tokens s -> m (Tokens s)
string Tokens Text
"--")
  Maybe Registry
regName <- (forall a. a -> Maybe a
Just forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m a
try (?esc::Char) => Parser Registry
parseRegistry) forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall (m :: * -> *) a. Monad m => a -> m a
return forall a. Maybe a
Nothing
  Text
name <- (?esc::Char) => String -> (Char -> Bool) -> Parser Text
someUnless String
"the image name with a tag" (\Char
c -> Char
c forall a. Eq a => a -> a -> Bool
== Char
'@' Bool -> Bool -> Bool
|| Char
c forall a. Eq a => a -> a -> Bool
== Char
':')
  Maybe Tag
maybeTag <- Text -> Parser (Maybe Tag)
tagParser Text
name forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall (m :: * -> *) a. Monad m => a -> m a
return forall a. Maybe a
Nothing
  Maybe Digest
maybeDigest <- (forall a. a -> Maybe a
Just forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m a
try (?esc::Char) => Parser Digest
parseDigest) forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall (m :: * -> *) a. Monad m => a -> m a
return forall a. Maybe a
Nothing
  Maybe ImageAlias
maybeAlias <- (forall a. a -> Maybe a
Just forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m a
try ((?esc::Char) => ParsecT DockerfileError Text Identity ()
requiredWhitespace forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> (?esc::Char) => ParsecT DockerfileError Text Identity ImageAlias
imageAlias)) forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall (m :: * -> *) a. Monad m => a -> m a
return forall a. Maybe a
Nothing
  forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ Image
-> Maybe Tag
-> Maybe Digest
-> Maybe ImageAlias
-> Maybe Text
-> BaseImage
BaseImage (Maybe Registry -> Text -> Image
Image Maybe Registry
regName Text
name) Maybe Tag
maybeTag Maybe Digest
maybeDigest Maybe ImageAlias
maybeAlias Maybe Text
maybePlatform

taggedImage :: (?esc :: Char) => Parser BaseImage
taggedImage :: (?esc::Char) => Parser BaseImage
taggedImage = (?esc::Char) => (Text -> Parser (Maybe Tag)) -> Parser BaseImage
parseBaseImage forall {p}. (?esc::Char) => p -> Parser (Maybe Tag)
tagParser
  where
    tagParser :: p -> Parser (Maybe Tag)
tagParser p
_ = do
      forall (f :: * -> *) a. Functor f => f a -> f ()
void forall a b. (a -> b) -> a -> b
$ forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Char
':'
      Text
t <- (?esc::Char) => String -> (Char -> Bool) -> Parser Text
someUnless String
"the image tag" (\Char
c -> Char
c forall a. Eq a => a -> a -> Bool
== Char
'@' Bool -> Bool -> Bool
|| Char
c forall a. Eq a => a -> a -> Bool
== Char
':')
      forall (m :: * -> *) a. Monad m => a -> m a
return (forall a. a -> Maybe a
Just forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Tag
Tag forall a b. (a -> b) -> a -> b
$ Text
t)

parseDigest :: (?esc :: Char) => Parser Digest
parseDigest :: (?esc::Char) => Parser Digest
parseDigest = do
  forall (f :: * -> *) a. Functor f => f a -> f ()
void forall a b. (a -> b) -> a -> b
$ forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Char
'@'
  Text
d <- (?esc::Char) => String -> (Char -> Bool) -> Parser Text
someUnless String
"the image digest" (forall a. Eq a => a -> a -> Bool
== Char
'@')
  forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ Text -> Digest
Digest Text
d

untaggedImage :: (?esc :: Char) => Parser BaseImage
untaggedImage :: (?esc::Char) => Parser BaseImage
untaggedImage = (?esc::Char) => (Text -> Parser (Maybe Tag)) -> Parser BaseImage
parseBaseImage Text -> Parser (Maybe Tag)
notInvalidTag
  where
    notInvalidTag :: Text -> Parser (Maybe Tag)
    notInvalidTag :: Text -> Parser (Maybe Tag)
notInvalidTag Text
name = do
      forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m a
try (forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m ()
notFollowedBy forall a b. (a -> b) -> a -> b
$ forall e s (m :: * -> *).
MonadParsec e s m =>
Tokens s -> m (Tokens s)
string Tokens Text
":") forall e s (m :: * -> *) a.
MonadParsec e s m =>
m a -> String -> m a
<?> String
"no ':' or a valid image tag string (example: "
        forall a. [a] -> [a] -> [a]
++ Text -> String
T.unpack Text
name
        forall a. [a] -> [a] -> [a]
++ String
":valid-tag)"
      forall (m :: * -> *) a. Monad m => a -> m a
return forall a. Maybe a
Nothing

imageAlias :: (?esc :: Char) => Parser ImageAlias
imageAlias :: (?esc::Char) => ParsecT DockerfileError Text Identity ImageAlias
imageAlias = do
  forall (f :: * -> *) a. Functor f => f a -> f ()
void (forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m a
try ((?esc::Char) => Text -> ParsecT DockerfileError Text Identity ()
reserved Text
"AS") forall e s (m :: * -> *) a.
MonadParsec e s m =>
m a -> String -> m a
<?> String
"'AS' followed by the image alias")
  Text
aka <- (?esc::Char) => String -> (Char -> Bool) -> Parser Text
someUnless String
"the image alias" (forall a. Eq a => a -> a -> Bool
== Char
'\n')
  forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ Text -> ImageAlias
ImageAlias Text
aka

baseImage :: (?esc :: Char) => Parser BaseImage
baseImage :: (?esc::Char) => Parser BaseImage
baseImage = forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m a
try (?esc::Char) => Parser BaseImage
taggedImage forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (?esc::Char) => Parser BaseImage
untaggedImage

parseFrom :: (?esc :: Char) => Parser (Instruction Text)
parseFrom :: (?esc::Char) => Parser (Instruction Text)
parseFrom = do
  (?esc::Char) => Text -> ParsecT DockerfileError Text Identity ()
reserved Text
"FROM"
  forall args. BaseImage -> Instruction args
From forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (?esc::Char) => Parser BaseImage
baseImage