61 lines
1.9 KiB
Rust
61 lines
1.9 KiB
Rust
use crate::renderer::breadcrumb_tree::BreadcrumbTreeElement;
|
|
use crate::renderer::context_element::CompareContextElement;
|
|
use crate::renderer::context_element::ContextElement;
|
|
use crate::renderer::context_element::IceResult;
|
|
use crate::renderer::context_element::IntoContextElement;
|
|
use crate::renderer::DustRenderer;
|
|
use crate::renderer::Loopable;
|
|
use crate::renderer::RenderError;
|
|
use crate::renderer::Renderable;
|
|
use crate::renderer::Truthiness;
|
|
use crate::renderer::WalkError;
|
|
use crate::{parser::Filter, parser::OwnedLiteral, renderer::Walkable};
|
|
use std::convert::TryInto;
|
|
|
|
use std::cmp::Ordering;
|
|
|
|
/// An injected context for $idx and $len
|
|
///
|
|
/// Functions the same as the injected parameters contexts for
|
|
/// helpers/partials with parameters but this has no need for storing
|
|
/// breadcrumbs since its simply storing two integers.
|
|
#[derive(Debug)]
|
|
pub struct IterationContext {
|
|
idx: OwnedLiteral,
|
|
len: OwnedLiteral,
|
|
}
|
|
|
|
impl IterationContext {
|
|
pub fn new(idx: usize, len: usize) -> Self {
|
|
// TODO: it would be nice to handle usize vs u64 better
|
|
IterationContext {
|
|
idx: OwnedLiteral::LPositiveInteger(idx.try_into().unwrap()),
|
|
len: OwnedLiteral::LPositiveInteger(len.try_into().unwrap()),
|
|
}
|
|
}
|
|
}
|
|
|
|
impl IntoContextElement for IterationContext {
|
|
fn into_context_element<'b>(
|
|
&'b self,
|
|
renderer: &DustRenderer,
|
|
breadcrumbs: &'b Vec<BreadcrumbTreeElement<'b>>,
|
|
) -> Option<IceResult<'b>> {
|
|
panic!("into_context_element cannot be called on pseudo elements");
|
|
}
|
|
}
|
|
|
|
impl Walkable for IterationContext {
|
|
fn walk(&self, segment: &str) -> Result<&dyn IntoContextElement, WalkError> {
|
|
match segment {
|
|
"$idx" => Ok(&self.idx),
|
|
"$len" => Ok(&self.len),
|
|
_ => Err(WalkError::CantWalk),
|
|
}
|
|
}
|
|
|
|
fn is_pseudo_element(&self) -> bool {
|
|
true
|
|
}
|
|
}
|