use super::super::assembly::SupportAssembly;
use super::{ShellError, SupportCarrier, SupportShell};
use crate::diagnostic::{Diagnostic, Placement};
use crate::expansion::Expansion;
use crate::identity::{self, Identity};
use crate::kind::SoleRole;
use crate::render::RenderError;
use crate::request::Door;
use crate::request::Request;
use crate::token::CapturedInput;
pub fn delivered(
capture: CapturedInput,
dependencies: Vec<Identity<identity::CapturedDeclaration>>,
assembly: SupportAssembly,
door: &Door,
) -> Result<Expansion<SupportCarrier>, Diagnostic> {
let mut parked: Option<ShellError> = None;
let walked = Request::<SupportCarrier>::over(capture, assembly, door)
.depending_on(dependencies)
.render(
|plan, out| match SupportShell::assembled(plan, plan.content(), door) {
Ok(shell) => out.unit(SoleRole::Sole, shell.into_tree()),
Err(refusal) => {
parked = Some(refusal);
Err(RenderError::NothingRendered)
}
},
);
if let Some(refusal) = parked {
return Err(Diagnostic::refused(
&refusal,
door,
&Placement::WholeDeclaration,
));
}
walked
}