1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
use codeviz_common::ElementFormat; use codeviz_common::VariableFormat; use super::*; #[derive(Debug, Clone)] pub enum Variable { Literal(String), Type(Type), String(String), Statement(Statement), Element(Element), Spacing, } impl VariableFormat for Variable { type Extra = Extra; fn format<E>(&self, out: &mut E, depth: usize, extra: &mut Extra) -> Result<()> where E: ElementFormat { match *self { Variable::Type(ref ty) => ty.format(out, depth, extra)?, Variable::String(ref string) => java_quote_string(out, string)?, Variable::Statement(ref stmt) => stmt.format(out, depth, extra)?, Variable::Literal(ref content) => out.write_str(content)?, Variable::Element(ref element) => element.format(out, extra)?, Variable::Spacing => out.new_line()?, }; Ok(()) } } impl<'a, T> From<&'a T> for Variable where T: Into<Variable> + Clone { fn from(value: &'a T) -> Variable { value.clone().into() } } impl<'a> From<&'a str> for Variable { fn from(value: &'a str) -> Variable { Variable::Literal(value.to_owned()) } } impl From<String> for Variable { fn from(value: String) -> Variable { Variable::Literal(value) } } impl From<Statement> for Variable { fn from(value: Statement) -> Variable { Variable::Statement(value) } } impl From<Element> for Variable { fn from(value: Element) -> Variable { Variable::Element(value) } } fn java_quote_string(out: &mut ElementFormat, input: &str) -> Result<()> { out.write_char('"')?; for c in input.chars() { match c { '\t' => out.write_str("\\t")?, '\u{0007}' => out.write_str("\\b")?, '\n' => out.write_str("\\n")?, '\r' => out.write_str("\\r")?, '\u{0014}' => out.write_str("\\f")?, '\'' => out.write_str("\\'")?, '"' => out.write_str("\\\"")?, '\\' => out.write_str("\\\\")?, c => out.write_char(c)?, } } out.write_char('"')?; Ok(()) }