module Network.Bugsnag.Device ( bugsnagDeviceFromUserAgent ) where import Prelude import Data.Bugsnag import Data.ByteString (ByteString) import Data.Text (pack, unpack) import Data.Version import Text.Read (readMaybe) import Web.UAParser bugsnagDeviceFromUserAgent :: ByteString -> Device bugsnagDeviceFromUserAgent :: ByteString -> Device bugsnagDeviceFromUserAgent ByteString userAgent = Device defaultDevice { device_osName :: Maybe Text device_osName = OSResult -> Text osrFamily (OSResult -> Text) -> Maybe OSResult -> Maybe Text forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> Maybe OSResult osResult , device_osVersion :: Maybe Text device_osVersion = do OSResult result <- Maybe OSResult osResult Int v1 <- String -> Maybe Int forall a. Read a => String -> Maybe a readMaybe (String -> Maybe Int) -> (Text -> String) -> Text -> Maybe Int forall b c a. (b -> c) -> (a -> b) -> a -> c . Text -> String unpack (Text -> Maybe Int) -> Maybe Text -> Maybe Int forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b =<< OSResult -> Maybe Text osrV1 OSResult result Int v2 <- String -> Maybe Int forall a. Read a => String -> Maybe a readMaybe (String -> Maybe Int) -> (Text -> String) -> Text -> Maybe Int forall b c a. (b -> c) -> (a -> b) -> a -> c . Text -> String unpack (Text -> Maybe Int) -> Maybe Text -> Maybe Int forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b =<< OSResult -> Maybe Text osrV2 OSResult result Int v3 <- String -> Maybe Int forall a. Read a => String -> Maybe a readMaybe (String -> Maybe Int) -> (Text -> String) -> Text -> Maybe Int forall b c a. (b -> c) -> (a -> b) -> a -> c . Text -> String unpack (Text -> Maybe Int) -> Maybe Text -> Maybe Int forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b =<< OSResult -> Maybe Text osrV3 OSResult result Int v4 <- String -> Maybe Int forall a. Read a => String -> Maybe a readMaybe (String -> Maybe Int) -> (Text -> String) -> Text -> Maybe Int forall b c a. (b -> c) -> (a -> b) -> a -> c . Text -> String unpack (Text -> Maybe Int) -> Maybe Text -> Maybe Int forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b =<< OSResult -> Maybe Text osrV4 OSResult result Text -> Maybe Text forall (f :: * -> *) a. Applicative f => a -> f a pure (Text -> Maybe Text) -> Text -> Maybe Text forall a b. (a -> b) -> a -> b $ String -> Text pack (String -> Text) -> String -> Text forall a b. (a -> b) -> a -> b $ Version -> String showVersion (Version -> String) -> Version -> String forall a b. (a -> b) -> a -> b $ [Int] -> Version makeVersion [Int v1, Int v2, Int v3, Int v4] , device_browserName :: Maybe Text device_browserName = UAResult -> Text uarFamily (UAResult -> Text) -> Maybe UAResult -> Maybe Text forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> Maybe UAResult uaResult , device_browserVersion :: Maybe Text device_browserVersion = do UAResult result <- Maybe UAResult uaResult Int v1 <- String -> Maybe Int forall a. Read a => String -> Maybe a readMaybe (String -> Maybe Int) -> (Text -> String) -> Text -> Maybe Int forall b c a. (b -> c) -> (a -> b) -> a -> c . Text -> String unpack (Text -> Maybe Int) -> Maybe Text -> Maybe Int forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b =<< UAResult -> Maybe Text uarV1 UAResult result Int v2 <- String -> Maybe Int forall a. Read a => String -> Maybe a readMaybe (String -> Maybe Int) -> (Text -> String) -> Text -> Maybe Int forall b c a. (b -> c) -> (a -> b) -> a -> c . Text -> String unpack (Text -> Maybe Int) -> Maybe Text -> Maybe Int forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b =<< UAResult -> Maybe Text uarV2 UAResult result Int v3 <- String -> Maybe Int forall a. Read a => String -> Maybe a readMaybe (String -> Maybe Int) -> (Text -> String) -> Text -> Maybe Int forall b c a. (b -> c) -> (a -> b) -> a -> c . Text -> String unpack (Text -> Maybe Int) -> Maybe Text -> Maybe Int forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b =<< UAResult -> Maybe Text uarV3 UAResult result Text -> Maybe Text forall (f :: * -> *) a. Applicative f => a -> f a pure (Text -> Maybe Text) -> Text -> Maybe Text forall a b. (a -> b) -> a -> b $ String -> Text pack (String -> Text) -> String -> Text forall a b. (a -> b) -> a -> b $ Version -> String showVersion (Version -> String) -> Version -> String forall a b. (a -> b) -> a -> b $ [Int] -> Version makeVersion [Int v1, Int v2, Int v3] } where uaResult :: Maybe UAResult uaResult = ByteString -> Maybe UAResult parseUA ByteString userAgent osResult :: Maybe OSResult osResult = ByteString -> Maybe OSResult parseOS ByteString userAgent