packages feed

hsec-tools-0.3.0.1: src/Security/Advisories/Queries.hs

module Security.Advisories.Queries
  ( listVersionAffectedBy
  , listVersionRangeAffectedBy
  )
where

import Control.Monad.IO.Class (MonadIO)
import Distribution.Types.Version (Version)
import Distribution.Types.VersionRange (VersionRange)
import Validation (Validation(..))

import Security.Advisories.Core.Advisory
import Security.Advisories.Filesystem
import Security.Advisories.Parse

type QueryResult = Validation [(FilePath, ParseAdvisoryError)] [Advisory]

-- | List the advisories matching a component and a version
listVersionAffectedBy
  :: MonadIO m
  => FilePath -> ComponentIdentifier -> Version -> m QueryResult
listVersionAffectedBy = listAffectedByHelper isVersionAffectedBy

-- | List the advisories matching a component and a version range
listVersionRangeAffectedBy
  :: (MonadIO m)
  => FilePath -> ComponentIdentifier -> VersionRange -> m QueryResult
listVersionRangeAffectedBy = listAffectedByHelper isVersionRangeAffectedBy

-- | Helper function for 'listVersionAffectedBy' and 'listVersionRangeAffectedBy'
listAffectedByHelper
  :: (MonadIO m)
  => (ComponentIdentifier -> a -> Advisory -> Bool) -> FilePath -> ComponentIdentifier -> a -> m QueryResult
listAffectedByHelper checkAffectedBy root queryComponent queryVersionish =
  fmap (filter (checkAffectedBy queryComponent queryVersionish)) <$>
    listAdvisories root