pub struct FilesystemMemWriter { /* private fields */ }Expand description
Filesystem-backed MemWriter. Mutations buffer in memory until
Self::commit; commit replays them against the directory at
root with per-file write-to-temp + rename atomicity.
Implementations§
Trait Implementations§
Source§impl MemBackend for FilesystemMemWriter
impl MemBackend for FilesystemMemWriter
Source§fn current_head(&self) -> Result<Option<String>, BackendError>
fn current_head(&self) -> Result<Option<String>, BackendError>
Folder-mem drift cursor: the changelog’s last-line ts — the
same RFC3339-millisecond dialect folder_changes_since accepts
as its cursor, so drift heads feed straight into delta reads.
Every mutation appends a changelog line (in this process or a
sibling’s), advancing the cursor; the drift check then treats
the advance exactly like a git-branch tip move. Absent
changelog (a mem never mutated through the engine) keeps the
historical no-drift-signal None. Appends go through
append_change_monotonic, so the cursor strictly advances even
for same-millisecond commits; only a read-append race between
separate processes can momentarily share a cursor value —
detection then rides the next append.
Source§fn list_entities(&self) -> Result<Vec<PathBuf>, BackendError>
fn list_entities(&self) -> Result<Vec<PathBuf>, BackendError>
Source§fn read_entity(&self, rel_path: &Path) -> Result<Option<Vec<u8>>, BackendError>
fn read_entity(&self, rel_path: &Path) -> Result<Option<Vec<u8>>, BackendError>
rel_path. Ok(None) for a missing path
(idempotent reads); Err for IO or backend-specific failures.Source§fn write_entity(
&self,
rel_path: &Path,
content: &[u8],
) -> Result<(), BackendError>
fn write_entity( &self, rel_path: &Path, content: &[u8], ) -> Result<(), BackendError>
Source§fn delete_entity(&self, rel_path: &Path) -> Result<(), BackendError>
fn delete_entity(&self, rel_path: &Path) -> Result<(), BackendError>
rel_path. Idempotent: no-op when the path is already
absent. Pending until Self::commit.Source§fn move_entity(&self, from: &Path, to: &Path) -> Result<(), BackendError>
fn move_entity(&self, from: &Path, to: &Path) -> Result<(), BackendError>
Source§fn discard_pending(&self) -> Result<(), BackendError>
fn discard_pending(&self) -> Result<(), BackendError>
batch_update stages each item’s write into the
pending set, and when a later item fails validation it calls
this to drop the already-staged writes rather than commit a
half-applied batch. Idempotent — discarding an empty buffer
is a no-op. Read moreSource§fn commit(
&self,
message: &str,
ctx: &CommitContext<'_>,
) -> Result<CommitId, BackendError>
fn commit( &self, message: &str, ctx: &CommitContext<'_>, ) -> Result<CommitId, BackendError>
CommitId; backends without history
return a synthetic id (UNIX-nanos + counter, hex) so callers
always get a non-empty cursor.Source§fn read_mem_config(&self) -> Result<Option<Vec<u8>>, BackendError>
fn read_mem_config(&self) -> Result<Option<Vec<u8>>, BackendError>
.memstead/config.json payload, if any. Read moreSource§fn write_mem_config(&self, bytes: &[u8]) -> Result<(), BackendError>
fn write_mem_config(&self, bytes: &[u8]) -> Result<(), BackendError>
.memstead/config.json payload. Symmetric
counterpart to Self::read_mem_config. Read moreSource§fn read_anchors_sidecar(&self) -> Result<Option<Vec<u8>>, BackendError>
fn read_anchors_sidecar(&self) -> Result<Option<Vec<u8>>, BackendError>
crate::anchor::ANCHOR_SIDECAR_PATH) bytes, if any. Read moreSource§fn write_anchors_sidecar(&self, bytes: &[u8]) -> Result<(), BackendError>
fn write_anchors_sidecar(&self, bytes: &[u8]) -> Result<(), BackendError>
Source§fn append_provenance(&self, record: &Provenance) -> Result<(), BackendError>
fn append_provenance(&self, record: &Provenance) -> Result<(), BackendError>
Provenance record to the backend’s mutation log.
Persistence form differs per backend — JSONL line, commit
trailer, etc. — but the in-memory shape is identical.Source§fn read_provenance(
&self,
cursor: Option<&str>,
) -> Result<Vec<Provenance>, BackendError>
fn read_provenance( &self, cursor: Option<&str>, ) -> Result<Vec<Provenance>, BackendError>
cursor (opaque,
backend-defined: a commit SHA for git-branch, an RFC-3339
timestamp for folder, ignored for archive). None cursor
means “from the beginning”.Source§fn commit_with_expected_parent(
&self,
message: &str,
ctx: &CommitContext<'_>,
_expected_parent: Option<&str>,
) -> Result<CommitId, BackendError>
fn commit_with_expected_parent( &self, message: &str, ctx: &CommitContext<'_>, _expected_parent: Option<&str>, ) -> Result<CommitId, BackendError>
expected_parent is Some, the backend MUST refuse the
commit (Err(BackendError::ParentMismatch { ... })) if its
current head no longer matches the supplied ref — a sibling
writer advanced the on-disk state between the snapshot the
caller pinned and now. When expected_parent is None, the
call is equivalent to Self::commit. Read moreSource§fn read_archive_provenance(&self) -> Result<Option<Vec<u8>>, BackendError>
fn read_archive_provenance(&self) -> Result<Option<Vec<u8>>, BackendError>
.memstead/provenance.json) the archive carries, if any. Read moreSource§fn write_mem_config_with_note(
&self,
bytes: &[u8],
_note: Option<&str>,
) -> Result<(), BackendError>
fn write_mem_config_with_note( &self, bytes: &[u8], _note: Option<&str>, ) -> Result<(), BackendError>
Self::write_mem_config but records note (an optional
agent/operator-supplied provenance reason) on the resulting
commit body. The default delegates to the note-less form, so
backends without a commit (folder) simply ignore the note; the
git-branch backend overrides this to thread note into the
__MEMSTEAD-ref commit. Lets set_mem_version carry a --note
like the other commit-producing mem-lifecycle operations.Source§fn record_pipeline_edit(
&self,
_kind: &str,
_edits: &[(String, Option<Vec<u8>>)],
_note: Option<&str>,
_verb: &str,
) -> Result<(), BackendError>
fn record_pipeline_edit( &self, _kind: &str, _edits: &[(String, Option<Vec<u8>>)], _note: Option<&str>, _verb: &str, ) -> Result<(), BackendError>
.memstead/ on the workspace root — it has no
commit of its own — so backends with a commit timeline mirror the
edit into their provenance record; the commit is the audit trail,
the disk file stays the read path. Read moreSource§fn delete_artifacts(&self) -> Result<(), BackendError>
fn delete_artifacts(&self) -> Result<(), BackendError>
memstead_mem_create (entity-seed commit on the per-mem
branch + Self::write_mem_config on __MEMSTEAD). Called by
memstead_mem_delete orchestration when delete_files=true and
the delete rule matched, to give the backend a chance to
prune ref-store state the engine alone has the git authority
to touch. Read moreSource§impl MemWriter for FilesystemMemWriter
impl MemWriter for FilesystemMemWriter
Source§fn write_entity(
&self,
rel_path: &Path,
content: &[u8],
) -> Result<(), MemWriterError>
fn write_entity( &self, rel_path: &Path, content: &[u8], ) -> Result<(), MemWriterError>
Source§fn delete_entity(&self, rel_path: &Path) -> Result<(), MemWriterError>
fn delete_entity(&self, rel_path: &Path) -> Result<(), MemWriterError>
rel_path (mem-relative). Idempotent: no-op when the
path is already absent. Pending until Self::commit.Source§fn move_entity(&self, from: &Path, to: &Path) -> Result<(), MemWriterError>
fn move_entity(&self, from: &Path, to: &Path) -> Result<(), MemWriterError>
Source§fn commit(
&self,
_message: &str,
_ctx: &CommitContext<'_>,
) -> Result<CommitId, MemWriterError>
fn commit( &self, _message: &str, _ctx: &CommitContext<'_>, ) -> Result<CommitId, MemWriterError>
ctx.
Returns the resulting CommitId (opaque; the git-tree adapter
formats it as a hex object id).Auto Trait Implementations§
impl !Freeze for FilesystemMemWriter
impl RefUnwindSafe for FilesystemMemWriter
impl Send for FilesystemMemWriter
impl Sync for FilesystemMemWriter
impl Unpin for FilesystemMemWriter
impl UnsafeUnpin for FilesystemMemWriter
impl UnwindSafe for FilesystemMemWriter
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> 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