pub struct TaskStore {
pub tasks: Vec<Task>,
pub updated_at: Option<DateTime<Utc>>,
/* private fields */
}Fields§
§tasks: Vec<Task>§updated_at: Option<DateTime<Utc>>Implementations§
Source§impl TaskStore
impl TaskStore
pub fn default_path() -> Result<PathBuf>
Sourcepub fn load() -> Result<Self>
pub fn load() -> Result<Self>
Snapshot of the default store, read under the store lock so it never
observes a writer’s half-applied update. Read-modify-write callers use
Self::mutate_locked; a load → change → Self::save sequence
overwrites concurrent updates.
Sourcepub fn save(&self) -> Result<()>
pub fn save(&self) -> Result<()>
Overwrite the default store with this snapshot. Prefer
Self::mutate_locked for read-modify-write updates.
pub fn scoped_path(project_root: &str) -> Result<PathBuf>
pub fn read_locked<R>(path: &Path, read: impl FnOnce(&Self) -> R) -> Result<R>
pub fn mutate_locked<R, E>( path: &Path, mutate: impl FnOnce(&mut Self) -> Result<R, E>, ) -> Result<R, E>
Sourcepub fn mutate_locked_within<R, E>(
path: &Path,
wait: Duration,
mutate: impl FnOnce(&mut Self) -> Result<R, E>,
) -> Result<R, E>
pub fn mutate_locked_within<R, E>( path: &Path, wait: Duration, mutate: impl FnOnce(&mut Self) -> Result<R, E>, ) -> Result<R, E>
Self::mutate_locked that waits up to wait for the store lock.
Within this process callers queue in arrival order; another process
is held off only by the polled file lock, so a caller that runs once
per request (such as ctx_agent export) can still be kept out past
the default timeout by another process taking the lock back to back.
pub fn create_task(&mut self, from: &str, to: &str, description: &str) -> String
Sourcepub fn materialize_remote_task(
path: &Path,
descriptor: &TaskDescriptorV1,
) -> Result<RemoteTaskMaterialization>
pub fn materialize_remote_task( path: &Path, descriptor: &TaskDescriptorV1, ) -> Result<RemoteTaskMaterialization>
Durably materialize an already-authorized remote task descriptor.
The description is admitted for the store like any new caller text: a
descriptor whose description is restricted or withheld is refused with
PermissionDenied and a content-free message, and neither a task nor
an idempotency record is written.
The idempotency ledger lives in the same file as the tasks and is written under the same lock and atomic rename, so a delivery is either visible with its ledger entry after a restart or not at all — never acknowledged without being stored.
Callers MUST verify TaskDescriptorV1::verify_authority first; this
re-validates shape only, and cannot re-derive authority on its own.
pub fn get_task(&self, task_id: &str) -> Option<&Task>
pub fn get_task_mut(&mut self, task_id: &str) -> Option<&mut Task>
pub fn tasks_for_agent(&self, agent_id: &str) -> Vec<&Task>
pub fn pending_tasks_for(&self, agent_id: &str) -> Vec<&Task>
pub fn cleanup_old(&mut self, max_age_hours: u64)
Trait Implementations§
Source§impl<'de> Deserialize<'de> for TaskStore
impl<'de> Deserialize<'de> for TaskStore
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>,
Auto Trait Implementations§
impl Forget for TaskStore
impl Freeze for TaskStore
impl Move for TaskStore
impl RefUnwindSafe for TaskStore
impl Send for TaskStore
impl Sync for TaskStore
impl Unpin for TaskStore
impl UnsafeUnpin for TaskStore
impl UnwindSafe for TaskStore
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
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
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>,
impl<A, B, T> HttpServerConnExec<A, B> for Twhere
B: Body,
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