pikmin 0.1.7

An extensible downloader for obtaining trade data simultaneously from exchanges' API.
Documentation
# Pikmin

An extensible downloader for obtaining trade data simultaneously from exchanges' API.

[![Build Status](https://travis-ci.org/esplo/pikmin.svg?branch=master)](https://travis-ci.org/esplo/pikmin)
[![crates.io](https://img.shields.io/crates/v/pikmin.svg?style=flat)](https://crates.io/crates/pikmin)
[![Documentation](https://docs.rs/pikmin/badge.svg)](
https://docs.rs/pikmin)
[![codecov](https://codecov.io/gh/esplo/pikmin/branch/master/graph/badge.svg)](https://codecov.io/gh/esplo/pikmin)

`pikmin` is a trade (execution) data downloader for crypto-currency exchanges,
such as BitMex, bitFlyer, Liquid, etc. This library provides not only some pre-composed
downloaders, but also ability to build a custom downloader for users' demand.

## Pre-composed downloaders

Currently, this library has the following downloaders:

* BitMex (specify time, chronologically)
* bitFlyer (specify id, reverse-chronologically)
* Liquid (specify time, chronologically)

## Built-in Writer

`Writer` is a processor between trade data and destination (typically DB).
Pikmin has some built-in writers:

* MySQL
* stdout

You can create your own writer easily.

## Example

A simple downloader for Liquid with writing to stdout.
This program creates `./qn-progress.txt` for recording progress,
so delete it if you want to run again from the starting point.

```rust
use std::path::PathBuf;
use std::thread;
use std::time::Duration;

use chrono::offset::TimeZone;
use chrono::Utc;

use pikmin::downloader::Downloader;
use pikmin::FileRecorder;
use pikmin::LiquidDownloader;
use pikmin::StdOutWriter;

fn main() {
    // by using thread, you can run multiple downloaders
    let liquid = thread::spawn(move || {
        while {
            // download data from 2019-01-01T01:01:01Z to 2019-01-01T01:03:01Z
            // output the downloaded data to standard out (println!)
            let downloader = LiquidDownloader::new(
                Utc.ymd(2019, 1, 1).and_hms(1, 1, 1),
                Utc.ymd(2019, 1, 1).and_hms(1, 3, 1),
            );

            // Locate progress file to `/tmp/qn-progress.txt`.
            // You can control the starting point of downloading
            // by preparing this file before you run.
            let mut recorder = FileRecorder::new(PathBuf::from("/tmp/qn-progress.txt"));

            // write out to standard out. simple writer for debugging
            let mut writer = StdOutWriter::default();

            println!("start QnDownloader");

            // run!
            match downloader.run(&mut writer, &mut recorder) {
                Ok(_) => {
                    println!("finished");
                    false
                }
                Err(e) => {
                    println!("error: {}", e);
                    println!("retry...");
                    thread::sleep(Duration::from_secs(5));
                    true
                }
            }
        } {}
    });

    match liquid
        .join()
        {
            Ok(_) => println!("finish all"),
            Err(_) => println!("threading error"),
        }
}
```

Other examples can be found in `./examples`.

## Future work

- create pre-composed downloaders for other exchanges
- parameterize the direction of downloading (chronologically or not)
- abstraction of the progress writer