1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
//! Async sink of time-series data based on serde-rs
//!
//! Example
//! --------
//!
//! ```rust
//! extern crate asink;
//! extern crate serde;
//! #[macro_use]
//! extern crate serde_derive;
//!
//! use asink::*;
//! use std::sync::mpsc::Sender;
//!
//! /// This will be serialized into msgpack
//! #[derive(Serialize)]
//! struct Doc {
//!     id: usize,
//!     data: Vec<f64>,
//! }
//!
//! fn experiment(s: Sender<Doc>) {
//!     for i in 0..5 {
//!         let doc = Doc {
//!             id: i,
//!             data: vec![i as f64],
//!         };
//!         s.send(doc).unwrap(); // Send data to sink
//!     }
//! }
//!
//! fn main() {
//!     let sink = msgpack::MsgpackSink::from_str("test.msg");
//!     let (s, th) = sink.run(); // Sink start thread to write recieved data into msgpack
//!     experiment(s);
//!     th.join().unwrap();
//! }
//! ```

extern crate bson;
#[macro_use]
extern crate derive_new;
extern crate mongodb;
extern crate rmp;
extern crate rmp_serde;
extern crate serde;
extern crate serde_json;

use serde::Serialize;
use std::thread::JoinHandle;
use std::sync::mpsc::Sender;

pub mod mongo;
pub mod msgpack;
pub mod json;

/// Sink trait for storing time-series data
pub trait Sink<Document: Send + Serialize> {
    /// Start a thread for sink
    fn run(self) -> (Sender<Document>, JoinHandle<()>);
}