-- |Marshalling values into and out of 'Network.ONCRPC.XDR.Types.Opaque' byte strings.
-- Not really part of XDR, but convenient way to avoid many conversion functions.

{-# LANGUAGE DefaultSignatures #-}
module Network.ONCRPC.XDR.Opaque
  ( Opaqued(..)
  , unopacify'
  , toOpaque
  , toOpaque'
  , fromOpaque
  , fromOpaque'
  ) where

import           Data.ByteString (ByteString)
import           Data.Functor.Identity (runIdentity)
import           Data.Maybe (fromJust)

import           Network.ONCRPC.XDR.Array
import           Network.ONCRPC.XDR.Serial
import qualified Network.ONCRPC.Prot as RPC

-- |Values that can be stored in an 'Network.ONCRPC.XDR.Types.Opaque' 'OpaqueString' 'ByteString'.
-- The default implementation allows (re-)embedding of XDR-encoded data, such as with 'RPC.Opaque_auth'.
class Opaqued a where
  opacify :: a -> ByteString
  default opacify :: XDR a => a -> ByteString
  opacify = forall a. XDR a => a -> ByteString
xdrSerialize
  unopacify :: MonadFail m => ByteString -> m a
  default unopacify :: (XDR a, MonadFail m) => ByteString -> m a
  unopacify = forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either forall (m :: * -> *) a. MonadFail m => String -> m a
fail forall (m :: * -> *) a. Monad m => a -> m a
return forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. XDR a => ByteString -> Either String a
xdrDeserialize

unopacify' :: Opaqued a => ByteString -> a
unopacify' :: forall a. Opaqued a => ByteString -> a
unopacify' = forall a. HasCallStack => Maybe a -> a
fromJust forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a (m :: * -> *).
(Opaqued a, MonadFail m) =>
ByteString -> m a
unopacify

toOpaque :: (Opaqued a, KnownOrdering o, KnownNat n) => a -> Maybe (LengthArray o n OpaqueString)
toOpaque :: forall a (o :: Ordering) (n :: Nat).
(Opaqued a, KnownOrdering o, KnownNat n) =>
a -> Maybe (LengthArray o n OpaqueString)
toOpaque = forall (o :: Ordering) (n :: Nat) a.
(KnownOrdering o, KnownNat n, HasLength a) =>
a -> Maybe (LengthArray o n a)
lengthArray forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> OpaqueString
OpaqueString forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Opaqued a => a -> ByteString
opacify

toOpaque' :: (Opaqued a, KnownOrdering o, KnownNat n) => a -> LengthArray o n OpaqueString
toOpaque' :: forall a (o :: Ordering) (n :: Nat).
(Opaqued a, KnownOrdering o, KnownNat n) =>
a -> LengthArray o n OpaqueString
toOpaque' = forall (o :: Ordering) (n :: Nat) a.
(KnownOrdering o, KnownNat n, HasLength a) =>
a -> LengthArray o n a
lengthArray' forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> OpaqueString
OpaqueString forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Opaqued a => a -> ByteString
opacify

fromOpaque :: (Opaqued a, MonadFail m) => LengthArray o n OpaqueString -> m a
fromOpaque :: forall a (m :: * -> *) (o :: Ordering) (n :: Nat).
(Opaqued a, MonadFail m) =>
LengthArray o n OpaqueString -> m a
fromOpaque = forall a (m :: * -> *).
(Opaqued a, MonadFail m) =>
ByteString -> m a
unopacify forall b c a. (b -> c) -> (a -> b) -> a -> c
. OpaqueString -> ByteString
unOpaqueString forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (o :: Ordering) (n :: Nat) a. LengthArray o n a -> a
unLengthArray

fromOpaque' :: Opaqued a => LengthArray o n OpaqueString -> a
fromOpaque' :: forall a (o :: Ordering) (n :: Nat).
Opaqued a =>
LengthArray o n OpaqueString -> a
fromOpaque' = forall a. Opaqued a => ByteString -> a
unopacify' forall b c a. (b -> c) -> (a -> b) -> a -> c
. OpaqueString -> ByteString
unOpaqueString forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (o :: Ordering) (n :: Nat) a. LengthArray o n a -> a
unLengthArray

instance Opaqued RPC.Authsys_parms