2023-05-23 22:06:11 +00:00
|
|
|
/* relish: versatile lisp shell
|
|
|
|
|
* Copyright (C) 2021 Aidan Hahn
|
|
|
|
|
*
|
|
|
|
|
* 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 <http://www.gnu.org/licenses/>.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
use std::fmt;
|
|
|
|
|
|
|
|
|
|
#[derive(Debug, Clone)]
|
|
|
|
|
pub struct TraceItem {
|
|
|
|
|
pub caller: String,
|
|
|
|
|
pub message: String,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[derive(Debug, Clone)]
|
|
|
|
|
pub struct Traceback(pub Vec<TraceItem>);
|
|
|
|
|
|
|
|
|
|
pub fn start_trace(item: TraceItem) -> Traceback {
|
|
|
|
|
Traceback::new().with_trace(item)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl Traceback {
|
|
|
|
|
pub fn new() -> Traceback {
|
|
|
|
|
Traceback(vec![])
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn with_trace(&self, item: TraceItem) -> Traceback {
|
|
|
|
|
let mut next = Traceback(self.0.clone());
|
|
|
|
|
next.0.push(item);
|
|
|
|
|
next
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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...")
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-05-28 23:22:49 +00:00
|
|
|
|
|
|
|
|
impl std::convert::From<Traceback> for String {
|
|
|
|
|
fn from(arg: Traceback) -> Self {
|
|
|
|
|
format!("{}", arg)
|
2023-05-23 22:06:11 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl std::convert::From<(&String, &str)> for TraceItem {
|
|
|
|
|
fn from(value: (&String, &str)) -> Self {
|
|
|
|
|
TraceItem {
|
|
|
|
|
caller: value.0.clone(),
|
|
|
|
|
message: String::from(value.1),
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl std::convert::From<(&String, String)> for TraceItem {
|
|
|
|
|
fn from(value: (&String, String)) -> Self {
|
|
|
|
|
TraceItem {
|
|
|
|
|
caller: value.0.clone(),
|
|
|
|
|
message: value.1,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl std::convert::From<(&str, String)> for TraceItem {
|
|
|
|
|
fn from(value: (&str, String)) -> Self {
|
|
|
|
|
TraceItem {
|
|
|
|
|
caller: String::from(value.0),
|
|
|
|
|
message: value.1,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl std::convert::From<(&str, &str)> for TraceItem {
|
|
|
|
|
fn from(value: (&str, &str)) -> Self {
|
|
|
|
|
TraceItem {
|
|
|
|
|
caller: String::from(value.0),
|
|
|
|
|
message: String::from(value.1),
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|