pub struct UpdateEntityArgs {
pub id: EntityId,
pub expected_hash: Option<String>,
pub sections: IndexMap<String, String>,
pub append_sections: IndexMap<String, String>,
pub patch_sections: IndexMap<String, PatchArg>,
pub metadata: IndexMap<String, String>,
pub metadata_unset: Vec<String>,
pub dry_run: bool,
pub declare_relations: Vec<RelateArg>,
pub anchors: Vec<AnchorInput>,
pub anchors_unset: Vec<AnchorUnsetInput>,
pub relations_unset: Vec<RelationUnsetArg>,
}Expand description
Arguments for [Engine::update_entity].
Fields§
§id: EntityId§expected_hash: Option<String>Optimistic locking. None skips the check.
sections: IndexMap<String, String>Section keys whose body should be replaced wholesale. Empty values overwrite with empty content.
append_sections: IndexMap<String, String>Section keys whose body should be appended to. Existing body
gets a \n separator before the append; empty/absent body
is replaced wholesale with the append value (parity with
full’s append-on-empty behaviour). The same key may not
appear in both sections and append_sections; conflict
is rejected with [EngineError::ConflictingSectionModes].
patch_sections: IndexMap<String, PatchArg>Section keys whose body should be patched via find-and-
replace. Each value is a crate::ops::PatchArg with
old, new, and all (replace every occurrence vs first
only). Errors with [EngineError::PatchSectionEmpty] when
the section is absent and [EngineError::PatchOldNotFound]
when old doesn’t appear. Mutually exclusive with the
other two section modes for the same key.
metadata: IndexMap<String, String>Metadata fields to set or replace. Values land as
MetadataValue::String for V1.
metadata_unset: Vec<String>Metadata field keys to unset. Silently no-ops on absent keys.
dry_run: boolWhen true, validate and compute the prospective hash but
do not write to disk, mutate the store, or commit. Outcome
carries content_hash = the unchanged on-disk hash (so the
caller can use it as expected_hash on the follow-up real
call) and prospective_hash = the hash the entity would
have after the proposed write. Wire-equivalent to full’s
UpdateArgs.dry_run. Optimistic-lock check is skipped on
the dry_run path so an agent can preview a change without
holding a fresh hash — designated stale-hash recovery path.
declare_relations: Vec<RelateArg>Atomic batched relation declarations applied before the
section/metadata changes land. Each entry is validated like
any individual memstead_relate call (schema-shape, cross-mem
policy, target-id grammar), appended to the entity’s
relationships list, and — for absent Write-target peers —
auto-stubbed in the target’s mem. The strict
wiki-link/relation validator then runs against the
post-mutation state with the freshly-declared relations
already in place, so a body wiki-link added in the same
memstead_update call passes the gate without a separate
memstead_relate round-trip. Empty default — omit when no
batched declarations are needed.
anchors: Vec<AnchorInput>Permissive anchors[] provenance records to attach to this entity
— validated (crate::anchor::AnchorInput::validate) and, when
non-empty, merged into the entity’s row in the mem-branch
anchors sidecar in the SAME commit as the update so entity +
anchors land atomically: an incoming anchor replaces the existing
anchor with the same (artifact, grain, class) triple and appends
otherwise — writing never removes an anchor this call did not name
in Self::anchors_unset. Empty (the default) merges nothing and
leaves the stored set untouched. A malformed element refuses the
whole update with [EngineError::InvalidAnchor] (INVALID_ANCHOR)
— nothing is written. Not folded into _hash (sidecar lives under
.memstead/).
anchors_unset: Vec<AnchorUnsetInput>Explicit anchor removals, applied before the Self::anchors
merge in the same mutation (mirroring the metadata_unset /
relations_unset conventions). Each selector names an artifact
and may narrow by grain and/or class; a bare artifact removes
every anchor on it. Unsetting an anchor that does not exist is a
no-op, not an error — removal is idempotent. A malformed selector
refuses the whole update with [EngineError::InvalidAnchor].
relations_unset: Vec<RelationUnsetArg>Repair-shaped relation removals ({ rel_type, target }),
applied atomically within this update. Accepted only when the
entity currently FAILS the conformance check (against the
effective schema) — a conformant entity refuses with
REPAIR_NOT_NEEDED and stays unmodified; memstead_relate(remove)
is the everyday detach path. Absent pairs are silent no-ops
(symmetric with metadata_unset). The strict-write
post-condition is unchanged: the post-repair entity must be
integral or the whole update refuses with the relevant
write-time code.
Trait Implementations§
Source§impl Clone for UpdateEntityArgs
impl Clone for UpdateEntityArgs
Source§fn clone(&self) -> UpdateEntityArgs
fn clone(&self) -> UpdateEntityArgs
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreAuto Trait Implementations§
impl Freeze for UpdateEntityArgs
impl RefUnwindSafe for UpdateEntityArgs
impl Send for UpdateEntityArgs
impl Sync for UpdateEntityArgs
impl Unpin for UpdateEntityArgs
impl UnsafeUnpin for UpdateEntityArgs
impl UnwindSafe for UpdateEntityArgs
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,
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> DowncastSend for T
impl<T> DowncastSend for T
Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
impl<T> Fruit for T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more