.. | ||
src | ||
.gitignore | ||
automerge.c | ||
build.rs | ||
Cargo.toml | ||
cbindgen.toml | ||
Makefile | ||
README.md |
Methods we need to support
Basic management
doc = create()
doc = clone(doc)
free(doc)
set_actor(doc, actor)
actor = get_actor(doc)
Transactions
pending_ops(doc)
commit(doc, message, time)
rollback(doc)
Write
set(doc, obj, prop, value)
insert(doc, obj, index, value)
push(doc, obj, value)
del(doc, obj, prop)
inc(doc, obj, prop, value)
splice_text(doc, obj, start, num_del, text)
Read
keys(doc, obj)
keys_at(doc, obj, heads)
length(doc, obj)
length_at(doc, obj, heads)
// value(doc, obj)
// value_at(doc, obj, heads)
values(doc, obj)
values_at(doc, obj, heads)
text(doc, obj)
text_at(doc, obj, heads)
Sync
message = generate_sync_message(doc, state)
receive_sync_message(doc, state, message)
state = init_sync_state()
Save / Load
data = save(doc)
doc = load(data)
data = save_incremental(doc)
load_incremental(doc, data)
Low Level Access
apply_changes(doc, changes)
changes = get_changes(doc, deps)
changes = get_changes_added(doc1, doc2)
heads = get_heads(doc)
change = get_last_local_change(doc)
deps = get_missing_deps(doc, heads)
Encode/Decode
encode_change(change)
decode_change(change)
encode_sync_message(change)
decode_sync_message(change)
encode_sync_state(change)
decode_sync_state(change)
Open Question - Memory management
Most of these calls return one or more items of arbitrary length. Doing memory management in C is tricky. This is my proposed solution...
// returns 1 or zero opids
n = automerge_set(doc, "_root", "hello", datatype, value);
if (n) {
automerge_pop(doc, &obj, len);
}
// returns n values
n = automerge_values(doc, "_root", "hello");
for (i = 0; i<n ;i ++) {
automerge_pop_value(doc, &value, &datatype, len);
}
There would be one pop method per object type. Users allocs and frees the buffers. Multiple return values would result in multiple pops. Too small buffers would error and allow retry.
Formats
Actors - We could do (bytes,len) or a hex encoded string?.
ObjIds - We could do flat bytes of the ExId struct but lets do human readable strings for now - the struct would be faster but opque
Heads - Might as well make it a flat buffer (n, hash, hash, ...)
Changes - Put them all in a flat concatenated buffer
Encode/Decode - to json strings?