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 list_entities(&self) -> Result<Vec<PathBuf>, BackendError>
fn list_entities(&self) -> Result<Vec<PathBuf>, BackendError>
Mem-relative paths of every entity-bearing file the backend
holds. Order is not specified; callers that need stable
ordering sort.
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>
Read raw bytes at
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>
Remove
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>
Discard every pending (uncommitted) mutation, returning the
staging buffer to empty without producing a commit. The
transactional escape hatch for stage-then-commit callers:
the atomic
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>
Flush pending mutations into a single commit. Returns the
resulting opaque
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>
Read the per-mem
.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>
Write the per-mem
.memstead/config.json payload. Symmetric
counterpart to Self::read_mem_config. Read moreSource§fn append_provenance(&self, record: &Provenance) -> Result<(), BackendError>
fn append_provenance(&self, record: &Provenance) -> Result<(), BackendError>
Append a
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>
Read provenance entries since
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>
Commit pending mutations with a parent-ref pinning guard.
When
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 current_head(&self) -> Result<Option<String>, BackendError>
fn current_head(&self) -> Result<Option<String>, BackendError>
Opaque cursor pointing at the backend’s current state. The
engine compares against a per-mount cached cursor to detect
drift — a sibling writer (another
Engine instance, an
out-of-band git pull, etc.) advancing the on-disk state past
what the engine last read. Backends without history (folder,
archive) inherit the default impl returning Ok(None); the
engine treats None as “no drift signal available” and skips
drift detection for that mount. The git-branch backend
overrides to return the per-mem branch tip’s commit SHA hex. Read moreSource§fn read_archive_provenance(&self) -> Result<Option<Vec<u8>>, BackendError>
fn read_archive_provenance(&self) -> Result<Option<Vec<u8>>, BackendError>
Read the optional authoring-provenance payload
(
.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>
Like
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 delete_artifacts(&self) -> Result<(), BackendError>
fn delete_artifacts(&self) -> Result<(), BackendError>
Drop every backend-side artifact for this mem — the
symmetric counterpart to the writes performed by
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>
Remove
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>
Flush pending mutations into a single commit. The implementation
picks up the actor / committer / trailer information from
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
Mutably borrows from an owned value. Read more
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>
Converts
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>
Converts
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)
Converts
&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)
Converts
&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>
Converts
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>
Converts
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