use serde::Serialize;
use std::collections::HashMap;
#[cfg_attr(docsrs, doc(cfg(feature = "optional-builders")))]
#[cfg(feature = "optional-builders")]
#[derive(Debug)]
pub struct StackTraceCodeBuilder {
code: HashMap<usize, String>,
}
#[cfg_attr(docsrs, doc(cfg(feature = "optional-builders")))]
#[cfg(feature = "optional-builders")]
impl StackTraceCodeBuilder {
pub fn add<'a>(
&mut self,
line_number: usize,
code: impl Into<&'a str>,
) -> &mut Self {
self.code.insert(line_number, code.into().to_string());
self
}
pub fn set_code(&mut self, code: HashMap<usize, String>) -> &mut Self {
self.code = code;
self
}
pub fn remove(&mut self, line_number: usize) -> &mut Self {
self.code.remove(&line_number);
self
}
pub fn get(&self, index: usize) -> Option<String> {
match self.code.get(&index) {
Some(code) => Some(code.clone()),
None => None,
}
}
pub fn code(&self) -> &HashMap<usize, String> {
&self.code
}
pub fn build(&self) -> StackTraceCode {
StackTraceCode { code: self.code.clone() }
}
}
#[derive(Clone, Default, Debug, Serialize, Eq, PartialEq)]
pub struct StackTraceCode {
#[serde(flatten)]
pub code: HashMap<usize, String>,
}
#[cfg_attr(docsrs, doc(cfg(feature = "optional-builders")))]
#[cfg(feature = "optional-builders")]
impl StackTraceCode {
pub fn builder() -> StackTraceCodeBuilder {
StackTraceCodeBuilder { code: HashMap::default() }
}
}
impl From<&[(usize, &str)]> for StackTraceCode {
fn from(value: &[(usize, &str)]) -> Self {
let mut code: HashMap<usize, String> = HashMap::default();
value.into_iter().for_each(|(line_number, line)| {
code.insert(*line_number, line.to_string());
});
StackTraceCode { code }
}
}
impl<T, J> From<HashMap<T, J>> for StackTraceCode
where
HashMap<usize, std::string::String>: From<HashMap<T, J>>,
{
fn from(value: HashMap<T, J>) -> Self {
StackTraceCode { code: value.into() }
}
}
#[cfg(feature = "optional-builders")]
#[cfg(test)]
mod tests {
mod error_payload {
use crate::error::payload::events::StackTraceCode;
#[test]
pub fn test_stack_trace_code_builder() {
let mut builder = StackTraceCode::builder();
builder
.add(10, "PRINT HELLO")
.add(20, "PRINT WORLD")
.add(30, "GOTO 10");
assert_eq!(builder.code().len(), 3);
assert_eq!("PRINT HELLO", builder.get(10).unwrap());
assert_eq!("PRINT WORLD", builder.get(20).unwrap());
assert_eq!("GOTO 10", builder.get(30).unwrap());
builder.add(30, "The end");
assert_eq!(builder.code().len(), 3);
assert_eq!("PRINT HELLO", builder.get(10).unwrap());
assert_eq!("PRINT WORLD", builder.get(20).unwrap());
assert_eq!("The end", builder.get(30).unwrap());
}
}
}