packages feed

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