rofi-extras/app/rofi-bw.hs

53 lines
1.7 KiB
Haskell

--------------------------------------------------------------------------------
-- rofi-bw - a rofi prompt for a bitwarden vault
--
-- This is basically a wrapper around the 'bw' command, which is assumed to be
-- properly configured before running this command. This shows a system of
-- menus that allows easy lookup of data associated with a vault entry. For now
-- only lookups (no edits or creation) are supported, and only logins can be
-- searched. Any searched entry can be copied to the clipboard
--
-- In order to manage the session keys, this utility is split into a daemon and
-- client (the former holds the session keys between calls with the latter).
-- They communicate via dbus.
--
-- Most of the heavy-lifting code for this executable is in Bitwarden.Internal
-- to allow parts of this greater rofi library to use the DBus API
module Main (main) where
import Bitwarden.Internal
import qualified Data.Text.IO as TI
import RIO
import RIO.Directory
import qualified RIO.Text as T
import Rofi.Command
import System.Environment
main :: IO ()
main = runChecks >> getArgs >>= parse
-- TODO check if daemon is running when running client
parse :: [String] -> IO ()
parse ["-d", t] = case readMaybe t of Just t' -> runDaemon t'; _ -> usage
parse ("-c" : args) = runClient $ fmap T.pack args
parse _ = usage
usage :: IO ()
usage =
TI.putStrLn $
joinNewline
[ "daemon mode: rofi-bw -d TIMEOUT"
, "client mode: rofi-bw -c [ROFI-ARGS]"
]
runChecks :: IO ()
runChecks = checkExe "bw" >> checkExe "rofi"
checkExe :: String -> IO ()
checkExe cmd = do
res <- findExecutable cmd
unless (isJust res) $ do
TI.putStrLn $ T.append "Could not find executable: " $ T.pack cmd
exitWith $ ExitFailure 1