use super::Shadows;
use crate::bounded::Overflow;
use crate::descriptor::DirectBinding;
use crate::descriptor::emitting::direct_path;
use crate::token::{GeneratedDelimiter, GeneratedToken, absolute_path};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
enum Face {
Ordinary,
Shadowed,
}
pub fn faces(shadows: &Shadows) -> Result<Vec<GeneratedToken>, Overflow> {
let mut tokens = Vec::new();
for row in shadows.chosen() {
arm(&mut tokens, Face::Ordinary, None, row.std_path())?;
arm(
&mut tokens,
Face::Shadowed,
Some(shadows.loom()),
row.shadow_path(),
)?;
}
Ok(tokens)
}
fn arm(
into: &mut Vec<GeneratedToken>,
face: Face,
binding: Option<&DirectBinding>,
path: &[&'static str],
) -> Result<(), Overflow> {
into.push(GeneratedToken::alone('#'));
let condition = match face {
Face::Ordinary => vec![
GeneratedToken::word("not"),
GeneratedToken::group(
GeneratedDelimiter::Parenthesis,
vec![GeneratedToken::word("loom")],
)?,
],
Face::Shadowed => vec![GeneratedToken::word("loom")],
};
let cfg = vec![
GeneratedToken::word("cfg"),
GeneratedToken::group(GeneratedDelimiter::Parenthesis, condition)?,
];
into.push(GeneratedToken::group(GeneratedDelimiter::Bracket, cfg)?);
into.push(GeneratedToken::word("pub"));
into.push(GeneratedToken::word("use"));
match binding {
Some(root) => direct_path(root, path, into),
None => into.extend(absolute_path(path)),
}
into.push(GeneratedToken::alone(';'));
Ok(())
}