import Test.Tasty ( TestTree, testGroup )
import Test.Tasty.HUnit ( (@?=), testCase )
import Text.Parsec (
- (<|>),
char,
choice,
- digit,
many1,
- option,
optionMaybe,
parse,
sepBy1,
- space,
- try,
- unexpected )
+ space )
import Text.Parsec.String ( Parser )
-import Text.Read ( readMaybe )
import Network.DNS.RBL.Host ( Host, host )
import Network.DNS.RBL.IPv4Pattern ( IPv4Pattern, v4pattern )
+import Network.DNS.RBL.Weight ( Weight, weight )
import Network.DNS.RBL.Pretty ( Pretty(..) )
-newtype Weight = Weight Int deriving (Eq, Show)
-
-instance Pretty Weight where
- pretty_show (Weight w) = show w
-
-
--- | Parse the weight multiplier at the end of a site.
---
--- ==== _Examples_
---
--- >>> import Text.Parsec ( parseTest )
---
--- Negative, zero, and positive integers are all supported:
---
--- >>> parseTest weight "*-5"
--- Weight (-5)
---
--- >>> parseTest weight "*0"
--- Weight 0
---
--- >>> parseTest weight "*17"
--- Weight 17
---
--- If the weight is empty, it defaults to @1@:
---
--- >>> parseTest weight ""
--- Weight 1
---
--- The default is used whenever parsing fails:
---
--- >>> parseTest weight "*hello"
--- Weight 1
---
--- The 'Pretty' instance works as intended:
---
--- >>> import Text.Parsec ( parse )
--- >>> pretty_print $ parse weight "" "*3"
--- 3
---
-weight :: Parser Weight
-weight = try parse_weight <|> return (Weight 1)
- where
- parse_weight = do
- _ <- char '*'
- sign <- (char '-') <|> (option '+' (char '+'))
- w <- many1 digit
- case ( readMaybe w :: Maybe Int ) of
- -- If "many1 digit" gives us a list of digits, we should be able
- -- to convert that to an Int! It will overflow rather than fail
- -- if the input is too big/small, so it should really always
- -- succeed.
- Nothing -> unexpected "weight: readMaybe failed on a sequence of digits!"
- Just k -> return $ Weight (if sign == '-' then negate k else k)
-
-
-
-- | A DNSBL as it would be input into postfix. It has a blacklist
-- (DNS) name, a pattern of addresses to use for a \"hit\", and a
-- weight multiplier.