use typst_syntax::Spanned;
use crate::diag::bail;
use crate::foundations::{Cast, Content, Value, elem};
use crate::math::Mathy;
#[elem(title = "Fraction", Mathy)]
pub struct FracElem {
#[required]
pub num: Content,
#[required]
pub denom: Content,
#[default(FracStyle::Vertical)]
pub style: FracStyle,
#[internal]
#[parse(None)]
#[default(false)]
pub num_deparenthesized: bool,
#[internal]
#[parse(None)]
#[default(false)]
pub denom_deparenthesized: bool,
}
#[derive(Debug, Default, Copy, Clone, Eq, PartialEq, Hash, Cast)]
pub enum FracStyle {
#[default]
Vertical,
Skewed,
Horizontal,
}
#[elem(title = "Binomial", Mathy)]
pub struct BinomElem {
#[required]
pub upper: Content,
#[required]
#[variadic]
#[parse(
let values = args.all::<Spanned<Value>>()?;
if values.is_empty() {
// Prevents one element binomials
bail!(args.span, "missing argument: lower");
}
values.into_iter().map(|spanned| spanned.v.display()).collect()
)]
pub lower: Vec<Content>,
}