module Data.SpirV.Reflect.Yaml ( load , loadBytes , YamlError(..) , prettyYamlError , prettyYamlErrorBytes ) where import Control.Exception (Exception, throwIO) import Control.Monad.IO.Class (MonadIO(..)) import Data.ByteString.Lazy qualified as BSL import Data.YAML qualified as YAML import Data.SpirV.Reflect.Module (Module) import Data.SpirV.Reflect.Yaml.Parsers (rootP) data YamlError = YamlError { source :: FilePath , position :: YAML.Pos , message :: String } deriving (Show) instance Exception YamlError load :: MonadIO io => FilePath -> io Module load file = liftIO (BSL.readFile file) >>= loadBytes file loadBytes :: MonadIO io => FilePath -> BSL.ByteString -> io Module loadBytes source bytes = case YAML.decode1 bytes >>= YAML.parseEither . rootP of Left (position, message) -> liftIO $ throwIO YamlError{..} Right res -> pure res prettyYamlError :: MonadIO io => YamlError -> io String prettyYamlError err = do bytes <- liftIO (BSL.readFile $ source err) pure $ prettyYamlErrorBytes err bytes prettyYamlErrorBytes :: YamlError -> BSL.ByteString -> String prettyYamlErrorBytes YamlError{..} bytes = YAML.prettyPosWithSource position bytes source ++ message