-- |
-- Stability   :  Ultra-Violence
-- Portability :  I'm too young to die
-- The exceptions one would want to throw to be understood by the existing 9P clients.

module Network.NineP.Error
	( NineError(..)
	) where

import Control.Exception
import Data.Typeable
import Data.Word

data NineError =
	ENotImplemented String |
	ENotADir |
	EDir |
	ENoFile String |
	ENoFid Word32 |
	ENoAuthRequired |
	EPermissionDenied |
	EInval |
	OtherError String deriving (Typeable)

instance Exception NineError

-- |See also: @linux\/net\/9p\/error.c@
instance Show NineError where
	show (ENotImplemented s) = s ++ " is not implemented"
	show ENotADir = "not a directory"
	show EDir = "Is a directory"
	show (ENoFile s) = "file not found"
	show (ENoFid i) = "fid " ++ show i ++ " is not registered on the server"
	show ENoAuthRequired = "the server doesn't require any kind of authentication"
	show EPermissionDenied = "permission denied"
	show EInval = "Invalid argument"
	show (OtherError s) = s