module Parser where
-- i think this whole file can be replaced
-- with about 12 characters of code less than
-- a line with a regular expression
-- the benefit of a parser's error messages
-- we never use because, interpreting parser combinator
-- error messages is not useful as the error
-- messages are why it can't continue not why
-- it doesnt end parsing
import Data.List (intercalate)
import qualified Data.Text.Lazy as TL (Text, unpack)
import Data.Void (Void)
import Text.Megaparsec (Parsec, runParser, some, (<|>))
import Text.Megaparsec.Byte (space, string)
import Text.Megaparsec.Char as C (char, letterChar, space)
import qualified Text.Megaparsec.Char.Lexer as CL
import TextShow (showtl)
--import Db
-- parser for full name, the underscore
-- is to handle the edge case of a single name, full name
type ParserStr = Parsec Void String
preLexeme, lexeme :: ParserStr a -> ParserStr a
lexeme = CL.lexeme C.space
preLexeme = (*>) C.space
nameOrUnderscore', fullName :: ParserStr String
nameOrUnderscore' = some letterChar <|> (fmap pure . char $ '_')
fullName = do
firstName <- preLexeme nameOrUnderscore'
restNames <- lexeme . some . preLexeme $ nameOrUnderscore'
pure . intercalate " " $ firstName : restNames
parseFullName content = showtl <$> (runParser fullName "" (TL.unpack content))