module Helper.File(findAPIs, loadAPI) where
import Prelude
import qualified Data.Aeson as Aeson
import Data.Maybe
import qualified Data.ByteString.Lazy.UTF8 as BSL (fromString)
import Control.Applicative ((<$>))
import Control.DeepSeq (rnf)
import Control.Monad (forM)
import System.IO
import System.Directory
import System.FilePath
import System.FilePath.Find
import Text.XML.HXT.Core (runX, readString, withRemoveWS, yes, (>>>))
import Data.OpenDataTable
import Data.JSON.Schema
import Data.OpenDataTable.Parser
findAPIs :: FilePath -> IO [(FilePath, FilePath)]
findAPIs folder = do
files <- find always (extension ==? ".json") folder
catMaybes <$> (forM files $ \json -> do
let xml = replaceExtension json ".xml"
existsJSON <- doesFileExist json
existsXML <- doesFileExist xml
if (existsJSON && existsXML)
then return $ Just (xml, json)
else return Nothing)
loadAPI :: (FilePath, FilePath) -> IO (Maybe (OpenDataTable, Schema))
loadAPI (xml, json) = do
jsonFile <- openFile json ReadMode
schema <- hGetContents jsonFile
rnf schema `seq` hClose jsonFile
xmlFile <- openFile xml ReadMode
document <- hGetContents xmlFile
rnf document `seq` hClose xmlFile
mOpenDataTable <- listToMaybe <$> runX (readString [withRemoveWS yes] document
>>> parseOpenDataTable)
return $ do
!o <- mOpenDataTable
s <- Aeson.decode . BSL.fromString $ schema
return (o, s)