# cassava-conduit [](https://travis-ci.org/domdere/cassava-conduit) [](https://hackage.haskell.org/package/cassava-conduit)
Conduit interface for cassava package
Streaming to CSV is not 100% complete at this stage, and doesn't support encoding to CSV with a header yet
## Example Usage
### The examples project
There is a project containing some examples of the usage, but the gist is here:
``` Haskell
import Data.Csv
import Data.Conduit
import Data.Csv.Conduit
data InputRecord = ...
instance FromRecord InputRecord where
...
data OutputRecord = ...
instance ToRecord OutputRecord where
...
decodeOpts :: Word8 -> DecodeOptions
encodeOpts :: Word8 -> EncodeOptions
processInput :: InputRecord -> OutputRecord
-- |
-- A Conduit pipeline that streams from '../exampledata/sampleinput.psv', decodes it from a pipe seperated format,
-- processes it with 'processInput' and the encodes it to pipe seperated format and streams it out to '../exampledata/sampleoutput.psv'
-- The first time it encounters a parse error, it will stop streaming and return the error, dropping any decoded records that came through in that batch also...
--
conduitPipeline :: (MonadError CsvParseError m, MonadResource m) => m ()
conduitPipeline = sourceFile "../exampledata/sampleinput.psv" $$ fromCsv (decodeOpts $ fromIntegral $ ord '|') HasHeader =$= map processInput =$= toCsv (encodeOpts $ fromIntegral $ ord '|') =$= sinkFile "../exampledata/sampleoutput.psv"
main :: IO ()
main = do
res <- runEitherT $ bimapEitherT showError id $ runResourceT conduitPipeline
either putStrLn return res
```
#### Building the examples project
```
$ cd examples
$ cabal sandbox init
$ cabal sandbox add-source ../
$ cabal install --only-dependencies
$ cabal build
```
## Building the project
``` Shell
make build
```
## Running Unit Tests
``` Shell
make test
```
## Running Benchmarks
**After** running `cabal configure --enable-benchmarks` and `cabal build`, the following command will run the benchmarks:
cabal bench
For newer versions of `cabal`, `cabal bench` will run a `cabal build` automatically if necessary..