use crate::bounded::Overflow;
use crate::closure::PartitionCargo;
use crate::diagnostic::{Diagnostic, Placement, Refused};
use crate::expansion::Expansion;
use crate::kind::{Destination, Kind};
use crate::render::RenderError;
use crate::request::Door;
use crate::support::{AssemblyError, CargoAxis, DeferredCargo, ProvedCargo, SupportName};
use crate::token::{GeneratedToken, GeneratedTree, SpanHandle, SpanTable};
pub(super) fn helper_refused<E: Refused>(refusal: &E, at: SpanHandle, door: &Door) -> Diagnostic {
Diagnostic::refused(
refusal,
door,
&Placement::AtToken {
token: at,
spans: &SpanTable::ProducerHeld,
},
)
}
pub(super) fn whole<E: Refused>(refusal: &E, door: &Door) -> Diagnostic {
Diagnostic::refused(refusal, door, &Placement::WholeDeclaration)
}
pub(super) fn support_address(spelling: &str, door: &Door) -> Result<SupportName, Diagnostic> {
SupportName::declared(spelling).map_err(|refusal| whole(&refusal, door))
}
pub(super) fn unit_tree(
tokens: Result<Vec<GeneratedToken>, Overflow>,
) -> Result<GeneratedTree, RenderError> {
let composed = tokens.map_err(overflown)?;
GeneratedTree::assembled(composed).map_err(overflown)
}
pub(super) const fn overflown(overflow: Overflow) -> RenderError {
RenderError::TokensUnbounded {
bound: overflow.capacity,
observed: overflow.offered,
}
}
pub(super) fn proved_off<K: Kind>(
expansion: &Expansion<K>,
axis: CargoAxis,
destination: Destination,
door: &Door,
) -> Result<ProvedCargo, Diagnostic> {
let cargo = match expansion.emission().joined(destination) {
Some(PartitionCargo::Carried(proved)) => DeferredCargo::deferred(proved.tree().clone()),
Some(PartitionCargo::NothingPlanned) | None => {
return Err(whole(
&AssemblyError::of(crate::support::AssemblyIssue::CargoNotTheSourcesOwn {
source: expansion.identity(),
destination,
}),
door,
));
}
};
ProvedCargo::carried(expansion, axis, destination, cargo)
.map_err(|refusal| whole(&refusal, door))
}