-
Notifications
You must be signed in to change notification settings - Fork 286
Specialize empty key value pairs #576
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,55 +1,87 @@ | ||
| //! WARNING: this is not part of the crate's public API and is subject to change at any time | ||
|
|
||
| use self::sealed::KVs; | ||
| use crate::{Level, Metadata, Record}; | ||
| use std::fmt::Arguments; | ||
| pub use std::option::Option; | ||
| pub use std::{file, format_args, line, module_path, stringify}; | ||
|
|
||
| #[cfg(feature = "kv_unstable")] | ||
| pub type Value<'a> = dyn crate::kv::value::ToValue + 'a; | ||
|
|
||
| #[cfg(not(feature = "kv_unstable"))] | ||
| pub fn log( | ||
| pub type Value<'a> = str; | ||
|
|
||
| mod sealed { | ||
| /// Types for the `kv` argument. | ||
| pub trait KVs<'a> { | ||
| fn into_kvs(self) -> Option<&'a [(&'a str, &'a super::Value<'a>)]>; | ||
| } | ||
| } | ||
|
|
||
| // Types for the `kv` argument. | ||
|
|
||
| impl<'a> KVs<'a> for &'a [(&'a str, &'a Value<'a>)] { | ||
| #[inline] | ||
| fn into_kvs(self) -> Option<&'a [(&'a str, &'a Value<'a>)]> { | ||
| Some(self) | ||
| } | ||
| } | ||
|
|
||
| impl<'a> KVs<'a> for () { | ||
| #[inline] | ||
| fn into_kvs(self) -> Option<&'a [(&'a str, &'a Value<'a>)]> { | ||
| None | ||
| } | ||
| } | ||
|
|
||
| // Log implementation. | ||
|
|
||
| fn log_impl( | ||
| args: Arguments, | ||
| level: Level, | ||
| &(target, module_path, file): &(&str, &'static str, &'static str), | ||
| line: u32, | ||
| kvs: Option<&[(&str, &str)]>, | ||
| kvs: Option<&[(&str, &Value)]>, | ||
| ) { | ||
| #[cfg(not(feature = "kv_unstable"))] | ||
| if kvs.is_some() { | ||
| panic!( | ||
| "key-value support is experimental and must be enabled using the `kv_unstable` feature" | ||
| ) | ||
| } | ||
|
|
||
| crate::logger().log( | ||
| &Record::builder() | ||
| .args(args) | ||
| .level(level) | ||
| .target(target) | ||
| .module_path_static(Some(module_path)) | ||
| .file_static(Some(file)) | ||
| .line(Some(line)) | ||
| .build(), | ||
| ); | ||
| let mut builder = Record::builder(); | ||
|
|
||
| builder | ||
| .args(args) | ||
| .level(level) | ||
| .target(target) | ||
| .module_path_static(Some(module_path)) | ||
| .file_static(Some(file)) | ||
| .line(Some(line)); | ||
|
|
||
| #[cfg(feature = "kv_unstable")] | ||
| builder.key_values(&kvs); | ||
|
|
||
| crate::logger().log(&builder.build()); | ||
| } | ||
|
|
||
| #[cfg(feature = "kv_unstable")] | ||
| pub fn log( | ||
| pub fn log<'a, K>( | ||
| args: Arguments, | ||
| level: Level, | ||
| &(target, module_path, file): &(&str, &'static str, &'static str), | ||
| target_module_path_and_file: &(&str, &'static str, &'static str), | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Besides, does this change affect significantly? Or just some identical refactor. |
||
| line: u32, | ||
| kvs: Option<&[(&str, &dyn crate::kv::ToValue)]>, | ||
| ) { | ||
| crate::logger().log( | ||
| &Record::builder() | ||
| .args(args) | ||
| .level(level) | ||
| .target(target) | ||
| .module_path_static(Some(module_path)) | ||
| .file_static(Some(file)) | ||
| .line(Some(line)) | ||
| .key_values(&kvs) | ||
| .build(), | ||
| ); | ||
| kvs: K, | ||
| ) where | ||
| K: KVs<'a>, | ||
| { | ||
| log_impl( | ||
| args, | ||
| level, | ||
| target_module_path_and_file, | ||
| line, | ||
| kvs.into_kvs(), | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @EFanZh we still pass Could you elaborate a bit on how moving the type convert one level down can help? I'm trying to understand how the extra abstract works (and avoid breaking it in any following patch).
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Sometimes the |
||
| ) | ||
| } | ||
|
|
||
| pub fn enabled(level: Level, target: &str) -> bool { | ||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.