]> gitweb.michael.orlitzky.com - hath.git/blobdiff - src/Maskbits.hs
Switch from test-framework to tasty.
[hath.git] / src / Maskbits.hs
index cb4ab8986b2bcd343540baa56dbda4a11e7d9dc6..27fa29fa2934e146f1d6ba848453bfacd0c7bfc7 100644 (file)
-module Maskbits
-( Maskbits(..),
-  maskbits_from_string
-) where
+module Maskbits(
+  Maskbits(..) )
+where
 
--- A type representing the number of bits in a CIDR netmask.
-data Maskbits = None | Maskbits Int
-              deriving (Eq, Show)
+import Test.Tasty.QuickCheck ( Arbitrary(..), elements )
 
 
--- There are only 32 bits in an IPv4 address, so there
--- can't be more bits than that in the mask.
-maskbits_from_int :: Int -> Maskbits
-maskbits_from_int x | (x < 0) || (x > 32) = None
-                    | otherwise = Maskbits x
+-- | A type representing the number of bits in a CIDR netmask.
+data Maskbits =
+    Zero
+  | One
+  | Two
+  | Three
+  | Four
+  | Five
+  | Six
+  | Seven
+  | Eight
+  | Nine
+  | Ten
+  | Eleven
+  | Twelve
+  | Thirteen
+  | Fourteen
+  | Fifteen
+  | Sixteen
+  | Seventeen
+  | Eighteen
+  | Nineteen
+  | Twenty
+  | TwentyOne
+  | TwentyTwo
+  | TwentyThree
+  | TwentyFour
+  | TwentyFive
+  | TwentySix
+  | TwentySeven
+  | TwentyEight
+  | TwentyNine
+  | Thirty
+  | ThirtyOne
+  | ThirtyTwo
+    deriving (Enum, Eq, Ord)
 
 
-maskbits_from_string :: String -> Maskbits
-maskbits_from_string s =
+instance Show Maskbits where
+  show Zero        = "0"
+  show One         = "1"
+  show Two         = "2"
+  show Three       = "3"
+  show Four        = "4"
+  show Five        = "5"
+  show Six         = "6"
+  show Seven       = "7"
+  show Eight       = "8"
+  show Nine        = "9"
+  show Ten         = "10"
+  show Eleven      = "11"
+  show Twelve      = "12"
+  show Thirteen    = "13"
+  show Fourteen    = "14"
+  show Fifteen     = "15"
+  show Sixteen     = "16"
+  show Seventeen   = "17"
+  show Eighteen    = "18"
+  show Nineteen    = "19"
+  show Twenty      = "20"
+  show TwentyOne   = "21"
+  show TwentyTwo   = "22"
+  show TwentyThree = "23"
+  show TwentyFour  = "24"
+  show TwentyFive  = "25"
+  show TwentySix   = "26"
+  show TwentySeven = "27"
+  show TwentyEight = "28"
+  show TwentyNine  = "29"
+  show Thirty      = "30"
+  show ThirtyOne   = "31"
+  show ThirtyTwo   = "32"
+
+
+instance Arbitrary Maskbits where
+  arbitrary =
+    elements [ Zero,
+               One,
+               Two,
+               Three,
+               Four,
+               Five,
+               Six,
+               Seven,
+               Eight,
+               Nine,
+               Ten,
+               Eleven,
+               Twelve,
+               Thirteen,
+               Fourteen,
+               Fifteen,
+               Sixteen,
+               Seventeen,
+               Eighteen,
+               Nineteen,
+               Twenty,
+               TwentyOne,
+               TwentyTwo,
+               TwentyThree,
+               TwentyFour,
+               TwentyFive,
+               TwentySix,
+               TwentySeven,
+               TwentyEight,
+               TwentyNine,
+               Thirty,
+               ThirtyOne,
+               ThirtyTwo ]
+
+
+instance Read Maskbits where
+  readsPrec _ s =
     case (reads s :: [(Int, String)]) of
-      []   -> None
-      x:_ -> maskbits_from_int (fst x)
+      []              -> []
+      (x,leftover):_  -> go x leftover
+    where
+      go :: Int -> String -> [(Maskbits, String)]
+      go x' leftover'
+        | x' < minBound || x' > maxBound = []
+        | otherwise = [(toEnum x', leftover')]