-----------------------------------------------------------------------------
--
-- Module      :  Text.XML.Plist.PlObject
-- Copyright   :  (c) Yuras Shumovich 2009, Michael Tolly 2012
-- License     :  BSD3
--
-- Maintainer  :  shumovichy@gmail.com
-- Stability   :  experimental
-- Portability :  portable
--
-- |PlObject data type
--
-----------------------------------------------------------------------------

module Text.XML.Plist.PlObject (

PlObject(..),
fromPlString,
fromPlBool,
fromPlInteger,
fromPlReal,
fromPlArray,
fromPlDict

) where

import Data.Word

-- | Data type that represents plist object
data PlObject
  = PlString String -- ^ string
  | PlBool Bool -- ^ bool
  | PlInteger Int -- ^ integer
  | PlReal Double -- ^ real
  | PlArray [PlObject] -- ^ array
  | PlDict [(String, PlObject)] -- ^ dictionary
  | PlData [Word8] -- ^ raw data
  | PlDate String -- ^ date (ISO 8601, but currently it is not validated)
  deriving (Eq, Ord, Show, Read)

fromPlString :: Monad m => PlObject -> m String
fromPlString (PlString str) = return str
fromPlString o = fail $ "not a string: " ++ show o

fromPlBool :: Monad m => PlObject -> m Bool
fromPlBool (PlBool bool) = return bool
fromPlBool o = fail $ "not a bool: " ++ show o

fromPlInteger :: Monad m => PlObject -> m Int
fromPlInteger (PlInteger i) = return i
fromPlInteger o = fail $ "not an integer: " ++ show o

fromPlReal :: Monad m => PlObject -> m Double
fromPlReal (PlReal r) = return r
fromPlReal o = fail $ "not a real: " ++ show o

fromPlArray :: Monad m => PlObject -> m [PlObject]
fromPlArray (PlArray arr) = return arr
fromPlArray o = fail $ "not an array: " ++ show o

fromPlDict :: Monad m => PlObject -> m [(String, PlObject)]
fromPlDict (PlDict d) = return d
fromPlDict o = fail $ "not a dictionary: " ++ show o