packages feed

magic-2.0.0: src/Magic.hs

{- -*- Mode: haskell; -*-
Haskell Magic Interface
Copyright (C) 2005 John Goerzen <jgoerzen@complete.org>

This code is under a 3-clause BSD license; see COPYING for details.
-}

{- |
   Module     : Magic
   Copyright  : Copyright (C) 2005 John Goerzen
   License    : BSD-3-Clause

   Maintainer : Philippe <philippedev101\@gmail.com>
   Stability  : provisional
   Portability: portable

Haskell bindings to the C @libmagic@ library, which identifies the type of a
file by inspecting its contents rather than its name. It can report a textual
description, a MIME type, or a character-set encoding.

This top-level module re-exports the whole interface: the types in
"Magic.Types", the initialization functions in "Magic.Init", and the querying
functions in "Magic.Operations".

If you just want to pass ordinary @String@ paths, start with "Magic.FilePath",
a drop-in facade over this module. The functions here take
'System.OsPath.OsPath' instead, which represents any filename losslessly and
independently of the locale (see the note below).

A typical session creates a handle, loads the system magic database, then
queries files or in-memory data. The flags passed to 'magicOpen' choose what
kind of answer comes back (see t'MagicFlags'); combine them with @('<>')@ and
use 'mempty' (i.e. 'MagicNone') for the defaults:

> {-# LANGUAGE QuasiQuotes #-}
> import Magic
> import System.OsPath (osp)
> import qualified Data.Text.IO as T
>
> main :: IO ()
> main = do
>   magic <- magicOpen MagicMimeType     -- ask for MIME types
>   magicLoadDefault magic               -- load the system database
>   mime <- magicFile magic [osp|/etc/passwd|]
>   T.putStrLn mime                      -- e.g. "text/plain"

Paths here are 'System.OsPath.OsPath', which stores the OS-native path bytes
verbatim and so represents any path the system can, without a lossy locale
round-trip. The "Magic.FilePath" facade offers the same API with @String@
paths for convenience; it is fine for ordinary filenames, but cannot faithfully
represent names whose bytes are invalid in the current locale.

Handles are closed and their memory freed automatically when they are
garbage-collected (see t'Magic'); there is no explicit close. On failure, most
operations raise a t'MagicException'; 'magicOpen' raises an 'IOError' (from
@errno@) if the handle cannot be allocated.

Originally written by John Goerzen.
-}

module Magic (-- * Basic Types
             module Magic.Types,
             -- * Flags
             module Magic.Data,
             -- * Initialization
             module Magic.Init,
             -- * Operation
             module Magic.Operations
            )
where
import Magic.Types
import Magic.Data
import Magic.Init
import Magic.Operations