module Buffet.Parse.ParseMenuFromFolder
  ( get
  ) where

import qualified Buffet.Ir.Ir as Ir
import qualified Buffet.Parse.Menu as Menu
import qualified Control.Monad as Monad
import qualified Data.Map.Strict as Map
import qualified Data.Text as T
import Prelude (FilePath, IO, ($), (.), fmap, pure)
import qualified System.Directory as Directory
import qualified System.FilePath as FilePath

get :: FilePath -> IO Menu.Menu
get :: FilePath -> IO Menu
get FilePath
menu = do
  [FilePath]
folderEntries <- FilePath -> IO [FilePath]
Directory.listDirectory FilePath
menu
  [FilePath]
options <-
    (FilePath -> IO Bool) -> [FilePath] -> IO [FilePath]
forall (m :: * -> *) a.
Applicative m =>
(a -> m Bool) -> [a] -> m [a]
Monad.filterM
      (FilePath -> IO Bool
Directory.doesDirectoryExist (FilePath -> IO Bool)
-> (FilePath -> FilePath) -> FilePath -> IO Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FilePath -> FilePath -> FilePath
FilePath.combine FilePath
menu)
      [FilePath]
folderEntries
  Menu -> IO Menu
forall (f :: * -> *) a. Applicative f => a -> f a
pure
    Menu
Menu.defaultMenu
      { optionToDish :: Map Option FilePath
Menu.optionToDish =
          [(Option, FilePath)] -> Map Option FilePath
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList ([(Option, FilePath)] -> Map Option FilePath)
-> [(Option, FilePath)] -> Map Option FilePath
forall a b. (a -> b) -> a -> b
$
          (FilePath -> (Option, FilePath))
-> [FilePath] -> [(Option, FilePath)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap
            (\FilePath
option ->
               ( Text -> Option
Ir.Option (Text -> Option) -> Text -> Option
forall a b. (a -> b) -> a -> b
$ FilePath -> Text
T.pack FilePath
option
               , [FilePath] -> FilePath
FilePath.joinPath [FilePath
menu, FilePath
option, FilePath
"Dockerfile"]))
            [FilePath]
options
      }