huskies: merge 836
This commit is contained in:
@@ -0,0 +1,56 @@
|
||||
//! Read/write helpers for the five LWW-map CRDT collections:
|
||||
//! `tokens`, `merge_jobs`, `active_agents`, `test_jobs`, and `agent_throttle`.
|
||||
//!
|
||||
//! Each collection is backed by a `ListCrdt` with a primary-key field.
|
||||
//! A secondary index in [`super::state::CrdtState`] provides O(1) lookup by
|
||||
//! key. The write functions follow the same insert-or-update pattern used by
|
||||
//! [`super::presence`] for the `nodes` collection.
|
||||
|
||||
#![allow(dead_code)]
|
||||
|
||||
use bft_json_crdt::json_crdt::CrdtNode;
|
||||
use bft_json_crdt::list_crdt::ListCrdt;
|
||||
use bft_json_crdt::op::OpId;
|
||||
|
||||
mod active_agents;
|
||||
mod agent_throttle;
|
||||
mod gateway_projects;
|
||||
mod merge_jobs;
|
||||
mod test_jobs;
|
||||
mod tokens;
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests;
|
||||
|
||||
pub use active_agents::{
|
||||
delete_active_agent, read_active_agent, read_all_active_agents, write_active_agent,
|
||||
};
|
||||
pub use agent_throttle::{
|
||||
delete_agent_throttle, read_agent_throttle, read_all_agent_throttles, write_agent_throttle,
|
||||
};
|
||||
pub use gateway_projects::{
|
||||
delete_gateway_project, read_all_gateway_projects, read_gateway_project, write_gateway_project,
|
||||
};
|
||||
pub use merge_jobs::{delete_merge_job, read_all_merge_jobs, read_merge_job, write_merge_job};
|
||||
pub use test_jobs::{delete_test_job, read_all_test_jobs, read_test_job, write_test_job};
|
||||
pub use tokens::{delete_token_usage, read_all_token_usage, read_token_usage, write_token_usage};
|
||||
|
||||
/// Return the `OpId` of the entry at iter-position `idx`, consistent with
|
||||
/// `ListCrdt::iter()` and the `[]` index operator.
|
||||
///
|
||||
/// The built-in `id_at` counts non-deleted entries including the root sentinel
|
||||
/// (which has `content = None`), causing an off-by-one mismatch with
|
||||
/// `iter().enumerate()`. This helper requires `content.is_some()` so that the
|
||||
/// secondary-index position maps correctly to an OpId.
|
||||
pub(super) fn list_id_at<T: CrdtNode>(list: &ListCrdt<T>, idx: usize) -> Option<OpId> {
|
||||
let mut i = 0;
|
||||
for op in &list.ops {
|
||||
if !op.is_deleted && op.content.is_some() {
|
||||
if i == idx {
|
||||
return Some(op.id);
|
||||
}
|
||||
i += 1;
|
||||
}
|
||||
}
|
||||
None
|
||||
}
|
||||
Reference in New Issue
Block a user