{- UniProtConvert
Gregory W. Schwartz
Collections the functions pertaining to converting certain annotations into
UniProt annotations.
-}
{-# LANGUAGE OverloadedStrings #-}
module UniProtConvert
( toUniProtAnn
, toUniProtDesc
) where
-- Standard
import Data.Maybe
import Data.List
import qualified Data.Map.Strict as Map
import Data.Monoid
-- Cabal
import qualified Data.Text as T
import Network.HTTP
-- Local
import Types
-- | Get UniProt annotation.
toUniProtAnn :: UnknownAnn -> IO (Maybe Ann)
toUniProtAnn (UnknownAnn "") = return Nothing
toUniProtAnn query = do
uniProtDesc <- toUniProtDesc (UniProtOther "genes") $ query
return . fmap (Ann . unDesc) $ uniProtDesc
-- | Get UniProt description.
toUniProtDesc :: DescFields -> UnknownAnn -> IO (Maybe Desc)
toUniProtDesc _ (UnknownAnn "") = return Nothing
toUniProtDesc field (UnknownAnn query) = do
let base = "http://www.uniprot.org/uniprot/"
q = "?query="
opts = "&sort=score&columns="
<> T.unpack ((\(UniProtOther x) -> x) field)
<> "&format=tab"
req = base <> q <> T.unpack query <> opts
rsp <- simpleHTTP (getRequest req) >>= getResponseBody
let uniProtDesc = case rsp of
"" -> Nothing
x -> Just . Desc . T.pack . head . drop 1 . lines $ x
return uniProtDesc