{-# 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