1use std::panic::Location;
2use std::fs::File;
3use std::io::{BufReader, BufRead};
4use std::fmt::Display;
5use crate::RunVar;
6use crate::RE;
7
8#[derive(Clone)]
9pub struct RunMod {
10 value: RunVar,
11 file_name: String,
12 line_number: u32,
13}
14
15impl RunMod {
16 #[track_caller]
28 pub fn new(val: RunVar) -> Self {
29 let loc = Location::caller();
30
31 Self {
32 value: val,
33 file_name: loc.file().to_string(),
34 line_number: loc.line(),
35 }
36 }
37
38
39 fn extract_runvar_arg(line: &str) -> Option<String> {
40 RE.captures(line).map(|caps| caps[1].trim().to_string())
41 }
42
43 make_runner!(get_i8, I8, i8);
44 make_runner!(get_i16, I16, i16);
45 make_runner!(get_i32, I32, i32);
46 make_runner!(get_i64, I64, i64);
47 make_runner!(get_i128, I128, i128);
48 make_runner!(get_isize, ISIZE, isize);
49 make_runner!(get_u8, U8, u8);
50 make_runner!(get_u16, U16, u16);
51 make_runner!(get_u32, U32, u32);
52 make_runner!(get_u64, U64, u64);
53 make_runner!(get_u128, U128, u128);
54 make_runner!(get_usize, USIZE, usize);
55 make_runner!(get_f32, F32, f32);
56 make_runner!(get_f64, F64, f64);
57}
58
59impl From<RunVar> for RunMod {
60 #[track_caller]
61 fn from(value: RunVar) -> Self {
62 let loc = Location::caller();
63
64 Self {
65 value,
66 line_number: loc.line(),
67 file_name: loc.file().to_string(),
68 }
69 }
70}
71
72impl Display for RunMod {
73 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
74 write!(f, "{}", self.value)?;
75 Ok(())
76 }
77}