module Vulkan.Utils.ShaderQQ.Backend.Shaderc
( ShadercError
, ShadercWarning
, processShadercMessages
) where
import Control.Monad ( void )
import qualified Data.ByteString.Lazy.Char8 as BSL
import Data.Foldable ( asum )
import Text.ParserCombinators.ReadP
type ShadercError = String
type ShadercWarning = String
processShadercMessages :: BSL.ByteString -> ([ShadercWarning], [ShadercError])
processShadercMessages :: ByteString -> ([ShadercWarning], [ShadercWarning])
processShadercMessages = (ShadercWarning -> ([ShadercWarning], [ShadercWarning]))
-> [ShadercWarning] -> ([ShadercWarning], [ShadercWarning])
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap ShadercWarning -> ([ShadercWarning], [ShadercWarning])
parseMsg ([ShadercWarning] -> ([ShadercWarning], [ShadercWarning]))
-> (ByteString -> [ShadercWarning])
-> ByteString
-> ([ShadercWarning], [ShadercWarning])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ShadercWarning -> [ShadercWarning]
lines (ShadercWarning -> [ShadercWarning])
-> (ByteString -> ShadercWarning) -> ByteString -> [ShadercWarning]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> ShadercWarning
BSL.unpack
parseMsg :: String -> ([ShadercWarning], [ShadercError])
parseMsg :: ShadercWarning -> ([ShadercWarning], [ShadercWarning])
parseMsg = ReadP ([ShadercWarning], [ShadercWarning])
-> ShadercWarning -> ([ShadercWarning], [ShadercWarning])
forall p. Monoid p => ReadP p -> ShadercWarning -> p
runParser (ReadP ([ShadercWarning], [ShadercWarning])
-> ShadercWarning -> ([ShadercWarning], [ShadercWarning]))
-> ReadP ([ShadercWarning], [ShadercWarning])
-> ShadercWarning
-> ([ShadercWarning], [ShadercWarning])
forall a b. (a -> b) -> a -> b
$ (ReadP ([ShadercWarning], [ShadercWarning])
-> ReadP ([ShadercWarning], [ShadercWarning])
-> ReadP ([ShadercWarning], [ShadercWarning]))
-> [ReadP ([ShadercWarning], [ShadercWarning])]
-> ReadP ([ShadercWarning], [ShadercWarning])
forall (t :: * -> *) a. Foldable t => (a -> a -> a) -> t a -> a
foldl1
ReadP ([ShadercWarning], [ShadercWarning])
-> ReadP ([ShadercWarning], [ShadercWarning])
-> ReadP ([ShadercWarning], [ShadercWarning])
forall a. ReadP a -> ReadP a -> ReadP a
(<++)
[ do
ShadercWarning
f <- ReadP ShadercWarning
filename
Integer
line <- ReadP () -> ReadP () -> ReadP Integer -> ReadP Integer
forall open close a.
ReadP open -> ReadP close -> ReadP a -> ReadP a
between ReadP ()
colon ReadP ()
colon ReadP Integer
number
ReadP ()
skipSpaces
ShadercWarning -> ([ShadercWarning], [ShadercWarning])
t <- ReadP (ShadercWarning -> ([ShadercWarning], [ShadercWarning]))
forall a. ReadP (a -> ([a], [a]))
msgType
ShadercWarning
msg <- ReadP Char -> ReadP () -> ReadP ShadercWarning
forall a end. ReadP a -> ReadP end -> ReadP [a]
manyTill ReadP Char
get ReadP ()
eof
([ShadercWarning], [ShadercWarning])
-> ReadP ([ShadercWarning], [ShadercWarning])
forall (f :: * -> *) a. Applicative f => a -> f a
pure (([ShadercWarning], [ShadercWarning])
-> ReadP ([ShadercWarning], [ShadercWarning]))
-> ([ShadercWarning], [ShadercWarning])
-> ReadP ([ShadercWarning], [ShadercWarning])
forall a b. (a -> b) -> a -> b
$ (ShadercWarning -> ([ShadercWarning], [ShadercWarning]))
-> ShadercWarning
-> Integer
-> ShadercWarning
-> ([ShadercWarning], [ShadercWarning])
forall a t.
Show a =>
(ShadercWarning -> t) -> ShadercWarning -> a -> ShadercWarning -> t
formatMsg ShadercWarning -> ([ShadercWarning], [ShadercWarning])
t ShadercWarning
f Integer
line ShadercWarning
msg
, do
ShadercWarning
f <- ReadP ShadercWarning
filename
ReadP ()
colon ReadP () -> ReadP () -> ReadP ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ReadP ()
skipSpaces
ShadercWarning -> ([ShadercWarning], [ShadercWarning])
t <- ReadP (ShadercWarning -> ([ShadercWarning], [ShadercWarning]))
forall a. ReadP (a -> ([a], [a]))
msgType
ShadercWarning
_ <- ShadercWarning -> ReadP ShadercWarning
string ShadercWarning
f
Integer
line <- ReadP Char -> ReadP Char -> ReadP Integer -> ReadP Integer
forall open close a.
ReadP open -> ReadP close -> ReadP a -> ReadP a
between (Char -> ReadP Char
char Char
':') (Char -> ReadP Char
char Char
':') ReadP Integer
number
ReadP ()
skipSpaces
ShadercWarning
msg <- ReadP Char -> ReadP () -> ReadP ShadercWarning
forall a end. ReadP a -> ReadP end -> ReadP [a]
manyTill ReadP Char
get ReadP ()
eof
([ShadercWarning], [ShadercWarning])
-> ReadP ([ShadercWarning], [ShadercWarning])
forall (f :: * -> *) a. Applicative f => a -> f a
pure (([ShadercWarning], [ShadercWarning])
-> ReadP ([ShadercWarning], [ShadercWarning]))
-> ([ShadercWarning], [ShadercWarning])
-> ReadP ([ShadercWarning], [ShadercWarning])
forall a b. (a -> b) -> a -> b
$ (ShadercWarning -> ([ShadercWarning], [ShadercWarning]))
-> ShadercWarning
-> Integer
-> ShadercWarning
-> ([ShadercWarning], [ShadercWarning])
forall a t.
Show a =>
(ShadercWarning -> t) -> ShadercWarning -> a -> ShadercWarning -> t
formatMsg ShadercWarning -> ([ShadercWarning], [ShadercWarning])
t ShadercWarning
f Integer
line ShadercWarning
msg
, do
ShadercWarning
f <- ReadP ShadercWarning
filename
ReadP ()
colon ReadP () -> ReadP () -> ReadP ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ReadP ()
skipSpaces
ShadercWarning
_ <- ShadercWarning -> ReadP ShadercWarning
string ShadercWarning
f
Integer
line <- ReadP Char -> ReadP Char -> ReadP Integer -> ReadP Integer
forall open close a.
ReadP open -> ReadP close -> ReadP a -> ReadP a
between (Char -> ReadP Char
char Char
'(') (Char -> ReadP Char
char Char
')') ReadP Integer
number
ReadP ()
colon ReadP () -> ReadP () -> ReadP ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ReadP ()
skipSpaces
let t :: a -> ([a], [a])
t a
x = ([], [a
x])
ShadercWarning
msg <- ReadP Char -> ReadP () -> ReadP ShadercWarning
forall a end. ReadP a -> ReadP end -> ReadP [a]
manyTill ReadP Char
get ReadP ()
eof
([ShadercWarning], [ShadercWarning])
-> ReadP ([ShadercWarning], [ShadercWarning])
forall (f :: * -> *) a. Applicative f => a -> f a
pure (([ShadercWarning], [ShadercWarning])
-> ReadP ([ShadercWarning], [ShadercWarning]))
-> ([ShadercWarning], [ShadercWarning])
-> ReadP ([ShadercWarning], [ShadercWarning])
forall a b. (a -> b) -> a -> b
$ (ShadercWarning -> ([ShadercWarning], [ShadercWarning]))
-> ShadercWarning
-> Integer
-> ShadercWarning
-> ([ShadercWarning], [ShadercWarning])
forall a t.
Show a =>
(ShadercWarning -> t) -> ShadercWarning -> a -> ShadercWarning -> t
formatMsg ShadercWarning -> ([ShadercWarning], [ShadercWarning])
forall a a. a -> ([a], [a])
t ShadercWarning
f Integer
line ShadercWarning
msg
, do
Integer
_ <- ReadP Integer
number
ReadP ()
skipSpaces
ShadercWarning
_ <- ShadercWarning -> ReadP ShadercWarning
string ShadercWarning
"errors generated"
ReadP ()
eof
([ShadercWarning], [ShadercWarning])
-> ReadP ([ShadercWarning], [ShadercWarning])
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([], [])
, do
ShadercWarning
msg <- ReadP Char -> ReadP () -> ReadP ShadercWarning
forall a end. ReadP a -> ReadP end -> ReadP [a]
manyTill ReadP Char
get ReadP ()
eof
ReadP ()
eof
([ShadercWarning], [ShadercWarning])
-> ReadP ([ShadercWarning], [ShadercWarning])
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([], [ShadercWarning
msg])
]
where
formatMsg :: (ShadercWarning -> t) -> ShadercWarning -> a -> ShadercWarning -> t
formatMsg ShadercWarning -> t
t ShadercWarning
f a
line ShadercWarning
msg = ShadercWarning -> t
t (ShadercWarning
f ShadercWarning -> ShadercWarning -> ShadercWarning
forall a. Semigroup a => a -> a -> a
<> ShadercWarning
":" ShadercWarning -> ShadercWarning -> ShadercWarning
forall a. Semigroup a => a -> a -> a
<> a -> ShadercWarning
forall a. Show a => a -> ShadercWarning
show a
line ShadercWarning -> ShadercWarning -> ShadercWarning
forall a. Semigroup a => a -> a -> a
<> ShadercWarning
": " ShadercWarning -> ShadercWarning -> ShadercWarning
forall a. Semigroup a => a -> a -> a
<> ShadercWarning
msg)
filename :: ReadP ShadercWarning
filename = ReadP Char -> ReadP ShadercWarning
forall a. ReadP a -> ReadP [a]
many1 ReadP Char
get
number :: ReadP Integer
number = ReadS Integer -> ReadP Integer
forall a. ReadS a -> ReadP a
readS_to_P (Read Integer => ReadS Integer
forall a. Read a => ReadS a
reads @Integer)
colon :: ReadP ()
colon = ReadP Char -> ReadP ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (ReadP Char -> ReadP ()) -> ReadP Char -> ReadP ()
forall a b. (a -> b) -> a -> b
$ Char -> ReadP Char
char Char
':'
msgType :: ReadP (a -> ([a], [a]))
msgType =
[ReadP (a -> ([a], [a]))] -> ReadP (a -> ([a], [a]))
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
[ (\a
x -> ([], [a
x])) (a -> ([a], [a]))
-> ReadP ShadercWarning -> ReadP (a -> ([a], [a]))
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ ShadercWarning -> ReadP ShadercWarning
string ShadercWarning
"error"
, (\a
x -> ([a
x], [])) (a -> ([a], [a]))
-> ReadP ShadercWarning -> ReadP (a -> ([a], [a]))
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ ShadercWarning -> ReadP ShadercWarning
string ShadercWarning
"warning"
]
ReadP (a -> ([a], [a])) -> ReadP () -> ReadP (a -> ([a], [a]))
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* ReadP ()
colon
ReadP (a -> ([a], [a])) -> ReadP () -> ReadP (a -> ([a], [a]))
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* ReadP ()
skipSpaces
runParser :: Monoid p => ReadP p -> String -> p
runParser :: ReadP p -> ShadercWarning -> p
runParser ReadP p
p ShadercWarning
s = case ReadP p -> ReadS p
forall a. ReadP a -> ReadS a
readP_to_S ReadP p
p ShadercWarning
s of
[(p
r, ShadercWarning
"")] -> p
r
[(p, ShadercWarning)]
_ -> p
forall a. Monoid a => a
mempty