@@ -31,6 +31,7 @@ module Database.Bloodhound.Client
31 , indexExists
31 , indexExists
32 , openIndex
32 , openIndex
33 , closeIndex
33 , closeIndex
34 , updateIndexAliases
35 , updateIndexAliases
35 , getIndexAliases
36 , getIndexAliases
36 , putTemplate
37 , putTemplate
@@ -430,6 +431,19 @@ openIndex = openOrCloseIndexes OpenIndex
430closeIndex :: MonadBH m => IndexName -> m Reply
431closeIndex :: MonadBH m => IndexName -> m Reply
431closeIndex = openOrCloseIndexes CloseIndex
432closeIndex = openOrCloseIndexes CloseIndex
434+-- | 'listIndices' returns a list of all index names on a given 'Server'
435+listIndices :: (MonadThrow m, MonadBH m) => m [IndexName]
437+ parse . responseBody =<< get =<< url
439+ url = joinPath ["_cat/indices?v"]
440+ -- parses the tabular format the indices api provides
441+ parse body = case T.lines (T.decodeUtf8 (L.toStrict body)) of
442+ (hdr:rows) -> let ks = T.words hdr
443+ keyedRows = [ HM.fromList (zip ks (T.words row)) | row <- rows ]
444+ names = catMaybes (HM.lookup "index" <$> keyedRows)
445+ in return (IndexName <$> names)
446+ [] -> throwM (EsProtocolException body)
434-- | 'updateIndexAliases' updates the server's index alias
448-- | 'updateIndexAliases' updates the server's index alias
435-- table. Operations are atomic. Explained in further detail at
449-- table. Operations are atomic. Explained in further detail at