{-# LANGUAGE DeriveDataTypeable #-}

module Hoogle.DataBase.Serialise(
    saveDataBase, loadDataBase
    ) where

import Hoogle.Store.All
import General.Base
import General.System

import Hoogle.DataBase.Type
import Paths_hoogle(version)
import Data.Version


hooVersion = take 4 $ map fromIntegral (versionBranch version) ++ [0..]
hooString = "HOOG"

data Identity = Identity deriving (Show, Typeable)

instance Store Identity where
    put Identity = mapM_ put hooString >> mapM_ putByte hooVersion
    get = do
        cs <- replicateM 4 get
        vr <- replicateM 4 getByte
        when (cs /= hooString) $
            error $ "Not a hoogle database"

        let showVer = intercalate "." . map show
        when (vr /= hooVersion) $
            error $ "Wrong hoogle database version: found " ++ showVer vr ++ ", " ++
                    "expected " ++ showVer hooVersion
        return Identity



saveDataBase :: FilePath -> DataBase -> IO ()
saveDataBase file db = runSPut file $ put (Identity, db)


loadDataBase :: FilePath -> IO DataBase
loadDataBase file = do
    sz <- withFile file ReadMode hFileSize
    when (sz < 12) $
        error $ "Not a hoogle database: " ++ file

    (Identity,db) <- runSGet file get
    return db