-- | A module that enables you to compile and execute AppleScript.
module Foreign.AppleScript 
  (
  appleScriptAvailable,
  execAppleScript
  ) 
  where
import Data.Int
import Foreign.C.String
import System.Exit
import Control.Monad(liftM)
import Foreign
import Foreign.C

type OSStatus = Int32
data AEDesc = AEDesc

foreign import ccall "RunScript.h LowRunAppleScript" 
  cLowRunAppleScript :: CString -> CLong -> Ptr AEDesc -> IO OSStatus

-- | The 'appleScriptAvailable' function checks whether or not AppleScript is
-- available on your platform.
foreign import ccall "RunScript.h AppleScriptAvailable" appleScriptAvailable :: IO Bool

-- | The 'execAppleScript' function will attempt to compile and
-- execute the AppleScript, described in the @String@ it receives as
-- its argument.  Any result of running the script is discarded. The
-- @ExitCode@ indicates whether or not any errors were encountered
-- during compilation or execution.
execAppleScript :: String -> IO ExitCode
execAppleScript script = do
  let run (cstr,len) = cLowRunAppleScript cstr (fromIntegral len) nullPtr
  osstatus <- withCStringLen script run
  return (fromOSStatus osstatus)

-- Not the world's finest functions...
noErr :: Int32
noErr = 0

fromOSStatus :: Int32 -> ExitCode
fromOSStatus n
  | n == noErr = ExitSuccess
  | otherwise  = ExitFailure (fromIntegral n)