module Sarsi where import Crypto.Hash (Digest, hash) import Crypto.Hash.Algorithms (MD5) import Network.Socket (Family(AF_UNIX), SockAddr(SockAddrUnix), Socket, SocketType(Stream), defaultProtocol, socket) import System.Directory (getTemporaryDirectory, createDirectory, doesDirectoryExist, doesFileExist, makeAbsolute, removeFile) import System.FilePath (()) import qualified Data.ByteString.Char8 as BSC8 title :: String title = "sarsi" newtype Broker = Broker FilePath data Topic = Topic Broker FilePath getBroker :: IO Broker getBroker = do tmp <- getTemporaryDirectory let bp = tmp title let broker = Broker bp exists <- doesDirectoryExist bp if exists then return broker else createDirectory bp >> return broker getTopic :: Broker -> FilePath -> IO Topic getTopic b@(Broker bp) fp' = do fp <- makeAbsolute fp' return $ Topic b $ bp (show $ (hash $ BSC8.pack fp :: Digest MD5)) removeTopic :: Topic -> IO () removeTopic (Topic _ fp) = removeFile fp createSocket :: IO Socket createSocket = do socket AF_UNIX Stream defaultProtocol createSockAddr :: Topic -> IO SockAddr createSockAddr t@(Topic _ path) = do exists <- doesFileExist path if (exists) then removeFile path else return () return $ getSockAddr t getSockAddr :: Topic -> SockAddr getSockAddr (Topic _ path) = SockAddrUnix path