wgsl-parser 0.5.0

A zero-copy recursive-descent parser for WebGPU shading language
Documentation
use crate::{traversal::FlowControl, Text};

use super::{Branch, PreParsed, Section};

#[allow(unused_variables)]
#[rustfmt::skip]
pub trait Visitor {
	#[must_use] fn visit_pre_parsed(&mut self, host: &PreParsed) -> FlowControl { FlowControl::default() }
	#[must_use] fn visit_section(&mut self, host: &Section) -> FlowControl { FlowControl::default() }
	#[must_use] fn visit_branch(&mut self, host: &Branch) -> FlowControl { FlowControl::default() }
	fn visit_text(&mut self, host: &Text) {}
	fn visit_definition(&mut self, host: &Text) {}
}

pub trait Walk {
	fn walk(&self, visitor: &mut dyn Visitor);
}

impl Walk for PreParsed {
	fn walk(&self, visitor: &mut dyn Visitor) {
		if visitor.visit_pre_parsed(self) == FlowControl::Continue {
			for section in self.sections.iter() {
				section.walk(visitor);
			}
		}
	}
}

impl Walk for Section {
	fn walk(&self, visitor: &mut dyn Visitor) {
		if visitor.visit_section(self) == FlowControl::Continue {
			match self {
				Section::Text(text) => visitor.visit_text(text),
				Section::Branch(branch) => branch.walk(visitor),
				Section::Definition(def) => visitor.visit_definition(def),
			}
		}
	}
}

impl Walk for Branch {
	fn walk(&self, visitor: &mut dyn Visitor) {
		if visitor.visit_branch(self) == FlowControl::Continue {
			for section in self.body.iter() {
				section.walk(visitor);
			}

			if let Some(else_branch) = &self.else_ {
				else_branch.walk(visitor);
			}
		}
	}
}