module YamlUnscrambler.Util.Yaml where

import qualified Conduit
import qualified Data.Text.Encoding as Text
import qualified Data.Yaml as Yaml
import qualified Data.Yaml.Parser as YamlParser
import qualified Text.Libyaml as Libyaml
import YamlUnscrambler.Prelude

parseByteStringToRawDoc :: ByteString -> Either Text YamlParser.RawDoc
parseByteStringToRawDoc :: ByteString -> Either Text RawDoc
parseByteStringToRawDoc ByteString
input =
  (SomeException -> Text)
-> Either SomeException RawDoc -> Either Text RawDoc
forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first SomeException -> Text
forall a. Show a => a -> Text
showAsText (Either SomeException RawDoc -> Either Text RawDoc)
-> Either SomeException RawDoc -> Either Text RawDoc
forall a b. (a -> b) -> a -> b
$
    IO (Either SomeException RawDoc) -> Either SomeException RawDoc
forall a. IO a -> a
unsafePerformIO (IO (Either SomeException RawDoc) -> Either SomeException RawDoc)
-> IO (Either SomeException RawDoc) -> Either SomeException RawDoc
forall a b. (a -> b) -> a -> b
$
      forall a.
Exception SomeException =>
IO a -> IO (Either SomeException a)
forall e a. Exception e => IO a -> IO (Either e a)
try @SomeException (IO RawDoc -> IO (Either SomeException RawDoc))
-> IO RawDoc -> IO (Either SomeException RawDoc)
forall a b. (a -> b) -> a -> b
$
        ConduitT () Void (ResourceT IO) RawDoc -> IO RawDoc
forall (m :: * -> *) r.
MonadUnliftIO m =>
ConduitT () Void (ResourceT m) r -> m r
Conduit.runConduitRes (ConduitT () Void (ResourceT IO) RawDoc -> IO RawDoc)
-> ConduitT () Void (ResourceT IO) RawDoc -> IO RawDoc
forall a b. (a -> b) -> a -> b
$
          Conduit () (ResourceT IO) Event
-> ConduitM Event Void (ResourceT IO) RawDoc
-> ConduitT () Void (ResourceT IO) RawDoc
forall (m :: * -> *) a b c r.
Monad m =>
Conduit a m b -> ConduitM b c m r -> ConduitM a c m r
Conduit.fuse (ByteString -> Conduit () (ResourceT IO) Event
forall (m :: * -> *) i.
MonadResource m =>
ByteString -> ConduitM i Event m ()
Libyaml.decode ByteString
input) (ConduitM Event Void (ResourceT IO) RawDoc
forall (m :: * -> *) o. MonadThrow m => ConduitM Event o m RawDoc
YamlParser.sinkRawDoc)