duster/src/renderer/iteration_context.rs

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
}
}