{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverloadedStrings #-}

module Network.Syncthing.Types.DeviceId where

import           Control.Applicative              ((<$>))
import           Control.Monad                    (MonadPlus (mzero))
import           Data.Aeson                       (FromJSON, Value(..), parseJSON, (.:))
import           Data.Aeson.Types                 (Parser, Object)
import           Data.HashMap.Strict              (member)
import           Data.Text                        ()

import           Network.Syncthing.Internal.Error
import           Network.Syncthing.Types.Common


instance FromJSON (Either DeviceError Device) where
    parseJSON (Object v) = result
      where hasId        = member "id" v
            result       = parseIdResult hasId v
    parseJSON _          = mzero

parseIdResult :: Bool -> Object -> Parser (Either DeviceError Device)
parseIdResult hasId v
    | hasId     = Right <$> v .: "id"
    | otherwise = Left  <$> (decodeDeviceError <$> v .: "error")