module Parse where

import Data.List.Split (splitOn)

import Parse.Internal.Parse

-- |Parse @str@ according to the @format@, and return a tuple of parsed fields. It can fail with an
-- error. Parsable fields in the format string are denoted with @"{}"@, and they will match anything
parse :: ParseTuple a => String -> String -> a
parse :: String -> String -> a
parse String
format String
str =
  case String -> String -> Either String a
forall a. ParseTuple a => String -> String -> Either String a
parseTuple String
format String
str of
    Left String
err -> String -> a
forall a. HasCallStack => String -> a
error String
err
    Right a
x  -> a
x

-- |Safe variant of @parse@ which returns a @Maybe@ monad instead of failing with an error.
parseMaybe :: ParseTuple a => String -> String -> Maybe a
parseMaybe :: String -> String -> Maybe a
parseMaybe String
format String
str =
  case String -> String -> Either String a
forall a. ParseTuple a => String -> String -> Either String a
parseTuple String
format String
str of
    Left String
_  -> Maybe a
forall a. Maybe a
Nothing
    Right a
x -> a -> Maybe a
forall a. a -> Maybe a
Just a
x

-- |Safe variant of @parse@ which returns an @Either@ monad instead of failing with an error. The
-- @Left@ (error) constructor carries a @String@ that contains information about the error.
parseEither :: ParseTuple a => String -> String -> Either String a
parseEither :: String -> String -> Either String a
parseEither = String -> String -> Either String a
forall a. ParseTuple a => String -> String -> Either String a
parseTuple

-- |Parse @str@ according to the @format@, and return a list of parsed fields. It can fail with an
-- error. Parsable fields in the format string are denoted with @"{}"@, and they will match anything
-- until the next block of the format string matches something in @str@.
parseList :: String -> String -> [String]
parseList :: String -> String -> [String]
parseList String
format String
str =
  case String -> String -> Either String [String]
parseListEither String
format String
str of
    Left String
err -> String -> [String]
forall a. HasCallStack => String -> a
error String
err
    Right [String]
x  -> [String]
x

-- |Safe variant of @parseList@ which returns a @Maybe@ monad instead of failing with an error.
parseListMaybe :: String -> String -> Maybe [String]
parseListMaybe :: String -> String -> Maybe [String]
parseListMaybe String
format String
str =
  case String -> String -> Either String [String]
parseListEither String
format String
str of
    Left String
_  -> Maybe [String]
forall a. Maybe a
Nothing
    Right [String]
x -> [String] -> Maybe [String]
forall a. a -> Maybe a
Just [String]
x

-- |Safe variant of @parseList@ which returns an @Either@ monad instead of failing with an
-- error. The @Left@ (error) constructor carries a @String@ that contains information about the
-- error.
parseListEither :: String -> String -> Either String [String]
parseListEither :: String -> String -> Either String [String]
parseListEither String
format = [String] -> String -> Either String [String]
parseParts (String -> String -> [String]
forall a. Eq a => [a] -> [a] -> [[a]]
splitOn String
"{}" String
format)