packages feed

desktop-portal-0.0.1.0: src/Desktop/Portal/Account.hs

module Desktop.Portal.Account
  ( -- * Get User Information
    GetUserInformationOptions (..),
    GetUserInformationResults (..),
    getUserInformation,
  )
where

import Control.Exception (throwIO)
import DBus (InterfaceName)
import DBus qualified
import DBus.Client qualified as DBus
import Data.Default.Class (Default (def))
import Data.Map qualified as Map
import Data.Maybe (catMaybes, fromMaybe)
import Data.Text (Text)
import Desktop.Portal.Request.Internal (Request, sendRequest)
import Desktop.Portal.Util (optionalFromVariant, toVariantPair)

data GetUserInformationOptions = GetUserInformationOptions
  { window :: Maybe Text,
    reason :: Maybe Text
  }
  deriving (Eq, Show)

instance Default GetUserInformationOptions where
  def =
    GetUserInformationOptions
      { window = Nothing,
        reason = Nothing
      }

data GetUserInformationResults = GetUserInformationResults
  { id :: Text,
    name :: Text,
    image :: Maybe Text
  }
  deriving (Eq, Show)

accountInterface :: InterfaceName
accountInterface = "org.freedesktop.portal.Account"

getUserInformation :: GetUserInformationOptions -> IO (Request GetUserInformationResults)
getUserInformation options =
  sendRequest accountInterface "GetUserInformation" [window] optionsArg parseResponse
  where
    window = DBus.toVariant (fromMaybe "" options.window)
    optionsArg =
      Map.fromList . catMaybes $
        [ toVariantPair "reason" options.reason
        ]

    parseResponse = \case
      resMap
        | Just id' <- DBus.fromVariant =<< Map.lookup "id" resMap,
          Just name <- DBus.fromVariant =<< Map.lookup "name" resMap,
          Just image <- optionalFromVariant "image" resMap ->
            pure GetUserInformationResults {id = id', name, image}
      resMap ->
        throwIO . DBus.clientError $ "getUserInformation: could not parse response: " <> show resMap