pub enum StageTransition {
Create {
sig_id: SigId,
stage_id: StageId,
},
Replace {
sig_id: SigId,
from: StageId,
to: StageId,
},
Remove {
sig_id: SigId,
last: StageId,
},
Rename {
from: SigId,
to: SigId,
body_stage_id: StageId,
},
ImportOnly,
Merge {
entries: BTreeMap<SigId, Option<StageId>>,
},
}Expand description
Effect of applying an operation on a stage’s content-addressed
identity. Used as the produces field of an OperationRecord
so consumers can answer “after this op, what’s the head stage
for this SigId?” without rerunning the apply step.
Variants§
Create
New SigId; produces a stage that didn’t exist before.
Replace
Existing SigId; replaces its head stage.
Remove
SigId removed; no head stage afterwards.
Rename
SigId renamed; same body hash, different signature identity.
ImportOnly
Import-only change; doesn’t touch any stage.
Merge
Merge op result. entries lists only the sigs whose head
changed relative to the merge op’s first parent (dst_head):
Some(stage_id) sets the head; None removes the sig.
Sigs unaffected by the merge are not listed.
Canonical-form contract: BTreeMap is load-bearing —
iteration is sorted by SigId, so on-disk JSON for two
callers that resolved the same conflicts in different
orders produces byte-identical output. Switching to
HashMap here would break canonical stability of the
OperationRecord JSON file and is rejected by the
canonical-form spec in crate::canonical.
Implementations§
Source§impl StageTransition
impl StageTransition
Sourcepub fn stage_ids(&self) -> Vec<StageId> ⓘ
pub fn stage_ids(&self) -> Vec<StageId> ⓘ
Every stage id this transition references — the content-addressed
blobs a peer needs alongside the op record to render or replay it.
Used by op push/pull to sync stage objects, not just op records.
Sourcepub fn stage_pairs(&self) -> Vec<(SigId, StageId)>
pub fn stage_pairs(&self) -> Vec<(SigId, StageId)>
Every (sig_id, stage_id) pair this transition references (#986).
A StageId hashes the structural signature plus the implementation and
deliberately not the name (#826), so two functions differing only in
name share one StageId while having two distinct SigIds — and two
separate ASTs, one stored under each sig. Rendering therefore resolves a
stage through crate’s (sig, stage) pair, never the id alone.
Self::stage_ids is consequently not enough for object sync: asking a
peer “do you have this stage id?” can answer yes while the variant the
head actually names is absent. Sync paths should use these pairs.
Trait Implementations§
Source§impl Clone for StageTransition
impl Clone for StageTransition
Source§impl Debug for StageTransition
impl Debug for StageTransition
Source§impl<'de> Deserialize<'de> for StageTransition
impl<'de> Deserialize<'de> for StageTransition
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
impl Eq for StageTransition
Source§impl PartialEq for StageTransition
impl PartialEq for StageTransition
Source§impl Serialize for StageTransition
impl Serialize for StageTransition
impl StructuralPartialEq for StageTransition
Auto Trait Implementations§
impl Freeze for StageTransition
impl RefUnwindSafe for StageTransition
impl Send for StageTransition
impl Sync for StageTransition
impl Unpin for StageTransition
impl UnsafeUnpin for StageTransition
impl UnwindSafe for StageTransition
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.