module Propellor.Types.PartSpec where
import Propellor.Base
import Propellor.Property.Parted.Types
import Propellor.Property.Mount
import Propellor.Property.Partition
type PartSpec t = (Maybe MountPoint, MountOpts, PartSize -> Partition, t)
partition :: Monoid t => Fs -> PartSpec t
partition fs = (Nothing, mempty, mkPartition fs, mempty)
swapPartition :: Monoid t => PartSize -> PartSpec t
swapPartition sz = (Nothing, mempty, const (mkPartition LinuxSwap sz), mempty)
mountedAt :: PartSpec t -> FilePath -> PartSpec t
mountedAt (_, o, p, t) mp = (Just mp, o, p, t)
setSize :: PartSpec t -> PartSize -> PartSpec t
setSize (mp, o, p, t) sz = (mp, o, const (p sz), t)
mountOpt :: ToMountOpts o => PartSpec t -> o -> PartSpec t
mountOpt (mp, o, p, t) o' = (mp, o <> toMountOpts o', p, t)
errorReadonly :: MountOpts
errorReadonly = toMountOpts "errors=remount-ro"
reservedSpacePercentage :: PartSpec t -> Int -> PartSpec t
reservedSpacePercentage s percent = adjustp s $ \p ->
p { partMkFsOpts = ("-m"):show percent:partMkFsOpts p }
setFlag :: PartSpec t -> PartFlag -> PartSpec t
setFlag s f = adjustp s $ \p -> p { partFlags = (f, True):partFlags p }
extended :: PartSpec t -> PartSpec t
extended s = adjustp s $ \p -> p { partType = Extended }
adjustp :: PartSpec t -> (Partition -> Partition) -> PartSpec t
adjustp (mp, o, p, t) f = (mp, o, f . p, t)
adjustt :: PartSpec t -> (t -> t) -> PartSpec t
adjustt (mp, o, p, t) f = (mp, o, p, f t)
defSz :: PartSize
defSz = MegaBytes 128