packages feed

tianbar-1.0.0.0: src/System/Tianbar/Plugin/FileSystem.hs

module System.Tianbar.Plugin.FileSystem where

-- Serve files from the data directory

import Control.Monad
import Control.Monad.Reader

import qualified Data.List as L
import qualified Data.Text as T

import System.Environment.XDG.BaseDir

import System.Tianbar.Configuration
import System.Tianbar.Plugin
import System.Tianbar.RequestResponse

import Paths_tianbar

data FileSystem = FileSystem

getUserFileName :: String -> IO FilePath
getUserFileName = getUserConfigFile appName

getRootFileName :: String -> IO FilePath
getRootFileName filePath = return $ "/" ++ filePath

instance Plugin FileSystem where
    initialize = return FileSystem

    handler = msum [ dir "data" $ directoryHandler getDataFileName
                   , dir "user" $ directoryHandler getUserFileName
                   , dir "root" $ directoryHandler getRootFileName
                   ]

directoryHandler :: (String -> IO FilePath) -> ServerPart FileSystem Response
directoryHandler getFileName = do
    uri <- ask
    let filePath = L.intercalate "/" $ map T.unpack $ uriPathSegments uri
    dataFile <- liftIO $ getFileName filePath
    serveFile dataFile