clod-0.1.0: test/MagicTest.hs
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Main where
import qualified Magic.Init as Magic
import qualified Magic.Operations as Magic
import qualified Magic.Types as Magic
import Control.Exception (try, SomeException)
import System.IO (hPutStrLn, stderr)
import System.Directory (doesFileExist)
import Data.List (isPrefixOf, isInfixOf)
-- | Helper to determine if a MIME type represents text content
isMimeTypeText :: String -> Bool
isMimeTypeText mime =
"text/" `isPrefixOf` mime ||
mime == "application/json" ||
mime == "application/xml" ||
mime == "application/javascript" ||
mime == "application/x-shell" ||
mime == "application/x-shellscript" ||
"script" `isInfixOf` mime
-- | Check if a file is a text file using libmagic
isTextFile :: FilePath -> IO Bool
isTextFile file = do
exists <- doesFileExist file
if not exists
then return False
else do
result <- try $ do
magic <- Magic.magicOpen [Magic.MagicMimeType]
Magic.magicLoadDefault magic
mime <- Magic.magicFile magic file
return $ isMimeTypeText mime
case result of
Left (e :: SomeException) -> do
hPutStrLn stderr $ "Error detecting file type: " ++ show e
return False
Right isText -> return isText
main :: IO ()
main = do
let files = [
"/Users/fuzz/Projects/clod-contain/CLAUDE.md",
"/Users/fuzz/Projects/clod-contain/clod/README.md",
"/Users/fuzz/Projects/clod-contain/clod/bin/generate-man-pages.sh",
"/Users/fuzz/Projects/clod-contain/clod/src/Clod/Types.hs"
]
putStrLn "Testing magic-based file detection:"
mapM_ testFile files
where
testFile path = do
result <- isTextFile path
let resultStr = if result then "TEXT" else "BINARY"
putStrLn $ path ++ ": " ++ resultStr