Skip to content

Commit fc18d00

Browse files
committed
Add custom logger API.
1 parent b25d6d4 commit fc18d00

2 files changed

Lines changed: 57 additions & 13 deletions

File tree

docs/logging.md

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,3 +47,37 @@ If the `log` feature is not enabled, then `jack` will log info messages to
4747
```rust
4848
jack::set_logger(jack::LoggerType::Stdio);
4949
```
50+
51+
## Custom
52+
53+
`jack::LoggerType::Custom` can be used to set a custom logger. Here is
54+
stdout/stderr implemented as a custom logger:
55+
56+
```rust
57+
fn main() {
58+
jack::set_logger(jack::LoggerType::Custom{info: stdout_handler, error: stderr_handler});
59+
...
60+
}
61+
62+
unsafe extern "C" fn stdout_handler(msg: *const libc::c_char) {
63+
let res = std::panic::catch_unwind(|| match std::ffi::CStr::from_ptr(msg).to_str() {
64+
Ok(msg) => println!("{}", msg),
65+
Err(err) => println!("failed to log to JACK info: {:?}", err),
66+
});
67+
if let Err(err) = res {
68+
eprintln!("{err:?}");
69+
std::mem::forget(err); // Prevent from rethrowing panic.
70+
}
71+
}
72+
73+
unsafe extern "C" fn stderr_handler(msg: *const libc::c_char) {
74+
let res = std::panic::catch_unwind(|| match std::ffi::CStr::from_ptr(msg).to_str() {
75+
Ok(msg) => eprintln!("{}", msg),
76+
Err(err) => eprintln!("failed to log to JACK error: {:?}", err),
77+
});
78+
if let Err(err) = res {
79+
eprintln!("{err:?}");
80+
std::mem::forget(err); // Prevent from rethrowing panic.
81+
}
82+
}
83+
```

src/logging.rs

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,13 @@ pub enum LoggerType {
2121
/// Use the info! and error! macro from the [log crate](https://crates.io/crates/log).
2222
#[cfg(feature = "log")]
2323
Log,
24+
/// Use custom functions to handle logging.
25+
Custom {
26+
/// The function to call for info messages. Must not panic.
27+
info: unsafe extern "C" fn(*const ::libc::c_char),
28+
/// The function to call for error messages. Must not panic.
29+
error: unsafe extern "C" fn(*const ::libc::c_char),
30+
},
2431
}
2532

2633
impl Default for LoggerType {
@@ -45,20 +52,23 @@ pub fn set_logger(logger: LoggerType) {
4552
}
4653

4754
fn set_logger_impl(logger: LoggerType) {
48-
match logger {
49-
LoggerType::None => unsafe {
50-
jack_sys::jack_set_error_function(Some(silent_handler));
51-
jack_sys::jack_set_info_function(Some(silent_handler));
52-
},
53-
LoggerType::Stdio => unsafe {
54-
jack_sys::jack_set_error_function(Some(stderr_handler));
55-
jack_sys::jack_set_info_function(Some(stdout_handler));
56-
},
55+
let info_fn = match logger {
56+
LoggerType::None => silent_handler,
57+
LoggerType::Stdio => stdout_handler,
5758
#[cfg(feature = "log")]
58-
LoggerType::Log => unsafe {
59-
jack_sys::jack_set_error_function(Some(error_handler));
60-
jack_sys::jack_set_info_function(Some(info_handler));
61-
},
59+
LoggerType::Log => info_handler,
60+
LoggerType::Custom { info, .. } => info,
61+
};
62+
let error_fn = match logger {
63+
LoggerType::None => silent_handler,
64+
LoggerType::Stdio => stderr_handler,
65+
#[cfg(feature = "log")]
66+
LoggerType::Log => error_handler,
67+
LoggerType::Custom { error, .. } => error,
68+
};
69+
unsafe {
70+
jack_sys::jack_set_error_function(Some(error_fn));
71+
jack_sys::jack_set_info_function(Some(info_fn));
6272
}
6373
}
6474

0 commit comments

Comments
 (0)