module Data.IndieWeb.Endpoints where
import Control.Lens
import Data.Maybe (catMaybes)
import Data.List (nub)
import Data.Aeson
import Data.Aeson.Lens
import qualified Data.Text as T
import qualified Data.Vector as V
import Network.URI
import Network.HTTP.Link
discoverEndpoints ∷ [T.Text]
→ Value
→ [Link]
→ [URI]
discoverEndpoints rels mfRoot linkH = nub $ headerLinks ++ mfLinks
where headerLinks = map href $ concat $ map (\r → filter (\(Link _ as) → (Rel, r) `elem` as) linkH) rels
mfLinks = catMaybes $ map parseAesonLink $ concat $ catMaybes $ map (\r → V.toList <$> mfRoot ^? key "rels" . key r . _Array) rels
parseAesonLink v = (T.unpack <$> v ^? _String) >>= parseURI