Crates.io | memtable |
lib.rs | memtable |
version | 0.2.0 |
source | src |
created_at | 2021-06-27 09:15:33.178605 |
updated_at | 2021-07-04 00:32:58.926476 |
description | Inmemory tables for use in Rust |
homepage | https://github.com/chipsenkbeil/memtable-rs |
repository | https://github.com/chipsenkbeil/memtable-rs |
max_upload_size | |
id | 415401 |
size | 32,014 |
memtable provides a collection of table-oriented features for use inmemory.
This crate acts as the aggregator of all subcrates such as memtable-core
and memtable-macros
and should be the only crate imported when using
features from either.
At its core, you can import the dependency by adding the following to your
Cargo.toml
:
[dependencies]
memtable = "0.2"
In the situation where you would like to derive typed tables based on
user-defined structs, you can include the macros
feature:
[dependencies]
memtable = { version = "0.2", features = ["macros"] }
Additionally, this library has support for no_std
, both with and without
inclusion of alloc
. This is done by turning off default features (std
is
the only default feature). From there, if you would like to include alloc
support, then add that feature:
[dependencies]
# For no_std without alloc support
memtable = { version = "0.2", default-features = false }
# For no_std with alloc support
memtable = { version = "0.2", default-features = false, features = ["alloc"] }
Please keep in mind that relying only on the core
made available by default
will limit your table options to FixedTable
. You are also still able to use
the macros
feature to derive typed tables, but you must explicitly set the
mode to fixed
.
Most often, you will want to import the prelude
to bring in relevant
traits and structs:
use memtable::prelude::*;
// Create a 2x3 (row x column) table of integers
let mut table = FixedTable::from([
[1, 2, 3],
[4, 5, 6],
]);
// Examine one of the values, replace it, and examine again
assert_eq!(table[(1, 2)], 6);
table[(1, 2)] = 999;
assert_eq!(table[(1, 2)], 999);
In the core library, you will find four primary tables:
DynamicTable
: table with a dynamic capacity for rows & columnsFixedTable
: table with a fixed capacity for rows & columnsFixedRowTable
: table with a fixed capacity for rows & dynamic capacity for columnsFixedColumnTable
: table with a dynamic capacity for rows & fixed capacity for columnsTable
: primary trait that exposes majority of common operations
to perform on tablesCellIter
: common trait that table iterators focused on
individual cells that enables zipping with a cell's
position and getting the current row & column of
the iteratorAlongside the essentials, the library also provides several features that provide extensions to the table arsenal:
no_std
is in effectFromCsv
(convert CSV into an inmemory table) and ToCsv
(convert an inmemory table to CSV)Cell2
and more up to Cell26
, which represent generic
enums that can be used as the data type for a table to enable multiple
data types within a table (e.g. DynamicTable<Cell2<String, bool>>
)Table
macro to derive new struct that implements the
Table
trait to be able to store some struct into a dedicated, inmemory tableSledTable
, which provides persistent storage on top of
other tables via the sled databaseno_std
is enabledCurrently, there is a singular macro, Table
, which is used to
derive a table to contain zero or more of a specific struct.
use memtable::Table;
#[derive(Table)]
struct User {
name: &'static str,
age: u8,
}
// Derives a new struct, User{Table}, that can contain instances of User
// that are broken up into their individual fields
let mut table = UserTable::new();
// Inserting is straightforward as a User is considered a singular row
table.push_row(User {
name: "Fred Flintstone",
age: 51,
});
// You can also pass in a tuple of the fields in order of declaration
table.push_row(("Wilma Flintstone", 47));
// Retrieval by row will provide the fields by ref as a tuple
let (name, age) = table.row(0).unwrap();
assert_eq!(*name, "Fred Flintstone");
assert_eq!(*age, 51);
// Tables of course provide a variety of other methods to inspect data
let mut names = table.name_column();
assert_eq!(names.next(), Some(&"Fred Flintstone"));
assert_eq!(names.next(), Some(&"Wilma Flintstone"));
assert_eq!(names.next(), None);