# Quick start

Make sure that autotools, libtool, pkg-config and libuv are installed on your system.

On a Debian (or derivative) systems you can do that with:

    sudo apt-get install build-essential libtool pkg-config libuv1-dev

Then run:

    autoreconf -i
    ./configure
    make
    sudo make install

Then create a `main.c` file with this simple test program that just runs a single raft server and implements a basic state machine for incrementing a counter:

    #include <raft.h>
    #include <raft/uv.h>

    static raft_id id = 12345;
    static const char *address = "127.0.0.1:8080";
    static const char *dir = "/tmp/raft-quick-start";
    static struct raft_configuration conf;
    static struct uv_loop_s loop;
    static struct uv_raft_s raft;
    static struct uv_timer_s timer;
    static unsigned counter = 0;
    static uint64_t command;

    static void timerCb(uv_timer_t *timer) {
        struct raft_buffer buf;
        command = uv_now(timer->loop) % 10;
        buf.len = sizeof command;
        buf.base = &command;
        uv_raft_submit(&raft, RAFT_COMMAND, &buf);
    }

    static void commitCb(struct uv_raft_s *raft, int type, const struct uv_buf_s *buf) {
        counter += *(uint64_t *)buf->base;
        printf("counter: %u\n", counter);
        return 0;
    }

    int main() {
        mkdir(dir, 0755);
        raft_configuration_init(&conf);
        raft_configuration_add(&conf, id, address, RAFT_VOTER);
        uv_loop_init(&loop);
        uv_raft_init(&loop, &raft, id, address, dir);
        uv_timer_init(&loop, &timer);
        uv_raft_bootstrap(&raft, &conf);
        uv_raft_start(&raft, commitCb, NULL, NULL);
        uv_timer_start(&timer, timerCb, 0, 1000);
        uv_run(&loop, UV_RUN_DEFAULT);
    }

You can compile and run it with:

    cc main.c -o main -lraft -luv && ./main