diff options
Diffstat (limited to 'src/swarm/members.rs')
| -rw-r--r-- | src/swarm/members.rs | 37 |
1 files changed, 36 insertions, 1 deletions
diff --git a/src/swarm/members.rs b/src/swarm/members.rs index 45c8aeb..e64dd20 100644 --- a/src/swarm/members.rs +++ b/src/swarm/members.rs @@ -9,7 +9,7 @@ //! cancels the record and registers again. use automerge::AutoCommit; -use serde_json::json; +use serde_json::{Value as JsonValue, json}; use tracing::{info, warn}; use crate::document::store::{self, StoreError}; @@ -34,6 +34,41 @@ pub(crate) fn members(doc: &AutoCommit) -> Vec<String> { members } +/// A member's stability tier, judged by itself (`swarm::stability`). +#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] +pub(crate) enum Tier { + Stable, + #[default] + Transient, +} + +impl Tier { + pub(crate) fn as_str(self) -> &'static str { + match self { + Self::Stable => "stable", + Self::Transient => "transient", + } + } +} + +fn tier_path(pk: &str) -> Vec<String> { + let mut path = member_path(pk); + path.push("tier".to_owned()); + path +} + +/// `pk`'s tier; transient unless its entry says stable. +pub(crate) fn tier(doc: &AutoCommit, pk: &str) -> Tier { + match store::read_path(doc, &tier_path(pk)) { + Ok(Some(JsonValue::String(tier))) if tier == "stable" => Tier::Stable, + _ => Tier::Transient, + } +} + +pub(crate) fn set_tier(doc: &mut AutoCommit, pk: &str, tier: Tier) -> Result<(), StoreError> { + store::write_path(doc, &tier_path(pk), &json!(tier.as_str())) +} + /// Registers this node if it is ready and its entry is missing. pub(crate) async fn ensure_registered(state: &AppState) { if !state.is_ready().await { |
