packages feed

otel-effectful-1.0.0: src/Effectful/OpenTelemetry/Protocol/Transport.hs

module Effectful.OpenTelemetry.Protocol.Transport {-# WARNING in "x-unstable-interface" "This is an unstable interface." #-} where

import Data.Char (toLower)
import Effectful.Http2Client (HostName, PortNumber)
import Network.GRPC.HTTP2.Proto3Wire (RPC)
import Network.HTTP.Types.Header (Header, hContentEncoding, hContentType)
import Network.URI (URI)
import Numeric.Natural
import Prelude

data Compression = NoCompression | GZip
    deriving stock (Show, Eq, Bounded, Enum)

instance Read Compression where
    readsPrec _ s =
        case toLower <$> s of
            "" -> [(NoCompression, "")]
            "none" -> [(NoCompression, "")]
            "nocompression" -> [(NoCompression, "")]
            "gzip" -> [(GZip, "")]
            _ -> []

contentEncoding :: Compression -> Maybe Header
contentEncoding NoCompression = Nothing
contentEncoding GZip = Just (hContentEncoding, "gzip")

data Encoding = Json | Proto
    deriving stock (Show, Eq)

contentType :: Encoding -> Header
contentType Json = (hContentType, "application/json")
contentType Proto = (hContentType, "application/x-protobuf")

data Protocol
    = HTTP Encoding URI
    | GRPC HostName PortNumber RPC

data Transport = Transport
    { protocol :: Protocol
    , compression :: Compression
    , timeoutMs :: Natural
    }