use anyhow::{anyhow, bail, Context, Result}; #[derive(Eq, PartialEq, Clone, Debug)] enum Component { Constant(String), Parameter(String), } #[derive(Eq, PartialEq, Clone, Debug)] pub struct Template { components: Vec, } impl Template { pub fn compile(&self) -> String { let mut out = " let url = format!(\"{}".to_string(); for c in self.components.iter() { out.push('/'); match c { Component::Constant(n) => out.push_str(n), Component::Parameter(_) => out.push_str("{}"), } } out.push_str("\",\n"); out.push_str(" self.baseurl,\n"); for c in self.components.iter() { if let Component::Parameter(n) = &c { out.push_str(&format!( " \ progenitor_support::encode_path(&{}.to_string()),\n", n )); } } out.push_str(" );\n"); out } pub fn names(&self) -> Vec { self.components .iter() .filter_map(|c| match c { Component::Parameter(name) => Some(name.to_string()), Component::Constant(_) => None, }) .collect() } } pub fn parse(t: &str) -> Result