git-annex/Types/FileMatcher.hs

95 lines
2.9 KiB
Haskell
Raw Normal View History

2013-05-25 17:51:27 +00:00
{- git-annex file matcher types
-
- Copyright 2013-2021 Joey Hess <id@joeyh.name>
2013-05-25 17:51:27 +00:00
-
- Licensed under the GNU AGPL version 3 or higher.
2013-05-25 17:51:27 +00:00
-}
module Types.FileMatcher where
import Types.UUID (UUID)
import Types.Key (Key)
import Types.Link (LinkType)
import Types.Mime
import Utility.Matcher (Matcher, Token)
import Utility.FileSize
import Utility.FileSystemEncoding
import Control.Monad.IO.Class
import qualified Data.Map as M
import qualified Data.Set as S
-- Information about a file and/or a key that can be matched on.
data MatchInfo
= MatchingFile FileInfo
| MatchingInfo ProvidedInfo
| MatchingUserInfo UserProvidedInfo
2013-05-25 17:51:27 +00:00
data FileInfo = FileInfo
2021-03-01 20:34:40 +00:00
{ contentFile :: RawFilePath
-- ^ path to a file containing the content, for operations
-- that examine it
, matchFile :: RawFilePath
2020-12-14 20:52:53 +00:00
-- ^ filepath to match on; may be relative to top of repo or cwd,
-- depending on how globs in preferred content expressions
-- are intended to be matched
, matchKey :: Maybe Key
-- ^ provided if a key is already known
2013-05-25 17:51:27 +00:00
}
data ProvidedInfo = ProvidedInfo
{ providedFilePath :: Maybe RawFilePath
-- ^ filepath to match on, should not be accessed from disk.
, providedKey :: Maybe Key
, providedFileSize :: Maybe FileSize
, providedMimeType :: Maybe MimeType
, providedMimeEncoding :: Maybe MimeEncoding
, providedLinkType :: Maybe LinkType
}
-- This is used when testing a matcher, with values to match against
-- provided by the user.
data UserProvidedInfo = UserProvidedInfo
{ userProvidedFilePath :: UserInfo FilePath
, userProvidedKey :: UserInfo Key
, userProvidedFileSize :: UserInfo FileSize
, userProvidedMimeType :: UserInfo MimeType
, userProvidedMimeEncoding :: UserInfo MimeEncoding
}
-- This may fail if the user did not provide the information.
type UserInfo a = Either (IO a) a
-- If the UserInfo is not available, accessing it may result in eg an
-- exception being thrown.
getUserInfo :: MonadIO m => UserInfo a -> m a
getUserInfo (Right i) = return i
getUserInfo (Left e) = liftIO e
type FileMatcherMap a = M.Map UUID (FileMatcher a)
type MkLimit a = String -> Either String (MatchFiles a)
type AssumeNotPresent = S.Set UUID
data MatchFiles a = MatchFiles
{ matchAction :: AssumeNotPresent -> MatchInfo -> a Bool
, matchNeedsFileName :: Bool
-- ^ does the matchAction need a filename in order to match?
, matchNeedsFileContent :: Bool
-- ^ does the matchAction need the file content to be present in
-- order to succeed?
, matchNeedsKey :: Bool
-- ^ does the matchAction look at information about the key?
, matchNeedsLocationLog :: Bool
-- ^ does the matchAction look at the location log?
}
type FileMatcher a = Matcher (MatchFiles a)
-- This is a matcher that can have tokens added to it while it's being
-- built, and once complete is compiled to an unchangable matcher.
data ExpandableMatcher a
= BuildingMatcher [Token (MatchFiles a)]
| CompleteMatcher (Matcher (MatchFiles a))