{-# LANGUAGE DeriveGeneric     #-}
{-# LANGUAGE OverloadedStrings #-}
{-|
Module      : Instana.SDK.Span.SimpleSpan
Description : A representation for spans for external use.
-}
module Instana.SDK.Span.SimpleSpan
  ( SimpleSpan(..)
  , convert
  ) where


import qualified Data.Text                 as T
import           GHC.Generics

import qualified Instana.SDK.Internal.Id   as Id
import           Instana.SDK.Span.Span     (Span, SpanKind (..))
import qualified Instana.SDK.Span.Span     as Span
import           Instana.SDK.Span.SpanData (SpanData)


-- |A representation of the span fit for external use by clients of the SDK.
data SimpleSpan = SimpleSpan
  { SimpleSpan -> String
traceId    :: String
  , SimpleSpan -> String
spanId     :: String
  , SimpleSpan -> Maybe String
parentId   :: Maybe String
  , SimpleSpan -> String
spanName   :: String
  , SimpleSpan -> Int
timestamp  :: Int
  , SimpleSpan -> SpanKind
kind       :: SpanKind
  , SimpleSpan -> Int
errorCount :: Int
  , SimpleSpan -> SpanData
spanData   :: SpanData
  } deriving (SimpleSpan -> SimpleSpan -> Bool
(SimpleSpan -> SimpleSpan -> Bool)
-> (SimpleSpan -> SimpleSpan -> Bool) -> Eq SimpleSpan
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: SimpleSpan -> SimpleSpan -> Bool
$c/= :: SimpleSpan -> SimpleSpan -> Bool
== :: SimpleSpan -> SimpleSpan -> Bool
$c== :: SimpleSpan -> SimpleSpan -> Bool
Eq, (forall x. SimpleSpan -> Rep SimpleSpan x)
-> (forall x. Rep SimpleSpan x -> SimpleSpan) -> Generic SimpleSpan
forall x. Rep SimpleSpan x -> SimpleSpan
forall x. SimpleSpan -> Rep SimpleSpan x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep SimpleSpan x -> SimpleSpan
$cfrom :: forall x. SimpleSpan -> Rep SimpleSpan x
Generic, Int -> SimpleSpan -> ShowS
[SimpleSpan] -> ShowS
SimpleSpan -> String
(Int -> SimpleSpan -> ShowS)
-> (SimpleSpan -> String)
-> ([SimpleSpan] -> ShowS)
-> Show SimpleSpan
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SimpleSpan] -> ShowS
$cshowList :: [SimpleSpan] -> ShowS
show :: SimpleSpan -> String
$cshow :: SimpleSpan -> String
showsPrec :: Int -> SimpleSpan -> ShowS
$cshowsPrec :: Int -> SimpleSpan -> ShowS
Show)


-- |Converts the internal span datastructure into the simplified format.
convert :: Span -> SimpleSpan
convert :: Span -> SimpleSpan
convert span_ :: Span
span_ =
  SimpleSpan :: String
-> String
-> Maybe String
-> String
-> Int
-> SpanKind
-> Int
-> SpanData
-> SimpleSpan
SimpleSpan
    { traceId :: String
traceId    = Id -> String
Id.toString (Id -> String) -> Id -> String
forall a b. (a -> b) -> a -> b
$ Span -> Id
Span.traceId Span
span_
    , spanId :: String
spanId     = Id -> String
Id.toString (Id -> String) -> Id -> String
forall a b. (a -> b) -> a -> b
$ Span -> Id
Span.spanId Span
span_
    , parentId :: Maybe String
parentId   = Id -> String
Id.toString (Id -> String) -> Maybe Id -> Maybe String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Span -> Maybe Id
Span.parentId Span
span_
    , spanName :: String
spanName   = Text -> String
T.unpack (Text -> String) -> Text -> String
forall a b. (a -> b) -> a -> b
$ Span -> Text
Span.spanName Span
span_
    , timestamp :: Int
timestamp  = Span -> Int
Span.timestamp Span
span_
    , kind :: SpanKind
kind       = Span -> SpanKind
Span.spanKind Span
span_
    , errorCount :: Int
errorCount = Span -> Int
Span.errorCount Span
span_
    , spanData :: SpanData
spanData   = Span -> SpanData
Span.spanData Span
span_
    }