// Copyright 2021 Oxide Computer Company use proc_macro2::TokenStream; use quote::{format_ident, quote}; use crate::{Error, 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) -> TokenStream { let mut fmt = String::new(); fmt.push_str("{}"); for c in self.components.iter() { fmt.push('/'); match c { Component::Constant(n) => fmt.push_str(n), Component::Parameter(_) => fmt.push_str("{}"), } } let components = self.components.iter().filter_map(|component| { if let Component::Parameter(n) = &component { let param = format_ident!("{}", n); Some(quote! { progenitor_support::encode_path(&#param.to_string()) }) } else { None } }); quote! { let url = format!(#fmt, self.baseurl, #(#components,)*); } } 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