From 016f0e03c50e5b5080c58be6d1ae73918f79076e Mon Sep 17 00:00:00 2001 From: Philippe Pittoli Date: Sun, 23 Jul 2023 22:42:43 +0200 Subject: [PATCH] DomainParser --- src/DomainParser.purs | 91 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 src/DomainParser.purs diff --git a/src/DomainParser.purs b/src/DomainParser.purs new file mode 100644 index 0000000..bf8fd8f --- /dev/null +++ b/src/DomainParser.purs @@ -0,0 +1,91 @@ +-- | `DomainParser` is a simple parser for domain names as described in RFC 1035. +module DomainParser where + +import Prelude (bind, discard, pure, show, ($), (+), (<>), (>), (-)) + +import Control.Alt ((<|>)) +import Control.Lazy (defer) +import Data.Array (many, length, snoc) +import Data.Array.NonEmpty as NonEmpty +import Data.Either (Either(..)) +import Data.Foldable (fold, foldl) +import Data.Maybe (Maybe(..)) +import Data.String as S -- length +import Data.String.CodeUnits as CU +-- import Data.String.Regex as R +-- import Data.String.Regex.Flags as RF +import Data.Tuple (Tuple(..)) +import Parsing +import Parsing.Combinators.Array (many1) +import Parsing.Combinators as PC +import Parsing (Parser, runParser) +import Parsing.String +import Parsing.String.Basic (alphaNum, letter) +import Parsing.String (char, string, eof) + +-- From RFC 1035: ::= | " " +domain :: Parser String String +domain = PC.try (string " ") <|> sub_eof + +sub_eof :: Parser String String +sub_eof = do + sub <- subdomain + -- TODO: non standard (RFC 1035). + PC.option (PC.try $ char '.') + eof + if S.length sub > 255 + then fail $ "domain length is > 255 bytes (" <> show (S.length sub) <> ")" + else pure sub + +-- From RFC 1035: ::=