module TreeGrepper.FileType ( FileType (..), all, Info (..), BlockInfo (..), info, ) where import Data.Aeson (FromJSON (parseJSON)) import Data.Text (Text) import Prelude hiding (all) data FileType = Elm | Haskell | Nix | Shell deriving (Show) instance FromJSON FileType where parseJSON v = parseJSON v >>= \case "elm" -> pure Elm "haskell" -> pure Haskell "nix" -> pure Nix "sh" -> pure Shell fileType -> fail ("parsing file_type failed, got " ++ fileType) all :: [FileType] all = [ Elm, Haskell, Nix, Shell ] data Info = Info { exts :: [String], lineStart :: Text, block :: Maybe BlockInfo } data BlockInfo = BlockInfo { blockStart :: [Text], blockEnd :: Text } info :: FileType -> Info info Elm = Info { exts = [".elm"], lineStart = "--", block = Just BlockInfo {blockStart = ["{-|", "{-"], blockEnd = "-}"} } info Haskell = Info { exts = [".hs"], lineStart = "--", block = Just BlockInfo {blockStart = ["{-"], blockEnd = "-}"} } info Nix = Info { exts = [".nix"], lineStart = "#", block = Just BlockInfo {blockStart = ["/*"], blockEnd = "*/"} } info Shell = Info { exts = [".sh"], lineStart = "#", block = Nothing }