aboutsummaryrefslogtreecommitdiff
path: root/src/BirthdateParser.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/BirthdateParser.hs')
-rw-r--r--src/BirthdateParser.hs57
1 files changed, 57 insertions, 0 deletions
diff --git a/src/BirthdateParser.hs b/src/BirthdateParser.hs
new file mode 100644
index 0000000..1e4051b
--- /dev/null
+++ b/src/BirthdateParser.hs
@@ -0,0 +1,57 @@
+module BirthdateParser
+ ( parseBirthdates
+ ) where
+
+import Control.Arrow (left)
+
+import Data.Text (Text)
+import qualified Data.Text as T
+
+import Text.ParserCombinators.Parsec
+
+import Birthdate
+import Date
+
+parseBirthdates :: Text -> Either Text [Birthdate]
+parseBirthdates input =
+ left
+ (T.pack . show)
+ (parse birthdatesParser "" (T.unpack input))
+
+birthdatesParser :: Parser [Birthdate]
+birthdatesParser = many (many newline >> birthdateParser <* many newline)
+
+birthdateParser :: Parser Birthdate
+birthdateParser =
+ Birthdate <$>
+ dateParser <* spaces <* char ',' <*>
+ valueParser <* char ',' <*>
+ valueParser
+
+valueParser :: Parser Text
+valueParser = T.strip . T.pack <$> many (noneOf ",\n")
+
+dateParser :: Parser Date
+dateParser =
+ Date <$>
+ integerParser <* spaces <*>
+ monthParser <* spaces <*>
+ integerParser
+
+integerParser :: Parser Int
+integerParser = (read :: String -> Int) <$> many1 digit
+
+monthParser :: Parser Int
+monthParser =
+ (try $ string "Janvier" >> return 1)
+ <|> (try $ string "Février" >> return 2)
+ <|> (try $ string "Mars" >> return 3)
+ <|> (try $ string "Avril" >> return 4)
+ <|> (try $ string "Mai" >> return 5)
+ <|> (try $ string "Juin" >> return 6)
+ <|> (try $ string "Juillet" >> return 7)
+ <|> (try $ string "Août" >> return 8)
+ <|> (try $ string "Septembre" >> return 9)
+ <|> (try $ string "Octobre" >> return 10)
+ <|> (try $ string "Novembre" >> return 11)
+ <|> (try $ string "Décembre" >> return 12)