module Chevalier.Client( getSourceDict, getAddresses, getAddresses' ) where import Control.Monad.Trans import Data.Bifunctor import Data.Either import Data.List import Data.Text (Text) import qualified Data.Text as T import Data.Text.Encoding (encodeUtf8) import Network.URI import qualified System.ZMQ4 as Z import Vaultaire.Types import Chevalier.Util import Chevalier.Types getSourceDict :: MonadIO m => URI -> Origin -> Address -> m (Maybe SourceDict) getSourceDict uri org addr = do resp <- runChevalier uri org $ buildRequestFromAddress addr return $ fmap snd $ find ((==addr) . fst) resp -- | Take one key-value pair and return matched addresses and -- sourcedicts. getAddresses :: MonadIO m => URI -> Origin -> (String, String) -> m [(Address, SourceDict)] getAddresses uri org = getAddresses' uri org . (: []) -- | Take multiple key-value pairs and return matched addresses and -- sourcedicts. getAddresses' :: MonadIO m => URI -> Origin -> [(String, String)] -> m [(Address, SourceDict)] getAddresses' uri org tags = runChevalier uri org $ buildRequestFromPairs $ packTags tags where packTags = map (bimap T.pack T.pack) runChevalier :: MonadIO m => URI -> Origin -> SourceRequest -> m [(Address, SourceDict)] runChevalier uri origin req = do resp <- liftIO sendrecv return $ either (error . show) (rights . map convertSource) (decodeResponse resp) where sendrecv = Z.withContext (\ctx -> Z.withSocket ctx Z.Req (\sock -> do Z.connect sock $ show uri Z.send sock [Z.SendMore] $ encodeOrigin origin Z.send sock [] $ encodeRequest req Z.receive sock)) encodeOrigin (Origin x) = encodeUtf8 $ T.pack $ show x