Skip to content

Commit 50076de

Browse files
committed
fix: resolve development plan references before allocation
Signed-off-by: Jeremi Joslin <jeremi@joslin.fr>
1 parent e7be3ad commit 50076de

5 files changed

Lines changed: 761 additions & 57 deletions

File tree

‎crates/registry-bregctl/src/project_dev/mod.rs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -338,7 +338,7 @@ fn start(project: &Path, ttl: Option<&str>) -> Result<Value> {
338338
.canonicalize()
339339
.context("cannot open the development project directory")?;
340340
let plan = plan::load(&project)?;
341-
let schema_people = products::schema_people(&project, &plan)?;
341+
let schema_people = products::schema_people(&project, &plan, true)?;
342342
let breg_authority = products::breg_authority(&project, &plan)?;
343343
let signals = signals()?;
344344
let casework_principals =

‎crates/registry-bregctl/src/project_dev/plan.rs‎

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -467,7 +467,7 @@ pub(super) fn reserved_claim(claim: &str) -> bool {
467467
}
468468

469469
#[derive(Debug, thiserror::Error)]
470-
#[error("dev.yaml {field} {reason}")]
470+
#[error("dev.yaml {field}: {reason} Next: {remedy}")]
471471
pub(super) struct SemanticRefusal {
472472
field: String,
473473
reason: String,
@@ -492,7 +492,7 @@ pub(super) fn require(
492492
Ok(())
493493
}
494494

495-
fn refuse<T>(field: &str, reason: &str, remedy: &str) -> SemanticResult<T> {
495+
pub(super) fn refuse<T>(field: &str, reason: &str, remedy: &str) -> SemanticResult<T> {
496496
Err(SemanticRefusal {
497497
field: field.to_owned(),
498498
reason: reason.to_owned(),
@@ -543,23 +543,30 @@ fn read_plan(root: &Path) -> Result<Decoded<Plan>> {
543543
.decode::<Plan>(&bytes, &Expect::one(&FORMAT))?)
544544
}
545545

546+
fn refusal_report(decoded: &Decoded<Plan>, refusal: &SemanticRefusal) -> Report {
547+
let diagnostic = decoded.document.diagnostic_at_value(
548+
Severity::Error,
549+
"rstack.dev.invalid-plan",
550+
&refusal.field,
551+
&refusal.reason,
552+
&refusal.remedy,
553+
);
554+
decoded.document.report_with([diagnostic])
555+
}
556+
546557
fn validate_plan(root: &Path, decoded: &Decoded<Plan>) -> Result<()> {
547-
if let Err(refusal) = decoded.value.validate(root) {
548-
let diagnostic = decoded.document.diagnostic_at_value(
549-
Severity::Error,
550-
"rstack.dev.invalid-plan",
551-
&refusal.field,
552-
&refusal.reason,
553-
&refusal.remedy,
554-
);
555-
return Err(decoded.document.report_with([diagnostic]).into());
556-
}
557-
Ok(())
558+
decoded
559+
.value
560+
.validate(root)
561+
.map_err(|refusal| refusal_report(decoded, &refusal).into())
558562
}
559563

560564
pub(crate) fn check(root: &Path) -> Result<Report> {
561565
let decoded = read_plan(root)?;
562566
validate_plan(root, &decoded)?;
567+
if let Err(refusal) = super::products::schema_people(root, &decoded.value, false) {
568+
return Err(refusal_report(&decoded, &refusal).into());
569+
}
563570
Ok(decoded.document.report_with(Vec::new()))
564571
}
565572

0 commit comments

Comments
 (0)