pub struct ProjectionPlacement {
pub root_preference: RootPreference,
pub dir_template: String,
}Expand description
The projection placement resolver (see the module doc for the full
architecture narrative). Small and Clone — every consumer holds its
own copy rather than sharing a lock. Serialize/Deserialize: the
spawn-time in-flight pointer
(crates/mlua-swarm-server/src/operator_ws/session.rs’s
append_projection_pointer) has no direct Engine handle, so
crate::middleware::agent_context::AgentContextMiddleware (which does)
resolves this once per spawn and stashes it JSON-serialized into
ctx.meta.runtime[crate::core::agent_context::PROJECTION_PLACEMENT_KEY]
— the same channel AGENT_CONTEXT_KEY already establishes for
AgentContextView itself.
Fields§
§root_preference: RootPreferenceRoot resolution preference.
dir_template: StringTarget directory template, relative to the resolved root, with
[TASK_ID_PLACEHOLDER] substituted at materialize time. Validated
by Self::validate_dir_template before being accepted into a
ProjectionPlacement — every instance in circulation already
satisfies that contract.
Implementations§
Source§impl ProjectionPlacement
impl ProjectionPlacement
Sourcepub fn from_spec(
spec: Option<&ProjectionPlacementSpec>,
) -> Result<Self, ProjectionPlacementError>
pub fn from_spec( spec: Option<&ProjectionPlacementSpec>, ) -> Result<Self, ProjectionPlacementError>
Builds a ProjectionPlacement from a Blueprint’s optional
projection_placement spec — the sole construction site
(blueprint::compiler::Compiler::compile, mirroring
crate::core::step_naming::StepNaming::from_blueprint’s
single-construction-site contract). None (no
Blueprint.projection_placement declared) returns
Self::default unchanged — every pre-GH-#27 Blueprint compiles
byte-identically through this path. A declared spec’s dir_template
is validated via Self::validate_dir_template; root, when
present, must be exactly "work_dir" or "project_root".
Sourcepub fn validate_dir_template(
template: &str,
) -> Result<(), ProjectionPlacementError>
pub fn validate_dir_template( template: &str, ) -> Result<(), ProjectionPlacementError>
Validates a dir_template candidate: non-empty, contains the
{task_id} placeholder, is relative (not absolute, no leading
/), and contains no .. path segment. Shared by Self::from_spec
so every declared ProjectionPlacement in circulation already
satisfies this contract — Self::target_dir never has to
re-check it.
Sourcepub fn resolve_root(&self, view: &AgentContextView) -> Option<String>
pub fn resolve_root(&self, view: &AgentContextView) -> Option<String>
Resolves the materialize root off view’s work_dir /
project_root fields, per Self::root_preference, falling back
to the other when the preferred one is absent. None when neither
is present — every call site’s existing fail-open contract
(unresolved root ⇒ skip materialize, never fail the caller) is
preserved unchanged.
Sourcepub fn target_dir(&self, root: impl AsRef<Path>, task_id: &str) -> PathBuf
pub fn target_dir(&self, root: impl AsRef<Path>, task_id: &str) -> PathBuf
The materialize target DIRECTORY for task_id, rooted at root:
Self::dir_template with [TASK_ID_PLACEHOLDER] substituted,
joined onto root one path segment at a time (so a
multi-segment template like the default
"workspace/tasks/{task_id}/ctx" builds the same cross-platform
PathBuf the pre-GH-#27 hardcoded .join("workspace").join("tasks")…
chain did).
Sourcepub fn target_path(
&self,
root: impl AsRef<Path>,
task_id: &str,
stem: &str,
) -> PathBuf
pub fn target_path( &self, root: impl AsRef<Path>, task_id: &str, stem: &str, ) -> PathBuf
The materialize target FILE for task_id / stem (stem is the
canonical step name, or "_ctx" for the whole-ctx submission —
see crate::core::projection::ProjectionKey::step_slug):
Self::target_dir joined with "<stem>.md".
Trait Implementations§
Source§impl Clone for ProjectionPlacement
impl Clone for ProjectionPlacement
Source§fn clone(&self) -> ProjectionPlacement
fn clone(&self) -> ProjectionPlacement
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for ProjectionPlacement
impl Debug for ProjectionPlacement
Source§impl Default for ProjectionPlacement
impl Default for ProjectionPlacement
Source§impl<'de> Deserialize<'de> for ProjectionPlacement
impl<'de> Deserialize<'de> for ProjectionPlacement
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>,
Source§impl PartialEq for ProjectionPlacement
impl PartialEq for ProjectionPlacement
Source§fn eq(&self, other: &ProjectionPlacement) -> bool
fn eq(&self, other: &ProjectionPlacement) -> bool
self and other values to be equal, and is used by ==.Source§impl Serialize for ProjectionPlacement
impl Serialize for ProjectionPlacement
impl StructuralPartialEq for ProjectionPlacement
Auto Trait Implementations§
impl Freeze for ProjectionPlacement
impl RefUnwindSafe for ProjectionPlacement
impl Send for ProjectionPlacement
impl Sync for ProjectionPlacement
impl Unpin for ProjectionPlacement
impl UnsafeUnpin for ProjectionPlacement
impl UnwindSafe for ProjectionPlacement
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>,
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