module Patrol.Type.EventId
  ( EventId
  , fromUuid
  , toUuid
  ) where

import qualified Data.Aeson as Aeson
import qualified Data.Text as Text
import qualified Data.UUID as Uuid

-- | <https://develop.sentry.dev/sdk/event-payloads/#required-attributes>
newtype EventId
  = EventId Uuid.UUID
  deriving (EventId -> EventId -> Bool
(EventId -> EventId -> Bool)
-> (EventId -> EventId -> Bool) -> Eq EventId
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: EventId -> EventId -> Bool
$c/= :: EventId -> EventId -> Bool
== :: EventId -> EventId -> Bool
$c== :: EventId -> EventId -> Bool
Eq, Int -> EventId -> ShowS
[EventId] -> ShowS
EventId -> String
(Int -> EventId -> ShowS)
-> (EventId -> String) -> ([EventId] -> ShowS) -> Show EventId
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [EventId] -> ShowS
$cshowList :: [EventId] -> ShowS
show :: EventId -> String
$cshow :: EventId -> String
showsPrec :: Int -> EventId -> ShowS
$cshowsPrec :: Int -> EventId -> ShowS
Show)

instance Aeson.FromJSON EventId where
  parseJSON :: Value -> Parser EventId
parseJSON = String -> (Text -> Parser EventId) -> Value -> Parser EventId
forall a. String -> (Text -> Parser a) -> Value -> Parser a
Aeson.withText String
"EventId" ((Text -> Parser EventId) -> Value -> Parser EventId)
-> (Text -> Parser EventId) -> Value -> Parser EventId
forall a b. (a -> b) -> a -> b
$ \ Text
text -> case Int -> Text -> [Text]
Text.chunksOf Int
4 Text
text of
    [Text
a, Text
b, Text
c, Text
d, Text
e, Text
f, Text
g, Text
h] -> Parser EventId
-> (UUID -> Parser EventId) -> Maybe UUID -> Parser EventId
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (String -> Parser EventId
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"invalid EventId") (EventId -> Parser EventId
forall (f :: * -> *) a. Applicative f => a -> f a
pure (EventId -> Parser EventId)
-> (UUID -> EventId) -> UUID -> Parser EventId
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UUID -> EventId
fromUuid)
      (Maybe UUID -> Parser EventId)
-> (Text -> Maybe UUID) -> Text -> Parser EventId
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Maybe UUID
Uuid.fromText
      (Text -> Parser EventId) -> Text -> Parser EventId
forall a b. (a -> b) -> a -> b
$ Text -> [Text] -> Text
Text.intercalate (Char -> Text
Text.singleton Char
'-') [Text
a Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
b, Text
c, Text
d, Text
e, Text
f Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
g Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
h]
    [Text]
_ -> String -> Parser EventId
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"invalid EventId"

instance Aeson.ToJSON EventId where
  toJSON :: EventId -> Value
toJSON = Text -> Value
forall a. ToJSON a => a -> Value
Aeson.toJSON (Text -> Value) -> (EventId -> Text) -> EventId -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Char -> Bool) -> Text -> Text
Text.filter (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
/= Char
'-') (Text -> Text) -> (EventId -> Text) -> EventId -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UUID -> Text
Uuid.toText (UUID -> Text) -> (EventId -> UUID) -> EventId -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. EventId -> UUID
toUuid

fromUuid :: Uuid.UUID -> EventId
fromUuid :: UUID -> EventId
fromUuid = UUID -> EventId
EventId

toUuid :: EventId -> Uuid.UUID
toUuid :: EventId -> UUID
toUuid (EventId UUID
x) = UUID
x