module Vulkan.Utils.ShaderQQ.Backend.Glslang
  ( GlslangError
  , GlslangWarning
  , processGlslangMessages
  ) where

import qualified Data.ByteString.Lazy.Char8    as BSL
import           Data.List.Extra
import           System.FilePath

type GlslangError = String
type GlslangWarning = String

processGlslangMessages :: BSL.ByteString -> ([GlslangWarning], [GlslangError])
processGlslangMessages :: ByteString -> ([GlslangWarning], [GlslangWarning])
processGlslangMessages =
  forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr GlslangWarning
-> ([GlslangWarning], [GlslangWarning])
-> ([GlslangWarning], [GlslangWarning])
grep ([], []) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. (a -> Bool) -> [a] -> [a]
filter (Bool -> Bool
not forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (t :: * -> *) a. Foldable t => t a -> Bool
null) forall b c a. (b -> c) -> (a -> b) -> a -> c
. GlslangWarning -> [GlslangWarning]
lines forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> GlslangWarning
BSL.unpack
 where
  grep :: GlslangWarning
-> ([GlslangWarning], [GlslangWarning])
-> ([GlslangWarning], [GlslangWarning])
grep GlslangWarning
line ([GlslangWarning]
ws, [GlslangWarning]
es) | GlslangWarning
"WARNING: " forall a. Eq a => [a] -> [a] -> Bool
`isPrefixOf` GlslangWarning
line = (GlslangWarning -> GlslangWarning
cut GlslangWarning
line forall a. a -> [a] -> [a]
: [GlslangWarning]
ws, [GlslangWarning]
es)
                     | GlslangWarning
"ERROR: " forall a. Eq a => [a] -> [a] -> Bool
`isPrefixOf` GlslangWarning
line   = ([GlslangWarning]
ws, GlslangWarning -> GlslangWarning
cut GlslangWarning
line forall a. a -> [a] -> [a]
: [GlslangWarning]
es)
                     | Bool
otherwise                     = ([GlslangWarning]
ws, [GlslangWarning]
es)

  cut :: GlslangWarning -> GlslangWarning
cut GlslangWarning
line = GlslangWarning -> GlslangWarning
takeFileName GlslangWarning
path forall a. Semigroup a => a -> a -> a
<> GlslangWarning
msg
    where (GlslangWarning
path, GlslangWarning
msg) = forall a. (a -> Bool) -> [a] -> ([a], [a])
break (forall a. Eq a => a -> a -> Bool
== Char
':') forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Int -> [a] -> [a]
drop Int
1 forall a b. (a -> b) -> a -> b
$ forall a. (a -> Bool) -> [a] -> [a]
dropWhile (forall a. Eq a => a -> a -> Bool
/= Char
' ') GlslangWarning
line