module Data.UUID.Aeson where

import Control.Applicative (pure)

import Data.UUID (UUID, fromString)

import Data.Aeson (ToJSON,FromJSON, toJSON, parseJSON) 
import Data.Aeson.Types (Value(String), typeMismatch)

import qualified Data.Text as T

instance ToJSON UUID where
  toJSON = String . T.pack . show

instance FromJSON UUID where
  parseJSON json@(String t) = 
    let uuidString = T.unpack t
    in case fromString uuidString of
         Just uuid -> pure uuid 
         Nothing   -> typeMismatch "UUID" json 
  parseJSON unknown = typeMismatch "UUID" unknown