I am trying to implement value key pairs whose key would be a string and the value would be an object type that implements some predefined functions. The problem I encounter is that a Trait (which I use in this case as a kind of inheritance) does not have a predefined size and is not threads safely.
Code
Create Trait and structs
/// _State line to define the basis of the 'State'
/// type with signatures of specific functions
pub trait _State {
fn as_string(&self, text: String) -> String;
fn print(&self);
}
/// Status type to add your custom colors
pub struct RGBState {
name: String,
color: (u8, u8, u8),
character: String,
}
/// Default state type using preconfigured ANSI colors
pub struct State {
name: String,
color: Color,
character: String,
}
Create a global and mutable HashMap with Traits as values
lazy_static! {
static ref StateOK: Mutex<State> = {
let mut state = State{
name: String::from("OK"),
color: Color::Green,
character: "+".to_string()
};
Mutex::new(state)
};
static ref STATES: Mutex<HashMap<&'static str, &'static Lazy<Mutex<dyn _State + 'static>>>> = {
let mut _states = HashMap::from(
[
(
"OK",
Lazy::new(StateOK)
)
]
);
Mutex::new(_states)
};
}
All source code is available on github (not compilable yiet): https://github.com/mauricelambert/TerminalMessages
Context
I use the external library lazy_static.
Assumptions
I guess I should use the Mutex, Lazy or other types that would allow me to make a mutable and global value.
Problem
I have no idea how I will define the size of the objects that I will define in values and that can be of different types whose common basis are function signatures.
- I have at least 2 types of objects that implement the Trait and that can be added as a value: a 'simple' type with preconfigured colors and a more complex type or the colors are created by the developer with 3 octects (RGB - Red Green Blue).
Project
The overall purpose of my code is to implement a DLL in Rust with interfaces in other languages that would allow to display formatted and colored messages in the console. Each element of the message formatting must be "configurable" by the developer (the color, the character that represents the type of message, the progress bar ect...). It must be able to use any of these message types by calling a function in which it will have to specify the message type and the content of the message.
Example/Demonstration
I implemented similar code in Python whose source code is on github: https://github.com/mauricelambert/PythonToolsKit/blob/main/PythonToolsKit/PrintF.py. Here is a screenshot that represents what I would like to implement in this DLL: !TerminalMessages demonstration
Additionally
I am interested in all the suggestions about Best Practices in Rust and Code Optimization.