atagen

matrix-rust-sdk

public
Star0
Watch0
ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk.git

Blame: bindings/matrix-sdk-crypto-ffi/src/logger.rs

7ff8adafe9e4atagen2026-10-22 12:30 UTC1
use std::{
7ff8adafe9e4atagen2026-10-22 12:30 UTC2
    io::{Result, Write},
7ff8adafe9e4atagen2026-10-22 12:30 UTC3
    sync::{Arc, Mutex},
7ff8adafe9e4atagen2026-10-22 12:30 UTC4
};
7ff8adafe9e4atagen2026-10-22 12:30 UTC5
7ff8adafe9e4atagen2026-10-22 12:30 UTC6
use tracing_subscriber::{EnvFilter, fmt::MakeWriter};
7ff8adafe9e4atagen2026-10-22 12:30 UTC7
7ff8adafe9e4atagen2026-10-22 12:30 UTC8
/// Trait that can be used to forward Rust logs over FFI to a language specific
7ff8adafe9e4atagen2026-10-22 12:30 UTC9
/// logger.
7ff8adafe9e4atagen2026-10-22 12:30 UTC10
#[matrix_sdk_ffi_macros::export(callback_interface)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC11
pub trait Logger: Send {
7ff8adafe9e4atagen2026-10-22 12:30 UTC12
    /// Called every time the Rust side wants to post a log line.
7ff8adafe9e4atagen2026-10-22 12:30 UTC13
    fn log(&self, log_line: String);
7ff8adafe9e4atagen2026-10-22 12:30 UTC14
    // TODO add support for different log levels, do this by adding more methods
7ff8adafe9e4atagen2026-10-22 12:30 UTC15
    // to the trait.
7ff8adafe9e4atagen2026-10-22 12:30 UTC16
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC17
7ff8adafe9e4atagen2026-10-22 12:30 UTC18
impl Write for LoggerWrapper {
7ff8adafe9e4atagen2026-10-22 12:30 UTC19
    fn write(&mut self, buf: &[u8]) -> Result<usize> {
7ff8adafe9e4atagen2026-10-22 12:30 UTC20
        let data = String::from_utf8_lossy(buf).to_string();
7ff8adafe9e4atagen2026-10-22 12:30 UTC21
        self.inner.lock().unwrap().log(data);
7ff8adafe9e4atagen2026-10-22 12:30 UTC22
7ff8adafe9e4atagen2026-10-22 12:30 UTC23
        Ok(buf.len())
7ff8adafe9e4atagen2026-10-22 12:30 UTC24
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC25
7ff8adafe9e4atagen2026-10-22 12:30 UTC26
    fn flush(&mut self) -> Result<()> {
7ff8adafe9e4atagen2026-10-22 12:30 UTC27
        Ok(())
7ff8adafe9e4atagen2026-10-22 12:30 UTC28
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC29
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC30
7ff8adafe9e4atagen2026-10-22 12:30 UTC31
impl MakeWriter<'_> for LoggerWrapper {
7ff8adafe9e4atagen2026-10-22 12:30 UTC32
    type Writer = LoggerWrapper;
7ff8adafe9e4atagen2026-10-22 12:30 UTC33
7ff8adafe9e4atagen2026-10-22 12:30 UTC34
    fn make_writer(&self) -> Self::Writer {
7ff8adafe9e4atagen2026-10-22 12:30 UTC35
        self.clone()
7ff8adafe9e4atagen2026-10-22 12:30 UTC36
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC37
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC38
7ff8adafe9e4atagen2026-10-22 12:30 UTC39
#[derive(Clone)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC40
pub struct LoggerWrapper {
7ff8adafe9e4atagen2026-10-22 12:30 UTC41
    inner: Arc<Mutex<Box<dyn Logger>>>,
7ff8adafe9e4atagen2026-10-22 12:30 UTC42
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC43
7ff8adafe9e4atagen2026-10-22 12:30 UTC44
/// Set the logger that should be used to forward Rust logs over FFI.
7ff8adafe9e4atagen2026-10-22 12:30 UTC45
#[matrix_sdk_ffi_macros::export]
7ff8adafe9e4atagen2026-10-22 12:30 UTC46
pub fn set_logger(logger: Box<dyn Logger>) {
7ff8adafe9e4atagen2026-10-22 12:30 UTC47
    let logger = LoggerWrapper { inner: Arc::new(Mutex::new(logger)) };
7ff8adafe9e4atagen2026-10-22 12:30 UTC48
7ff8adafe9e4atagen2026-10-22 12:30 UTC49
    let filter = EnvFilter::from_default_env()
7ff8adafe9e4atagen2026-10-22 12:30 UTC50
        .add_directive(
7ff8adafe9e4atagen2026-10-22 12:30 UTC51
            "matrix_sdk_crypto=trace".parse().expect("Can't parse logging filter directive"),
7ff8adafe9e4atagen2026-10-22 12:30 UTC52
        )
7ff8adafe9e4atagen2026-10-22 12:30 UTC53
        .add_directive(
7ff8adafe9e4atagen2026-10-22 12:30 UTC54
            "matrix_sdk_sqlite=debug".parse().expect("Can't parse logging filter directive"),
7ff8adafe9e4atagen2026-10-22 12:30 UTC55
        );
7ff8adafe9e4atagen2026-10-22 12:30 UTC56
7ff8adafe9e4atagen2026-10-22 12:30 UTC57
    let _ = tracing_subscriber::fmt()
7ff8adafe9e4atagen2026-10-22 12:30 UTC58
        .with_writer(logger)
7ff8adafe9e4atagen2026-10-22 12:30 UTC59
        .with_env_filter(filter)
7ff8adafe9e4atagen2026-10-22 12:30 UTC60
        .with_ansi(false)
7ff8adafe9e4atagen2026-10-22 12:30 UTC61
        .without_time()
7ff8adafe9e4atagen2026-10-22 12:30 UTC62
        .try_init();
7ff8adafe9e4atagen2026-10-22 12:30 UTC63
}