packages feed

venzone-1.0.0.0: src/Paths.hs

{-# Language LambdaCase #-}

module Paths where

import qualified Control.Monad      as CM
import qualified Data.List          as L
import qualified System.Directory   as D
import qualified System.Environment as E
import qualified System.FilePath    as F
import qualified Paths_venzone      as PS

import Story
import Parse

storyExt :: FilePath
storyExt = "vns"

-- tries to find data in 3 folders
findStoriesFolder :: IO FilePath
findStoriesFolder =
    -- local stories folder
    let lf = "." in
    -- where-exe-is one
    F.dropFileName <$> E.getExecutablePath >>= \ef ->
    -- data-folder
    PS.getDataFileName "" >>= \tf ->

    let sfs = map (F.</> "stories") [lf, ef, tf] in
    CM.filterM D.doesDirectoryExist sfs >>= \case
        (d:_) -> return d
        []    -> error $ "Could not find story folder! Tried:" ++
                         show sfs

findStories :: IO [Story]
findStories = -- get files
              findStoriesFolder  >>= \sd ->
              D.listDirectory sd >>= \fs ->
              let fs'  = L.sort fs
                  sfs  = filter (F.isExtensionOf storyExt) fs'
                  sffs = map (sd F.</>) sfs
              in
              mapM readStory sffs

-- single story (watch mode)
findSingleStory :: FilePath -> IO Story
findSingleStory fp = readStory fp