macrodb 0.1.1

Macro-generated in-memory relational database for Rust
Documentation
use macrodb::table;
use std::collections::*;

type UserId = u64;
type GroupId = u64;

#[derive(Clone)]
pub struct User {
    id: UserId,
    name: String,
    group: GroupId,
}

#[derive(Clone)]
pub struct Group {
    id: GroupId,
    name: String,
}

pub enum Error {
    UserNotFound,
    UserIdExists,
    UserNameExists,
    GroupNotFound,
    GroupIdExists,
    GroupNameExists,
    GroupHasUsers,
}

#[derive(Default)]
pub struct Database {
    users: BTreeMap<UserId, User>,
    user_by_name: HashMap<String, UserId>,
    groups: BTreeMap<GroupId, Group>,
    group_by_name: HashMap<String, GroupId>,
    users_by_group: BTreeMap<GroupId, BTreeSet<UserId>>,
}

impl Database {
    table!(
        users: User,
        id: UserId,
        missing Error => Error::UserNotFound,
        primary users id => Error::UserIdExists,
        foreign groups group => Error::GroupNotFound,
        index users_by_group group => (),
        unique user_by_name name => Error::UserNameExists
    );
    table!(
        groups: Group,
        id: GroupId,
        missing Error => Error::GroupNotFound,
        primary groups id => Error::GroupIdExists,
        unique group_by_name name => Error::GroupNameExists,
        reverse users_by_group id => Error::GroupHasUsers
    );
}

fn main() {
    let database = Database::default();
}