parseGhostExport :: ByteString -> Either String ([String], ([Post], [Tag], [PostTag]))
parseGhostExport rawContent = do
  let eitherData = eitherDecodeStrict rawContent >>= parseEither parseData

  -- then parse the various required objects
  let eitherPosts = eitherData >>= parseEither verboseParseManyPosts
  let eitherTags = eitherData >>= parseEither verboseParseManyTags
  let eitherTags = eitherData >>= parseEither verboseParseManyTags
  let eitherPostTags = eitherData >>= parseEither verboseParseManyPostTags

  let grouped = liftA3 (,,) eitherPosts eitherTags eitherPostTags

  case grouped of
    Left err -> Left err
    Right (posts, tags, postTags) -> do
      let errors = lefts posts ++ lefts tags ++ lefts postTags
      Right (errors, (rights posts, rights tags, rights postTags))
parseGhostExport :: ByteString -> Either String ([String], ([Post], [Tag], [PostTag]))
parseGhostExport rawContent = do
  let eitherData = eitherDecodeStrict rawContent >>= parseEither parseData

  -- then parse the various required objects
  let eitherPosts = eitherData >>= parseEither verboseParseManyPosts
  let eitherTags = eitherData >>= parseEither verboseParseManyTags
  let eitherTags = eitherData >>= parseEither verboseParseManyTags
  let eitherPostTags = eitherData >>= parseEither verboseParseManyPostTags

  let grouped = liftA3 (,,) eitherPosts eitherTags eitherPostTags

  case grouped of
    Left err -> Left err
    Right (posts, tags, postTags) -> do
      let errors = lefts posts ++ lefts tags ++ lefts postTags
      Right (errors, (rights posts, rights tags, rights postTags))
parseGhostExport rawContent = do
  let eitherData = eitherDecodeStrict rawContent >>= parseEither parseData

  -- then parse the various required objects
  let eitherPosts = eitherData >>= parseEither verboseParseManyPosts
  let eitherTags = eitherData >>= parseEither verboseParseManyTags
  let eitherTags = eitherData >>= parseEither verboseParseManyTags
  let eitherPostTags = eitherData >>= parseEither verboseParseManyPostTags

  let grouped = liftA3 (,,) eitherPosts eitherTags eitherPostTags

  case grouped of
    Left err -> Left err
    Right (posts, tags, postTags) -> do
      let errors = lefts posts ++ lefts tags ++ lefts postTags
      Right (errors, (rights posts, rights tags, rights postTags))