pub struct QuestPlanContent {
pub quests: Vec<PlannedQuest>,
pub finale: QuestId,
pub branch_points: Vec<BranchPoint>,
}Expand description
Stage 4 payload: the quest dependency plan.
Fields§
§quests: Vec<PlannedQuest>Planned quests (expanded in stage 5).
finale: QuestIdThe quest whose completion ends the campaign.
branch_points: Vec<BranchPoint>The campaign’s declared story forks (DSL v0.8, spec-0025). Empty/absent = a campaign that claims to have no
branch — which the compiler then verifies rather than assumes: any flag
that gates casts, staging or structure and is set on some playthroughs and
not others belongs to no declared point and is DW0480.
Enumerated branches are the product of the declared points, so the branch set is authored and small — never a combinatorial sweep of every flag in the campaign.
Implementations§
Source§impl QuestPlanContent
impl QuestPlanContent
Sourcepub fn spine(&self) -> BTreeSet<&str>
pub fn spine(&self) -> BTreeSet<&str>
The ONE authority on which quests are the spine: the finale and every
quest its depends_on chain transitively demands — the quests a body
cannot reach the finale without.
The capability belongs here, on the stage-4 document, because the spine is
a fact about the quest plan and about nothing else. It had grown two
derivations of the same closure in two files — one inline in
crate::validate’s DW0132 convergence check, one a private
mandatory_quests in crate::layout read by the layout binding and by
the critical-path spine obligation. Both were correct and neither said it
was the authority, which is exactly the shape a later clean merge turns
into two rules that disagree.
Why the closure is taken over the raw depends_on edges, unfiltered.
The validate copy first dropped every dep naming a quest the plan does
not declare. That filtering is not this function’s question: a dangling
depends_on is DW0112’s finding, and silently pruning it here would
make the set disagree with the document it is derived from. So an id the
plan does not declare is reported in the spine and expands no further —
and the one reader that could care, DW0132, only ever asks whether a
declared quest is a member, so an undeclared member cannot change its
verdict.
Cycle-safe by construction (a quest already in the set is not expanded
again), so a plan DW0130 will refuse still yields a set rather than
hanging.
Not the same question as the mandatory field, and the name says so
deliberately. Today the two sets always coincide, because DW0132 demands
every declared quest be a transitive dependency of the finale and DW0866
demands every quest set mandatory: true. If mandatory: false ever
becomes legal those coincide no longer, and this function keeps answering
the graph question it has always answered.
Sourcepub fn optional(&self) -> BTreeSet<&str>
pub fn optional(&self) -> BTreeSet<&str>
The ONE authority on which quests are elective (spec-0051): the
quests declaring mandatory: false.
The counterpart to Self::spine, and deliberately a different
question. spine asks what the graph demands; this asks what the author
claims. DW0866/DW0867 are exactly the rules that keep the two
answers honest about each other, and they can only do that while each
side has one derivation — which is the defect the spine function was
created to end, and which a second private !q.mandatory filter in the
compiler would re-introduce on the other half.
Trait Implementations§
Source§impl Clone for QuestPlanContent
impl Clone for QuestPlanContent
Source§impl Debug for QuestPlanContent
impl Debug for QuestPlanContent
Source§impl<'de> Deserialize<'de> for QuestPlanContent
impl<'de> Deserialize<'de> for QuestPlanContent
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 JsonSchema for QuestPlanContent
impl JsonSchema for QuestPlanContent
Source§fn schema_id() -> Cow<'static, str>
fn schema_id() -> Cow<'static, str>
Source§fn json_schema(generator: &mut SchemaGenerator) -> Schema
fn json_schema(generator: &mut SchemaGenerator) -> Schema
Source§fn inline_schema() -> bool
fn inline_schema() -> bool
$ref keyword. Read more