/* Flesh: Flexible Shell * Copyright (C) 2021 Ava Affine * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ use alloc::vec::Vec; use alloc::string::String; use core::fmt; use core::convert; #[derive(Debug, Clone)] pub struct TraceItem { pub caller: String, pub message: String, } #[derive(Debug, Clone)] pub struct Traceback(pub Vec); pub fn start_trace(item: TraceItem) -> Traceback { Traceback::new().with_trace(item) } impl Traceback { pub fn new() -> Traceback { Traceback(Vec::new()) } pub fn with_trace(mut self, item: TraceItem) -> Traceback { self.0.push(item); self } pub fn depth(&self) -> usize { self.0.len() } } impl fmt::Display for Traceback { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { _ = writeln!(f, "** ERROR TRACEBACK"); for trace in self.0.iter().rev() { _ = writeln!(f, " > {}: {}", trace.caller, trace.message); } writeln!(f, "Please refactor forms and try again...") } } impl convert::From for String { fn from(arg: Traceback) -> Self { format!("{}", arg) } } impl convert::From<(&String, &str)> for TraceItem { fn from(value: (&String, &str)) -> Self { TraceItem { caller: value.0.clone(), message: String::from(value.1), } } } impl convert::From<(&String, String)> for TraceItem { fn from(value: (&String, String)) -> Self { TraceItem { caller: value.0.clone(), message: value.1, } } } impl convert::From<(&str, String)> for TraceItem { fn from(value: (&str, String)) -> Self { TraceItem { caller: String::from(value.0), message: value.1, } } } impl convert::From<(&str, &str)> for TraceItem { fn from(value: (&str, &str)) -> Self { TraceItem { caller: String::from(value.0), message: String::from(value.1), } } }