module Codec.CBOR.UUID (encode, decode) where import qualified Codec.Serialise as Ser import qualified Codec.CBOR.Encoding as Ser (Encoding, encodeTag) import qualified Codec.CBOR.Decoding as Ser (Decoder, decodeTag) import qualified Data.ByteString.Lazy as BL import qualified Data.UUID.Types as UUID -- | Encoded according to [draft-bormann-cbor-tags-oid-06](https://tools.ietf.org/html/draft-bormann-cbor-tags-oid-06). -- -- 19 bytes consisting of @0xd8@, @0x25@, @0x50@, and the 16 raw bytes of the -- UUID in network order. For example, the UUID @8b0d1a20-dcc5-11d9-bda9-0002a5d5c51b@ is -- encoded as @"\\xd8\\x25\\x50\\x8b\\x0d\\x1a\\x20\\xdc\\xc5\\x11\\xd9\\xbd\\xa9\\x00\\x02\\xa5\\xd5\\xc5\\x1b"@. encode :: UUID.UUID -> Ser.Encoding encode = \u -> Ser.encodeTag 0x25 <> Ser.encode (BL.toStrict (UUID.toByteString u)) {-# INLINABLE encode #-} -- | Decode according to [draft-bormann-cbor-tags-oid-06](https://tools.ietf.org/html/draft-bormann-cbor-tags-oid-06). -- -- 19 bytes consisting of @0xd8@, @0x25@, @0x50@, and the 16 raw bytes of the -- UUID in network order. For example, the UUID @8b0d1a20-dcc5-11d9-bda9-0002a5d5c51b@ is expected to be -- encoded as @"\\xd8\\x25\\x50\\x8b\\x0d\\x1a\\x20\\xdc\\xc5\\x11\\xd9\\xbd\\xa9\\x00\\x02\\xa5\\xd5\\xc5\\x1b"@. decode :: Ser.Decoder s UUID.UUID decode = do tag <- Ser.decodeTag case tag of 0x25 -> do bs <- Ser.decode case UUID.fromByteString (BL.fromStrict bs) of Nothing -> fail "UUID" Just x -> pure x _ -> fail "UUID" {-# INLINABLE decode #-}