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>, ) -> Option> { 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 } }