Вопрос
Мне интересно, есть ли способ улучшить текущую структуру некоторых функций в моей программе, поскольку я чувствую, что происходит довольно много нежелательных повторений.
Справочная информация
Я пишу крошечный регистратор, чтобы приложения CLI могли иметь более симпатичный текст в терминале. У меня есть пара функций, которые добавляют некоторые значки к тому, что собирается в стандартный вывод, например success()
, он принимает сообщение и добавляет к нему зеленую галочку, также как и error()
, warn()
et c. Все они могут либо добавить символ новой строки в конце, либо игнорировать его в зависимости от того, вызвал ли пользователь same()
перед ним.
В настоящее время они используют три функции, определенные ниже, чтобы решить, добавлять ли новую строку, и нужно ли добавлять метку времени.
Код
/// Outputs to stdout with an icon
fn output<T: Display>(&mut self, message: T, icon: LogIcon) {
let timestamp = self.timestamp();
if self.same_line {
print!("{} {}{}", icon, timestamp, message);
} else {
println!("{} {}{}", icon, timestamp, message);
}
self.same_line = false;
}
/// Outputs to stderr with an icon
fn output_error<T: Display>(&mut self, message: T, icon: LogIcon) {
let timestamp = self.timestamp();
if self.same_line {
eprint!("{} {}{}", icon, timestamp, message);
} else {
eprintln!("{} {}{}", icon, timestamp, message);
}
self.same_line = false;
}
/// Outputs to stdout normally
fn output_normal<T: Display>(&mut self, message: T) {
let timestamp = self.timestamp();
if self.same_line {
print!("{}{}", timestamp, message);
} else {
println!("{}{}", timestamp, message);
}
self.same_line = false;
}
Вот как функция success
использует функцию вывода в данный момент:
pub fn success<T: Display>(&mut self, message: T) {
self.output(message, LogIcon::CheckMark);
}
То же самое относится ко всем другим функциям, они либо выводят на stderr
, либо stdout
.