module Network.AWS.Machines.Filters where
import Lawless
import Data.Map.Strict (Map)
import qualified Data.Map.Strict as M
import Data.Set (Set)
import qualified Data.Set as S
import Text hiding (text)
import Network.AWS.EC2
import Data.Word
import Numeric
import Textual
newtype Filters = Filters {unFilters ∷ Map Text (Set Text)}
deriving (Eq, Ord, Show)
filters ∷ Getter Filters [Filter]
filters =
to
$ ifoldMap
(\k v → [filter' k & fValues <>~ toListOf folded v]) ∘ unFilters
instance Monoid Filters where
mempty = Filters M.empty
a `mappend` b =
Filters $ M.unionWith S.union (unFilters a) (unFilters b)
class IsFilter a where
toFilters ∷ Getter a Filters
toFilters =
let
f a =
Filters
$ M.singleton
(a ^. name)
(a ^. values)
in
to f
name ∷ Getter a Text
values ∷ Getter a (Set Text)
newtype OwnerId = OwnerId {unOwnerId ∷ Word64} deriving (Eq, Ord, Show)
newtype Name = Name {unName ∷ Text} deriving (Eq, Ord, Show)
data EC2Tag = EC2Tag {
_ectName ∷ Text,
_ectValues ∷ Set Text
} deriving (Eq, Ord, Show)
makeLenses ''EC2Tag
ec2Tag ∷ Text → EC2Tag
ec2Tag = flip EC2Tag mempty
instance Printable OwnerId where
print o =
let
s oid = showInt oid ""
n oid = 12 lengthOf traversed (s oid)
p oid = '0' ^.. repeated ^.. taking (n oid) traversed
v (OwnerId oid) = (p oid ++ s oid)
in
print $ v o
instance Printable EC2Tag where
print (EC2Tag {..}) =
let
n = fsep ":" [text "tag", text _ectName]
vs = fsep "," $ foldMapOf folded (flip (:) [] ∘ text) _ectValues
in
fsep (char '=') [n, vs]
instance IsFilter EC2Tag where
name = to $ (\t → buildText $ text "tag:" <> text (t ^. ectName))
values = to $ (view ectValues)
instance IsFilter ArchitectureValues where
name = to $ const "architecture"
values = to $
\case
I386 → S.singleton "i386"
X86_64 → S.singleton "x86_64"
instance IsFilter VirtualizationType where
name = to $ const "virtualization-type"
values = to $
\case
HVM → S.singleton "hvm"
Paravirtual → S.singleton "paravirtual"
instance IsFilter OwnerId where
name = to $ const "owner-id"
values =
let
s oid = showInt oid ""
n oid = 12 lengthOf traversed (s oid)
p oid = '0' ^.. repeated ^.. taking (n oid) traversed
v (OwnerId oid) = S.singleton $ (p oid ++ s oid) ^. packed
in
to v
instance IsFilter DeviceType where
name = to $ const "root-device-type"
values = to $
\case
EBS → S.singleton "ebs"
InstanceStore → S.singleton "instance-store"
instance IsFilter Name where
name = to $ const "name"
values = to $ S.singleton ∘ unName