{-# LANGUAGE TypeFamilies, FlexibleInstances #-}

module Propellor.Types.Container where

import Propellor.Types.Info

-- | A value that can be bound between the host and a container.
--
-- For example, a Bound Port is a Port on the container that is bound to
-- a Port on the host.
data Bound v = Bound
        { hostSide :: v
        , containerSide :: v
        }

-- | Create a Bound value, from two different values for the host and
-- container.
--
-- For example, @Port 8080 -<- Port 80@ means that port 8080 on the host
-- is bound to port 80 from the container.
(-<-) :: (hostv ~ v, containerv ~ v) => hostv -> containerv -> Bound v
(-<-) = Bound

-- | Flipped version of -<- with the container value first and host value
-- second.
(->-) :: (containerv ~ v, hostv ~ v) => containerv -> hostv -> Bound v
(->-) = flip (-<-)

-- | Create a Bound value, that is the same on both the host and container.
same :: v -> Bound v
same v = Bound v v

-- | Capabilities of a container.
data ContainerCapability
        = HostnameContained
        -- ^ The container has its own hostname (and domain name)
        -- separate from the system that contains it.
        | FilesystemContained
        -- ^ The container has its own root filesystem, rather than sharing
        -- the root filesystem of the system that contains it.
        deriving (Typeable, Eq, Read, Show)

-- | A [ContainerCapability] can be used as Info.
-- It does not propagate out to the Host.
-- When not in a container, the Info value will be [].
instance IsInfo [ContainerCapability] where
        propagateInfo _ = PropagateInfo False