use super::walk::{helper_refused, unit_tree};
use crate::descriptor::Grammar;
use crate::descriptor::shadow::{self, ShadowFace};
use crate::diagnostic::Diagnostic;
use crate::expansion::Expansion;
use crate::kind::SoleRole;
use crate::request::Door;
use crate::request::Request;
use crate::token::CapturedInput;
pub fn shadow(
body: CapturedInput,
grammar: Grammar,
door: &Door,
) -> Result<Expansion<ShadowFace>, Diagnostic> {
let read = shadow::chosen(&body, grammar)
.map_err(|refusal| helper_refused(&refusal, refusal.refusal().at(), door))?;
Request::<ShadowFace>::over(body, read, door)
.answering(Vec::new())
.render(|plan, out| {
let face = unit_tree(shadow::faces(plan.content()))?;
out.unit(SoleRole::Sole, face)
})
}