Skip to content

Megaparsec parser of CSV files that plays nicely with Cassava

License

Notifications You must be signed in to change notification settings

stackbuilders/cassava-megaparsec

Repository files navigation

Cassava Megaparsec

All Contributors

License MIT Hackage Stackage Nightly Stackage LTS Build Status

The package provides alternative parser for the Cassava package written with Megaparsec so you can get better error messages at expense of some speed.

Quick start

The package works seamlessly with Cassava by replacing the following functions:

  • decode
  • decodeWith
  • decodeByName
  • decodeByNameWith

The functions work just the same as Cassava's equivalents, but also take name of file they parse (to include into error messages) and return typed high-quality error messages produced by Megaparsec.

The import section typically looks like this:

import Data.Csv hiding (decode, decodeWith, decodeByName, decodeByNameWith)
import Data.Csv.Parser.Megaparsec (decode, decodeWith, decodeByName, decodeByNameWith)

Next you call appropriate function and get either result of parsing identical to that of Cassava or error message. The error message is well-typed so you can examine it in Haskell code easily. Conversion error are considered parsing errors by the cassava-megaparsec package and are reported via custom error message component Cec supported by Megaparsec 5. Since Cassava's conversion errors are plain strings, we have no choice but to represent them as strings too:

-- | Custom error component for CSV parsing. It allows typed reporting of
-- conversion errors.

data Cec
  = CecFail String
  | CecIndentation Ordering Pos Pos
  | CecConversionError String
  deriving (Eq, Data, Typeable, Ord, Read, Show)

To pretty print a error message use the parseErrorPretty function from Text.Megaparsec.

This should be enough to start using the package, please consult Haddocks for detailed per-function documentation.

Example

To check an example using cassava-megaparsec check the code in the example directory.

Given the following type:

data Test = Test {a :: Char, b :: Char, c :: Char} deriving (Eq, Show, Generic)

And, the following csv file:

a,ba,c

We get the following error:

example.csv:1:7:
  |
1 | a,ba,c
  |       ^
conversion error: expected Char, got "ba"

Contributors ✨

Thanks goes to these wonderful people (emoji key):

Mark Karpov
Mark Karpov

💻
William R. Arellano
William R. Arellano

💻
Cristhian Motoche
Cristhian Motoche

💻
Andrés Martínez
Andrés Martínez

💻
ˌbodʲɪˈɡrʲim
ˌbodʲɪˈɡrʲim

💻
Felix Yan
Felix Yan

💻
Jorge Guerra Landázuri
Jorge Guerra Landázuri

💻
Justin S. Leitgeb
Justin S. Leitgeb

💻

This project follows the all-contributors specification. Contributions of any kind welcome!

License

MIT, see the LICENSE file.

Contributing

Do you want to contribute to this project? Please take a look at our contributing guideline to know how you can help us build it.


Stack Builders
Check out our libraries | Join our team