summaryrefslogtreecommitdiff
path: root/TypeInternals.hs
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2010-10-18 02:06:27 -0400
committerGravatar Joey Hess <joey@kitenet.net>2010-10-18 02:06:27 -0400
commitf3dcc8489d7b7f9417f9752987a298976838ce47 (patch)
treedccdaea2a16f6fde8f314c381f54b288c19a8996 /TypeInternals.hs
parent0382d26cdbdc52c1e985cba9667a4d50d0653216 (diff)
gratuitous rename
Diffstat (limited to 'TypeInternals.hs')
-rw-r--r--TypeInternals.hs70
1 files changed, 70 insertions, 0 deletions
diff --git a/TypeInternals.hs b/TypeInternals.hs
new file mode 100644
index 000000000..e8f7cb9e7
--- /dev/null
+++ b/TypeInternals.hs
@@ -0,0 +1,70 @@
+{- git-annex internal data types
+ -
+ - Most things should not need this, using Types and/or Annex instead.
+ -}
+
+module TypeInternals where
+
+import Control.Monad.State (StateT)
+import Data.String.Utils
+
+import qualified GitRepo as Git
+
+-- command-line flags
+data Flag = Force deriving (Eq, Read, Show)
+
+-- git-annex's runtime state type doesn't really belong here,
+-- but it uses Backend, so has to be here to avoid a depends loop.
+data AnnexState = AnnexState {
+ repo :: Git.Repo,
+ backends :: [Backend],
+ supportedBackends :: [Backend],
+ flags :: [Flag]
+} deriving (Show)
+
+-- git-annex's monad
+type Annex = StateT AnnexState IO
+
+-- annexed filenames are mapped through a backend into keys
+type KeyFrag = String
+type BackendName = String
+data Key = Key (BackendName, KeyFrag) deriving (Eq)
+
+-- show a key to convert it to a string; the string includes the
+-- name of the backend to avoid collisions between key strings
+instance Show Key where
+ show (Key (b, k)) = b ++ ":" ++ k
+
+instance Read Key where
+ readsPrec _ s = [((Key (b,k)) ,"")]
+ where
+ l = split ":" s
+ b = l !! 0
+ k = join ":" $ drop 1 l
+
+-- pulls the backend name out
+backendName :: Key -> BackendName
+backendName (Key (b,k)) = b
+
+-- pulls the key fragment out
+keyFrag :: Key -> KeyFrag
+keyFrag (Key (b,k)) = k
+
+-- this structure represents a key-value backend
+data Backend = Backend {
+ -- name of this backend
+ name :: String,
+ -- converts a filename to a key
+ getKey :: FilePath -> Annex (Maybe Key),
+ -- stores a file's contents to a key
+ storeFileKey :: FilePath -> Key -> Annex Bool,
+ -- retrieves a key's contents to a file
+ retrieveKeyFile :: Key -> FilePath -> Annex Bool,
+ -- removes a key
+ removeKey :: Key -> Annex Bool,
+ -- checks if a backend is storing the content of a key
+ hasKey :: Key -> Annex Bool
+}
+
+instance Show Backend where
+ show backend = "Backend { name =\"" ++ (name backend) ++ "\" }"