X-Git-Url: http://git.bitcoin.ninja/index.cgi?p=ldk-c-bindings;a=blobdiff_plain;f=lightning-c-bindings%2Fsrc%2Flightning%2Futil%2Flogger.rs;h=cec6bb5c2035480a69f7994dd2bbab496e1e5e86;hp=3cfcf6dbea454c0c9394207aa75cde3fb31339cc;hb=a82e075188fc15a103234832686915c196bfe240;hpb=d9866e870bbe080412dc70b1421e28a756e4407e diff --git a/lightning-c-bindings/src/lightning/util/logger.rs b/lightning-c-bindings/src/lightning/util/logger.rs index 3cfcf6d..cec6bb5 100644 --- a/lightning-c-bindings/src/lightning/util/logger.rs +++ b/lightning-c-bindings/src/lightning/util/logger.rs @@ -13,6 +13,7 @@ //! The second one, client-side by implementing check against Record Level field. //! Each module may have its own Logger or share one. +use std::str::FromStr; use std::ffi::c_void; use bitcoin::hashes::Hash; use crate::c_types::*; @@ -22,63 +23,57 @@ use crate::c_types::*; #[derive(Clone)] #[repr(C)] pub enum Level { - ///Designates logger being silent - Off, - /// Designates very serious errors - Error, - /// Designates hazardous situations - Warn, - /// Designates useful information - Info, - /// Designates lower priority information - Debug, /// Designates very low priority, often extremely verbose, information Trace, + /// Designates lower priority information + Debug, + /// Designates useful information + Info, + /// Designates hazardous situations + Warn, + /// Designates very serious errors + Error, } use lightning::util::logger::Level as nativeLevel; impl Level { #[allow(unused)] pub(crate) fn to_native(&self) -> nativeLevel { match self { - Level::Off => nativeLevel::Off, - Level::Error => nativeLevel::Error, - Level::Warn => nativeLevel::Warn, - Level::Info => nativeLevel::Info, - Level::Debug => nativeLevel::Debug, Level::Trace => nativeLevel::Trace, + Level::Debug => nativeLevel::Debug, + Level::Info => nativeLevel::Info, + Level::Warn => nativeLevel::Warn, + Level::Error => nativeLevel::Error, } } #[allow(unused)] pub(crate) fn into_native(self) -> nativeLevel { match self { - Level::Off => nativeLevel::Off, - Level::Error => nativeLevel::Error, - Level::Warn => nativeLevel::Warn, - Level::Info => nativeLevel::Info, - Level::Debug => nativeLevel::Debug, Level::Trace => nativeLevel::Trace, + Level::Debug => nativeLevel::Debug, + Level::Info => nativeLevel::Info, + Level::Warn => nativeLevel::Warn, + Level::Error => nativeLevel::Error, } } #[allow(unused)] pub(crate) fn from_native(native: &nativeLevel) -> Self { match native { - nativeLevel::Off => Level::Off, - nativeLevel::Error => Level::Error, - nativeLevel::Warn => Level::Warn, - nativeLevel::Info => Level::Info, - nativeLevel::Debug => Level::Debug, nativeLevel::Trace => Level::Trace, + nativeLevel::Debug => Level::Debug, + nativeLevel::Info => Level::Info, + nativeLevel::Warn => Level::Warn, + nativeLevel::Error => Level::Error, } } #[allow(unused)] pub(crate) fn native_into(native: nativeLevel) -> Self { match native { - nativeLevel::Off => Level::Off, - nativeLevel::Error => Level::Error, - nativeLevel::Warn => Level::Warn, - nativeLevel::Info => Level::Info, - nativeLevel::Debug => Level::Debug, nativeLevel::Trace => Level::Trace, + nativeLevel::Debug => Level::Debug, + nativeLevel::Info => Level::Info, + nativeLevel::Warn => Level::Warn, + nativeLevel::Error => Level::Error, } } } @@ -87,6 +82,41 @@ impl Level { pub extern "C" fn Level_clone(orig: &Level) -> Level { orig.clone() } +#[no_mangle] +/// Utility method to constructs a new Trace-variant Level +pub extern "C" fn Level_trace() -> Level { + Level::Trace} +#[no_mangle] +/// Utility method to constructs a new Debug-variant Level +pub extern "C" fn Level_debug() -> Level { + Level::Debug} +#[no_mangle] +/// Utility method to constructs a new Info-variant Level +pub extern "C" fn Level_info() -> Level { + Level::Info} +#[no_mangle] +/// Utility method to constructs a new Warn-variant Level +pub extern "C" fn Level_warn() -> Level { + Level::Warn} +#[no_mangle] +/// Utility method to constructs a new Error-variant Level +pub extern "C" fn Level_error() -> Level { + Level::Error} +/// Checks if two Levels contain equal inner contents. +/// This ignores pointers and is_owned flags and looks at the values in fields. +#[no_mangle] +pub extern "C" fn Level_eq(a: &Level, b: &Level) -> bool { + if &a.to_native() == &b.to_native() { true } else { false } +} +/// Checks if two Levels contain equal inner contents. +#[no_mangle] +pub extern "C" fn Level_hash(o: &Level) -> u64 { + // Note that we'd love to use std::collections::hash_map::DefaultHasher but it's not in core + #[allow(deprecated)] + let mut hasher = core::hash::SipHasher::new(); + std::hash::Hash::hash(&o.to_native(), &mut hasher); + std::hash::Hasher::finish(&hasher) +} /// Returns the most verbose logging level. #[must_use] #[no_mangle] @@ -107,12 +137,20 @@ pub struct Logger { /// Does not need to free the outer struct containing function pointers and may be NULL is no resources need to be freed. pub free: Option, } -unsafe impl Sync for Logger {} unsafe impl Send for Logger {} +unsafe impl Sync for Logger {} +#[no_mangle] +pub(crate) extern "C" fn Logger_clone_fields(orig: &Logger) -> Logger { + Logger { + this_arg: orig.this_arg, + log: Clone::clone(&orig.log), + free: Clone::clone(&orig.free), + } +} use lightning::util::logger::Logger as rustLogger; impl rustLogger for Logger { - fn log(&self, record: &lightning::util::logger::Record) { + fn log(&self, mut record: &lightning::util::logger::Record) { let mut local_record = std::ffi::CString::new(format!("{}", record.args)).unwrap(); (self.log)(self.this_arg, local_record.as_ptr()) }