packages feed

myo-0.1.0.0: src/Myo/Foreign/Result.hsc

module Myo.Foreign.Result where

import Foreign.Ptr
import Foreign.ForeignPtr
import Foreign.Storable

#include "libmyo.h"

data Result =
    Success
  | Error
  | InvalidArgument
  | RuntimeError
  deriving (Show, Eq, Ord, Bounded, Enum)

data ErrorReport =
  ErrorReport Result ErrorDetails
  deriving (Show, Eq, Ord)

data ErrorDetails_t
type ErrorDetails = ForeignPtr ErrorDetails_t

instance Storable ErrorDetails_t where
  sizeOf _ = (#size libmyo_error_details_t)
  alignment _ = alignment (undefined :: Ptr ErrorDetails)
  peek _   = error "ErrorDetails_t.peek: Absurd"
  poke _ _ = error "ErrorDetails_t.poke: Absurd"

instance Storable Result where
  sizeOf _ = (#size libmyo_result_t)
  alignment _ = alignment (undefined :: Ptr Result)
  peek ptr = do
    v <- peekByteOff ptr 0
    return $ toEnum v
  poke p v = let e = fromEnum v in pokeByteOff p e e