module Language.Dockerfile.EDSL.Quasi
where
import Language.Haskell.TH
import Language.Haskell.TH.Quote
import Language.Haskell.TH.Syntax
import Language.Dockerfile.EDSL
import qualified Language.Dockerfile.Parser as Parser
import Language.Dockerfile.Syntax
import Language.Dockerfile.Syntax.Lift
edockerfile :: QuasiQuoter
edockerfile = dockerfile { quoteExp = edockerfileE
}
edockerfileE :: String -> ExpQ
edockerfileE e = case Parser.parseString e of
Left err -> fail (show err)
Right d ->
let d' = filterEOL d
in [| embed d' |]
dockerfile :: QuasiQuoter
dockerfile = QuasiQuoter { quoteExp = dockerfileE
, quoteDec = error "Can't use Dockerfile as a declaration"
, quotePat = error "Can't use Dockerfile as a pattern"
, quoteType = error "Can't use Dockerfile as a type"
}
dockerfileE :: String -> ExpQ
dockerfileE e = case Parser.parseString e of
Left err -> fail (show err)
Right d ->
let d' = filterEOL d
in lift d'
filterEOL = filter (\(InstructionPos i _ _) -> i /= EOL)