{-# LANGUAGE OverloadedStrings #-}
module System.Taffybar.Auth where

import           Control.Monad.IO.Class
import           Data.Maybe
import           System.Taffybar.Util
import           Text.Regex

fieldRegex :: Regex
fieldRegex :: Regex
fieldRegex = String -> Bool -> Bool -> Regex
mkRegexWithOpts String
"^(.*?): *(.*?)$" Bool
True Bool
True

passGet :: MonadIO m => String -> m (Either String (String, [(String, String)]))
passGet :: forall (m :: * -> *).
MonadIO m =>
String -> m (Either String (String, [(String, String)]))
passGet String
credentialName = (Either String String
-> (String -> Either String (String, [(String, String)]))
-> Either String (String, [(String, String)])
forall a b.
Either String a -> (a -> Either String b) -> Either String b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= [String] -> Either String (String, [(String, String)])
forall {a}.
IsString a =>
[String] -> Either a (String, [(String, String)])
getPassComponents ([String] -> Either String (String, [(String, String)]))
-> (String -> [String])
-> String
-> Either String (String, [(String, String)])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String]
lines) (Either String String
 -> Either String (String, [(String, String)]))
-> m (Either String String)
-> m (Either String (String, [(String, String)]))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m (Either String String)
runPassShow
  where runPassShow :: m (Either String String)
runPassShow = String -> [String] -> m (Either String String)
forall (m :: * -> *).
MonadIO m =>
String -> [String] -> m (Either String String)
runCommand String
"pass" [String
"show", String
credentialName]

        getPassComponents :: [String] -> Either a (String, [(String, String)])
getPassComponents [] = a -> Either a (String, [(String, String)])
forall a b. a -> Either a b
Left a
"pass show command produced no output"
        getPassComponents (String
key:[String]
rest) = (String, [(String, String)])
-> Either a (String, [(String, String)])
forall a b. b -> Either a b
Right (String
key, [String] -> [(String, String)]
buildEntries [String]
rest)

        buildEntries :: [String] -> [(String, String)]
buildEntries = ([String] -> Maybe (String, String))
-> [[String]] -> [(String, String)]
forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe [String] -> Maybe (String, String)
forall {b}. [b] -> Maybe (b, b)
buildEntry ([[String]] -> [(String, String)])
-> ([String] -> [[String]]) -> [String] -> [(String, String)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> Maybe [String]) -> [String] -> [[String]]
forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe (Regex -> String -> Maybe [String]
matchRegex Regex
fieldRegex)

        buildEntry :: [b] -> Maybe (b, b)
buildEntry [b
fieldName, b
fieldValue] = (b, b) -> Maybe (b, b)
forall a. a -> Maybe a
Just (b
fieldName, b
fieldValue)
        buildEntry [b]
_ = Maybe (b, b)
forall a. Maybe a
Nothing