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