module Desktop.Portal.Account
(
GetUserInformationOptions (..),
GetUserInformationResults (..),
getUserInformation,
)
where
import Control.Exception (throwIO)
import DBus (InterfaceName)
import DBus qualified
import DBus.Client qualified as DBus
import Data.Default (Default (def))
import Data.Map qualified as Map
import Data.Maybe (catMaybes, fromMaybe)
import Data.Text (Text)
import Desktop.Portal.Internal (Client, Request, sendRequest)
import Desktop.Portal.Util (decodeFileUri, mapJust, optionalFromVariant, toVariantPair)
import System.OsPath (OsPath)
data GetUserInformationOptions = GetUserInformationOptions
{ GetUserInformationOptions -> Maybe Text
window :: Maybe Text,
GetUserInformationOptions -> Maybe Text
reason :: Maybe Text
}
deriving (GetUserInformationOptions -> GetUserInformationOptions -> Bool
(GetUserInformationOptions -> GetUserInformationOptions -> Bool)
-> (GetUserInformationOptions -> GetUserInformationOptions -> Bool)
-> Eq GetUserInformationOptions
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: GetUserInformationOptions -> GetUserInformationOptions -> Bool
== :: GetUserInformationOptions -> GetUserInformationOptions -> Bool
$c/= :: GetUserInformationOptions -> GetUserInformationOptions -> Bool
/= :: GetUserInformationOptions -> GetUserInformationOptions -> Bool
Eq, Int -> GetUserInformationOptions -> ShowS
[GetUserInformationOptions] -> ShowS
GetUserInformationOptions -> String
(Int -> GetUserInformationOptions -> ShowS)
-> (GetUserInformationOptions -> String)
-> ([GetUserInformationOptions] -> ShowS)
-> Show GetUserInformationOptions
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> GetUserInformationOptions -> ShowS
showsPrec :: Int -> GetUserInformationOptions -> ShowS
$cshow :: GetUserInformationOptions -> String
show :: GetUserInformationOptions -> String
$cshowList :: [GetUserInformationOptions] -> ShowS
showList :: [GetUserInformationOptions] -> ShowS
Show)
instance Default GetUserInformationOptions where
def :: GetUserInformationOptions
def =
GetUserInformationOptions
{ $sel:window:GetUserInformationOptions :: Maybe Text
window = Maybe Text
forall a. Maybe a
Nothing,
$sel:reason:GetUserInformationOptions :: Maybe Text
reason = Maybe Text
forall a. Maybe a
Nothing
}
data GetUserInformationResults = GetUserInformationResults
{ GetUserInformationResults -> Text
id :: Text,
GetUserInformationResults -> Text
name :: Text,
GetUserInformationResults -> Maybe OsPath
image :: Maybe OsPath
}
deriving (GetUserInformationResults -> GetUserInformationResults -> Bool
(GetUserInformationResults -> GetUserInformationResults -> Bool)
-> (GetUserInformationResults -> GetUserInformationResults -> Bool)
-> Eq GetUserInformationResults
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: GetUserInformationResults -> GetUserInformationResults -> Bool
== :: GetUserInformationResults -> GetUserInformationResults -> Bool
$c/= :: GetUserInformationResults -> GetUserInformationResults -> Bool
/= :: GetUserInformationResults -> GetUserInformationResults -> Bool
Eq, Int -> GetUserInformationResults -> ShowS
[GetUserInformationResults] -> ShowS
GetUserInformationResults -> String
(Int -> GetUserInformationResults -> ShowS)
-> (GetUserInformationResults -> String)
-> ([GetUserInformationResults] -> ShowS)
-> Show GetUserInformationResults
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> GetUserInformationResults -> ShowS
showsPrec :: Int -> GetUserInformationResults -> ShowS
$cshow :: GetUserInformationResults -> String
show :: GetUserInformationResults -> String
$cshowList :: [GetUserInformationResults] -> ShowS
showList :: [GetUserInformationResults] -> ShowS
Show)
accountInterface :: InterfaceName
accountInterface :: InterfaceName
accountInterface = InterfaceName
"org.freedesktop.portal.Account"
getUserInformation :: Client -> GetUserInformationOptions -> IO (Request GetUserInformationResults)
getUserInformation :: Client
-> GetUserInformationOptions
-> IO (Request GetUserInformationResults)
getUserInformation Client
client GetUserInformationOptions
options =
Client
-> InterfaceName
-> MemberName
-> [Variant]
-> Map Text Variant
-> (Map Text Variant -> IO GetUserInformationResults)
-> IO (Request GetUserInformationResults)
forall a.
Client
-> InterfaceName
-> MemberName
-> [Variant]
-> Map Text Variant
-> (Map Text Variant -> IO a)
-> IO (Request a)
sendRequest Client
client InterfaceName
accountInterface MemberName
"GetUserInformation" [Variant
window] Map Text Variant
optionsArg Map Text Variant -> IO GetUserInformationResults
parseResponse
where
window :: Variant
window = Text -> Variant
forall a. IsVariant a => a -> Variant
DBus.toVariant (Text -> Maybe Text -> Text
forall a. a -> Maybe a -> a
fromMaybe Text
"" GetUserInformationOptions
options.window)
optionsArg :: Map Text Variant
optionsArg =
[(Text, Variant)] -> Map Text Variant
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList ([(Text, Variant)] -> Map Text Variant)
-> ([Maybe (Text, Variant)] -> [(Text, Variant)])
-> [Maybe (Text, Variant)]
-> Map Text Variant
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Maybe (Text, Variant)] -> [(Text, Variant)]
forall a. [Maybe a] -> [a]
catMaybes ([Maybe (Text, Variant)] -> Map Text Variant)
-> [Maybe (Text, Variant)] -> Map Text Variant
forall a b. (a -> b) -> a -> b
$
[ Text -> Maybe Text -> Maybe (Text, Variant)
forall a. IsVariant a => Text -> Maybe a -> Maybe (Text, Variant)
toVariantPair Text
"reason" GetUserInformationOptions
options.reason
]
parseResponse :: Map Text Variant -> IO GetUserInformationResults
parseResponse = \case
Map Text Variant
resMap
| Just Text
id' <- Variant -> Maybe Text
forall a. IsVariant a => Variant -> Maybe a
DBus.fromVariant (Variant -> Maybe Text) -> Maybe Variant -> Maybe Text
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Text -> Map Text Variant -> Maybe Variant
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup Text
"id" Map Text Variant
resMap,
Just Text
name <- Variant -> Maybe Text
forall a. IsVariant a => Variant -> Maybe a
DBus.fromVariant (Variant -> Maybe Text) -> Maybe Variant -> Maybe Text
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Text -> Map Text Variant -> Maybe Variant
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup Text
"name" Map Text Variant
resMap,
Just Maybe OsPath
image <- (Text -> Maybe OsPath) -> Maybe Text -> Maybe (Maybe OsPath)
forall a b. (a -> Maybe b) -> Maybe a -> Maybe (Maybe b)
mapJust Text -> Maybe OsPath
decodeFileUri (Maybe Text -> Maybe (Maybe OsPath))
-> Maybe (Maybe Text) -> Maybe (Maybe OsPath)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Text -> Map Text Variant -> Maybe (Maybe Text)
forall a.
IsVariant a =>
Text -> Map Text Variant -> Maybe (Maybe a)
optionalFromVariant Text
"image" Map Text Variant
resMap -> do
GetUserInformationResults -> IO GetUserInformationResults
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure GetUserInformationResults {$sel:id:GetUserInformationResults :: Text
id = Text
id', Text
$sel:name:GetUserInformationResults :: Text
name :: Text
name, Maybe OsPath
$sel:image:GetUserInformationResults :: Maybe OsPath
image :: Maybe OsPath
image}
Map Text Variant
resMap ->
ClientError -> IO GetUserInformationResults
forall e a. Exception e => e -> IO a
throwIO (ClientError -> IO GetUserInformationResults)
-> (String -> ClientError)
-> String
-> IO GetUserInformationResults
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ClientError
DBus.clientError (String -> IO GetUserInformationResults)
-> String -> IO GetUserInformationResults
forall a b. (a -> b) -> a -> b
$ String
"getUserInformation: could not parse response: " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> Map Text Variant -> String
forall a. Show a => a -> String
show Map Text Variant
resMap