summaryrefslogtreecommitdiff
path: root/src/Propellor/Types
diff options
context:
space:
mode:
authorJoey Hess2016-03-17 12:20:17 -0400
committerJoey Hess2016-03-17 12:20:17 -0400
commit761d06c789733cbeb9dc1f966c48417e54b055c4 (patch)
tree6a29d1f9648929275e4b5f73147f93b93acb1f5b /src/Propellor/Types
parent86f3373dc429bd16f0153787eaa45049e44c6bb0 (diff)
add OuterTarget
Separate data type to guarantee that ensureProperty is passed the actual outer target, and not some other Targeting value from eg, unixLike.
Diffstat (limited to 'src/Propellor/Types')
-rw-r--r--src/Propellor/Types/Target.hs41
1 files changed, 27 insertions, 14 deletions
diff --git a/src/Propellor/Types/Target.hs b/src/Propellor/Types/Target.hs
index 40b3891e..e4d8c9c1 100644
--- a/src/Propellor/Types/Target.hs
+++ b/src/Propellor/Types/Target.hs
@@ -3,6 +3,11 @@
module Propellor.Types.Target (
Target(..),
Targeting(..),
+ mkProperty,
+ mkProperty',
+ OuterTarget,
+ ensureProperty,
+ orProperty,
target,
UnixLike,
unixLike,
@@ -14,8 +19,6 @@ module Propellor.Types.Target (
freeBSD,
unionTargets,
intersectTarget,
- orProperty,
- ensureProperty,
) where
import Network.BSD (HostName)
@@ -25,8 +28,22 @@ import Data.List
data Property target = Property target (IO ())
-mkProperty :: IO () -> Property UnixLike
-mkProperty a = Property unixLike a
+mkProperty :: Targeting targets -> IO () -> Property (Targeting targets)
+mkProperty target a = Property target a
+
+mkProperty' :: Targeting targets -> (OuterTarget targets -> IO ()) -> Property (Targeting targets)
+mkProperty' target@(Targeting l) a = Property target (a (OuterTarget l))
+
+data OuterTarget (targets :: [Target]) = OuterTarget [Target]
+
+-- | Use `mkProperty'` to get the `OuterTarget`. Only properties whose
+-- targets are a superset of the outer targets can be ensured.
+ensureProperty
+ :: ((innertargets `NotSupersetTargets` outertargets) ~ CanCombineTargets)
+ => OuterTarget outertargets
+ -> Property (Targeting innertargets)
+ -> IO ()
+ensureProperty outertarget (Property innertarget a) = a
-- | Changes the target of a property.
--
@@ -61,15 +78,19 @@ orProperty a@(Property ta ioa) b@(Property tb iob) =
-- ensureProperty supportedos jail
-- where supportedos = unionTargets debian freeBSD
+foo :: Property (Targeting '[OSFreeBSD])
+foo = mkProperty' freeBSD $ \t -> do
+ ensureProperty t jail
+
--bar :: Property (Targeting '[OSDebian, OSFreeBSD])
bar = aptinstall `orProperty` jail
aptinstall :: Property DebianOnly
-aptinstall = target debian $ mkProperty $ do
+aptinstall = mkProperty debian $ do
return ()
jail :: Property FreeBSDOnly
-jail = target freeBSD $ mkProperty $ do
+jail = mkProperty freeBSD $ do
return ()
----- END DEMO ----------
@@ -104,14 +125,6 @@ freeBSD = targeting OSFreeBSD
targeting :: Target -> Targeting os
targeting o = Targeting [o]
--- The outertarget parameter needs to be passed in from the outer property.
-ensureProperty
- :: ((innertarget `NotSupersetTargets` outertarget) ~ CanCombineTargets)
- => Targeting outertarget
- -> Property (Targeting innertarget)
- -> IO ()
-ensureProperty outertarget (Property inneros a) = a
-
-- | The union of two lists of Targets.
unionTargets
:: Targeting l1