From 6575cf8b36aa35c13b8202d5aed0cd5f008bd54b Mon Sep 17 00:00:00 2001 From: DongHun Kwak Date: Mon, 13 Mar 2023 14:37:49 +0900 Subject: [PATCH] Import kv-log-macro 1.0.7 --- .cargo_vcs_info.json | 5 + .github/CODE_OF_CONDUCT.md | 75 +++++++ .github/CONTRIBUTING.md | 55 +++++ .github/ISSUE_TEMPLATE.md | 9 + .github/ISSUE_TEMPLATE/bug_report.md | 23 ++ .github/ISSUE_TEMPLATE/feature_request.md | 43 ++++ .github/ISSUE_TEMPLATE/question.md | 18 ++ .github/PULL_REQUEST_TEMPLATE.md | 14 ++ .github/stale.yml | 17 ++ .gitignore | 7 + .travis.yml | 13 ++ CHANGELOG.md | 54 +++++ Cargo.toml | 29 +++ Cargo.toml.orig | 18 ++ LICENSE-APACHE | 190 +++++++++++++++++ LICENSE-MIT | 21 ++ README.md | 62 ++++++ examples/main.rs | 14 ++ src/lib.rs | 244 ++++++++++++++++++++++ tests/test.rs | 6 + 20 files changed, 917 insertions(+) create mode 100644 .cargo_vcs_info.json create mode 100644 .github/CODE_OF_CONDUCT.md create mode 100644 .github/CONTRIBUTING.md create mode 100644 .github/ISSUE_TEMPLATE.md create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/ISSUE_TEMPLATE/question.md create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 .github/stale.yml create mode 100644 .gitignore create mode 100644 .travis.yml create mode 100644 CHANGELOG.md create mode 100644 Cargo.toml create mode 100644 Cargo.toml.orig create mode 100644 LICENSE-APACHE create mode 100644 LICENSE-MIT create mode 100644 README.md create mode 100644 examples/main.rs create mode 100644 src/lib.rs create mode 100644 tests/test.rs diff --git a/.cargo_vcs_info.json b/.cargo_vcs_info.json new file mode 100644 index 0000000..7038263 --- /dev/null +++ b/.cargo_vcs_info.json @@ -0,0 +1,5 @@ +{ + "git": { + "sha1": "b1ec3d2194835a83146d7b720203b5f9c731bc58" + } +} diff --git a/.github/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..3b6645e --- /dev/null +++ b/.github/CODE_OF_CONDUCT.md @@ -0,0 +1,75 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, gender identity and expression, level of +experience, +education, socio-economic status, nationality, personal appearance, race, +religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +- Using welcoming and inclusive language +- Being respectful of differing viewpoints and experiences +- Gracefully accepting constructive criticism +- Focusing on what is best for the community +- Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +- The use of sexualized language or imagery and unwelcome sexual attention or +advances +- Trolling, insulting/derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or electronic +address, without explicit permission +- Other conduct which could reasonably be considered inappropriate in a +professional setting + + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at yoshuawuyts@gmail.com, or through +IRC. All complaints will be reviewed and investigated and will result in a +response that is deemed necessary and appropriate to the circumstances. The +project team is obligated to maintain confidentiality with regard to the +reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the Contributor Covenant, version 1.4, +available at +https://www.contributor-covenant.org/version/1/4/code-of-conduct.html diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md new file mode 100644 index 0000000..9650c09 --- /dev/null +++ b/.github/CONTRIBUTING.md @@ -0,0 +1,55 @@ +# Contributing +Contributions include code, documentation, answering user questions, running the +project's infrastructure, and advocating for all types of users. + +The project welcomes all contributions from anyone willing to work in good faith +with other contributors and the community. No contribution is too small and all +contributions are valued. + +This guide explains the process for contributing to the project's GitHub +Repository. + +- [Code of Conduct](#code-of-conduct) +- [Bad Actors](#bad-actors) + +## Code of Conduct +The project has a [Code of Conduct](./CODE_OF_CONDUCT.md) that *all* +contributors are expected to follow. This code describes the *minimum* behavior +expectations for all contributors. + +As a contributor, how you choose to act and interact towards your +fellow contributors, as well as to the community, will reflect back not only +on yourself but on the project as a whole. The Code of Conduct is designed and +intended, above all else, to help establish a culture within the project that +allows anyone and everyone who wants to contribute to feel safe doing so. + +Should any individual act in any way that is considered in violation of the +[Code of Conduct](./CODE_OF_CONDUCT.md), corrective actions will be taken. It is +possible, however, for any individual to *act* in such a manner that is not in +violation of the strict letter of the Code of Conduct guidelines while still +going completely against the spirit of what that Code is intended to accomplish. + +Open, diverse, and inclusive communities live and die on the basis of trust. +Contributors can disagree with one another so long as they trust that those +disagreements are in good faith and everyone is working towards a common +goal. + +## Bad Actors +All contributors to tacitly agree to abide by both the letter and +spirit of the [Code of Conduct](./CODE_OF_CONDUCT.md). Failure, or +unwillingness, to do so will result in contributions being respectfully +declined. + +A *bad actor* is someone who repeatedly violates the *spirit* of the Code of +Conduct through consistent failure to self-regulate the way in which they +interact with other contributors in the project. In doing so, bad actors +alienate other contributors, discourage collaboration, and generally reflect +poorly on the project as a whole. + +Being a bad actor may be intentional or unintentional. Typically, unintentional +bad behavior can be easily corrected by being quick to apologize and correct +course *even if you are not entirely convinced you need to*. Giving other +contributors the benefit of the doubt and having a sincere willingness to admit +that you *might* be wrong is critical for any successful open collaboration. + +Don't be a bad actor. diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100644 index 0000000..8d1cbf0 --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,9 @@ +## Summary +Explain what is going on. + +## Your Environment +| Software | Version(s) | +| ---------------- | ---------- | +| kv-log-macro | +| Rustc | +| Operating System | diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..3327a38 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,23 @@ +--- +name: Bug Report +about: Did something not work as expected? +--- + +# Bug Report +## Your Environment +| Software | Version(s) | +| ---------------- | ---------- | +| kv-log-macro | +| Rustc | +| Operating System | + +## Expected Behavior +Tell us what should have happened. + +## Current Behavior +Tell us what happens instead of the expected behavior. If you are seeing an +error, please include the full error message and stack trace. + +## Code Sample +Please provide a code repository, gist, code snippet or sample files to +reproduce the issue. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..1dbfb27 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,43 @@ +--- +name: Feature Request +about: Want us to add something to kv-log-macro? +--- + +# Feature Request +## Summary +One paragraph explanation of the feature. + +## Motivation +Why are we doing this? What use cases does it support? What is the expected +outcome? + +## Guide-level explanation +Explain the proposal as if it was already included in the project and you +were teaching it to another programmer. That generally means: + +- Introducing new named concepts. +- Explaining the feature largely in terms of examples. +- If applicable, provide sample error messages, deprecation warnings, or + migration guidance. + +## Reference-level explanation +This is the technical portion of the feature request. Explain the design in +sufficient detail that: + +- Its interaction with other features is clear. +- It is reasonably clear how the feature would be implemented. +- Corner cases are dissected by example. + +## Drawbacks +Why should we _not_ do this? + +## Rationale and alternatives +- Why is this design the best in the space of possible designs? +- What other designs have been considered and what is the rationale for not + choosing them? +- What is the impact of not doing this? + +## Unresolved Questions +What related issues do you consider out of scope for this feature that could be +addressed in the future independently of the solution that comes out of this +feature? diff --git a/.github/ISSUE_TEMPLATE/question.md b/.github/ISSUE_TEMPLATE/question.md new file mode 100644 index 0000000..2023e5d --- /dev/null +++ b/.github/ISSUE_TEMPLATE/question.md @@ -0,0 +1,18 @@ +--- +name: Question +about: Have any questions regarding how kv-log-macro works? +--- + +# Question +## Your Environment +| Software | Version(s) | +| ---------------- | ---------- | +| kv-log-macro | +| Rustc | +| Operating System | + +## Question +Provide your question here. + +## Context +How has this issue affected you? What are you trying to accomplish? diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..f714d6e --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,14 @@ + + +## Description + + +## Motivation and Context + + + +## Types of changes + +- [ ] Bug fix (non-breaking change which fixes an issue) +- [ ] New feature (non-breaking change which adds functionality) +- [ ] Breaking change (fix or feature that would cause existing functionality to change) diff --git a/.github/stale.yml b/.github/stale.yml new file mode 100644 index 0000000..60f4c1a --- /dev/null +++ b/.github/stale.yml @@ -0,0 +1,17 @@ +# Configuration for probot-stale - https://github.com/probot/stale + +daysUntilStale: 90 +daysUntilClose: 7 +exemptLabels: + - pinned + - security +exemptProjects: false +exemptMilestones: false +staleLabel: wontfix +markComment: > + This issue has been automatically marked as stale because it has not had + recent activity. It will be closed if no further activity occurs. Thank you + for your contributions. +unmarkComment: false +closeComment: false +limitPerRun: 30 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..209dbac --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +coverage/ +target/ +tmp/ +dist/ +npm-debug.log* +Cargo.lock +.DS_Store diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..a9eb401 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,13 @@ +language: rust +rust: + - stable + +before_script: | + rustup component add rustfmt-preview && + rustup component add clippy-preview +script: | + cargo fmt -- --check && + cargo clippy -- -D clippy && + cargo build --verbose && + cargo test --verbose +cache: cargo diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..bf3c6d6 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,54 @@ +## 2019-09-01, Version 1.0.4 +### Commits +- [[`9c938867f5`](https://github.com/yoshuawuyts/kv-log-macro/commit/9c938867f56dd7ec4642301e726493967f5057a3)] (cargo-release) version 1.0.4 (Yoshua Wuyts) +- [[`4d1cd07382`](https://github.com/yoshuawuyts/kv-log-macro/commit/4d1cd0738248dfe73aab97f04c8c741593e32ad6)] use ToValue as the bound for captured values (#1) (Ashley Mannix) +- [[`7cc2af3db3`](https://github.com/yoshuawuyts/kv-log-macro/commit/7cc2af3db316f1849cd06a810ab5b5285f864e88)] Update changelog (Yoshua Wuyts) + +### Stats +```diff + CHANGELOG.md | 38 ++++++++++++++++++++++++++++++++++++++ + Cargo.toml | 2 +- + examples/main.rs | 1 + + src/lib.rs | 31 ++----------------------------- + 4 files changed, 42 insertions(+), 30 deletions(-) +``` + + +## 2019-09-01, Version 1.0.3 +### Commits +- [[`5179f8418a`](https://github.com/yoshuawuyts/kv-log-macro/commit/5179f8418aee109e2131034d2d8675944ec8ca38)] (cargo-release) version 1.0.3 (Yoshua Wuyts) +- [[`ed25f609fe`](https://github.com/yoshuawuyts/kv-log-macro/commit/ed25f609fe17b3814c5dfd6801ca4b2ddd356dac)] fix lvl (Yoshua Wuyts) +- [[`7ed93d55f6`](https://github.com/yoshuawuyts/kv-log-macro/commit/7ed93d55f62aee83a08d62f7a72da32de94c019c)] (cargo-release) version 1.0.2 (Yoshua Wuyts) +- [[`751336f2b1`](https://github.com/yoshuawuyts/kv-log-macro/commit/751336f2b17e5989c4378fd38a25d3c937930741)] fix log feat (Yoshua Wuyts) +- [[`21acf4fc36`](https://github.com/yoshuawuyts/kv-log-macro/commit/21acf4fc363ac44223ebeed95fcbdbd6fb1f53f7)] (cargo-release) version 1.0.1 (Yoshua Wuyts) +- [[`51961f3281`](https://github.com/yoshuawuyts/kv-log-macro/commit/51961f3281314d1a570003f1dc1b0eecc83d5568)] lib.rs example (Yoshua Wuyts) +- [[`fa8a68e00d`](https://github.com/yoshuawuyts/kv-log-macro/commit/fa8a68e00d1cbaab9439e71517d4d8eedeac23ae)] keywords (Yoshua Wuyts) +- [[`a5b1ec57c3`](https://github.com/yoshuawuyts/kv-log-macro/commit/a5b1ec57c3939e17d1d37547aaaaf666ba04abff)] readme (Yoshua Wuyts) +- [[`d6b1429476`](https://github.com/yoshuawuyts/kv-log-macro/commit/d6b1429476b1af71eabdac530eaaaf9b5726d864)] finish impls (Yoshua Wuyts) +- [[`1020528531`](https://github.com/yoshuawuyts/kv-log-macro/commit/102052853137386912f3caedf7da4fb0ee2548ae)] done! (Yoshua Wuyts) +- [[`8a398d49a6`](https://github.com/yoshuawuyts/kv-log-macro/commit/8a398d49a6d111dbe9f3145ba9b52d4a158218e0)] key values work! (Yoshua Wuyts) +- [[`48b01120de`](https://github.com/yoshuawuyts/kv-log-macro/commit/48b01120de73c5dbc1847e77df286e1a6f3bd9f1)] . (Yoshua Wuyts) + +### Stats +```diff + .github/CODE_OF_CONDUCT.md | 75 +++++++++- + .github/CONTRIBUTING.md | 55 ++++++- + .github/ISSUE_TEMPLATE.md | 9 +- + .github/ISSUE_TEMPLATE/bug_report.md | 23 +++- + .github/ISSUE_TEMPLATE/feature_request.md | 43 +++++- + .github/ISSUE_TEMPLATE/question.md | 18 ++- + .github/PULL_REQUEST_TEMPLATE.md | 14 ++- + .github/stale.yml | 17 ++- + .gitignore | 7 +- + .travis.yml | 13 +- + Cargo.toml | 18 ++- + LICENSE-APACHE | 190 ++++++++++++++++++++++- + LICENSE-MIT | 21 ++- + README.md | 62 +++++++- + examples/main.rs | 13 +- + src/lib.rs | 272 +++++++++++++++++++++++++++++++- + tests/test.rs | 6 +- + 17 files changed, 856 insertions(+) +``` + + diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..f971c82 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,29 @@ +# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO +# +# When uploading crates to the registry Cargo will automatically +# "normalize" Cargo.toml files for maximal compatibility +# with all versions of Cargo and also rewrite `path` dependencies +# to registry (e.g., crates.io) dependencies +# +# If you believe there's an error in this file please file an +# issue against the rust-lang/cargo repository. If you're +# editing this file be aware that the upstream Cargo.toml +# will likely look very different (and much more reasonable) + +[package] +edition = "2018" +name = "kv-log-macro" +version = "1.0.7" +authors = ["Yoshua Wuyts "] +description = "Log macro for log's kv-unstable backend." +documentation = "https://docs.rs/kv-log-macro" +readme = "README.md" +keywords = ["log", "macro", "kv", "key", "value"] +categories = ["text-processing"] +license = "MIT OR Apache-2.0" +repository = "https://github.com/yoshuawuyts/kv-log-macro" +[dependencies.log] +version = "0.4.8" +features = ["kv_unstable"] +[dev-dependencies.femme] +version = "1.2.0" diff --git a/Cargo.toml.orig b/Cargo.toml.orig new file mode 100644 index 0000000..f5b3961 --- /dev/null +++ b/Cargo.toml.orig @@ -0,0 +1,18 @@ +[package] +name = "kv-log-macro" +version = "1.0.7" +license = "MIT OR Apache-2.0" +repository = "https://github.com/yoshuawuyts/kv-log-macro" +documentation = "https://docs.rs/kv-log-macro" +description = "Log macro for log's kv-unstable backend." +keywords = ["log", "macro", "kv", "key", "value"] +categories = ["text-processing"] +authors = ["Yoshua Wuyts "] +readme = "README.md" +edition = "2018" + +[dependencies] +log = { version = "0.4.8", features = ["kv_unstable"] } + +[dev-dependencies] +femme = "1.2.0" diff --git a/LICENSE-APACHE b/LICENSE-APACHE new file mode 100644 index 0000000..388f79a --- /dev/null +++ b/LICENSE-APACHE @@ -0,0 +1,190 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + Copyright 2019 Yoshua Wuyts + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/LICENSE-MIT b/LICENSE-MIT new file mode 100644 index 0000000..f26563c --- /dev/null +++ b/LICENSE-MIT @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2019 Yoshua Wuyts + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..14c702c --- /dev/null +++ b/README.md @@ -0,0 +1,62 @@ +# kv-log-macro +[![crates.io version][1]][2] [![build status][3]][4] +[![downloads][5]][6] [![docs.rs docs][7]][8] + +Log macro for log's kv-unstable backend. + +- [Documentation][8] +- [Crates.io][2] +- [Releases][releases] + +## Examples +```rust +use kv_log_macro::info; + +fn main() { + femme::start(log::LevelFilter::Info).unwrap(); + info!("hello"); + info!("hello",); + info!("hello {}", "cats"); + info!("hello {}", "cats",); + info!("hello {}", "cats", { + cat_1: "chashu", + cat_2: "nori", + }); +} +``` + +## Installation +```sh +$ cargo add kv-log-macro +``` + +## Safety +This crate uses ``#![deny(unsafe_code)]`` to ensure everything is implemented in +100% Safe Rust. + +## Contributing +Want to join us? Check out our ["Contributing" guide][contributing] and take a +look at some of these issues: + +- [Issues labeled "good first issue"][good-first-issue] +- [Issues labeled "help wanted"][help-wanted] + +## References +None. + +## License +[MIT](./LICENSE-MIT) OR [Apache-2.0](./LICENSE-APACHE) + +[1]: https://img.shields.io/crates/v/kv-log-macro.svg?style=flat-square +[2]: https://crates.io/crates/kv-log-macro +[3]: https://img.shields.io/travis/yoshuawuyts/kv-log-macro/master.svg?style=flat-square +[4]: https://travis-ci.org/yoshuawuyts/kv-log-macro +[5]: https://img.shields.io/crates/d/kv-log-macro.svg?style=flat-square +[6]: https://crates.io/crates/kv-log-macro +[7]: https://img.shields.io/badge/docs-latest-blue.svg?style=flat-square +[8]: https://docs.rs/kv-log-macro + +[releases]: https://github.com/yoshuawuyts/kv-log-macro/releases +[contributing]: https://github.com/yoshuawuyts/kv-log-macro/blob/master.github/CONTRIBUTING.md +[good-first-issue]: https://github.com/yoshuawuyts/kv-log-macro/labels/good%20first%20issue +[help-wanted]: https://github.com/yoshuawuyts/kv-log-macro/labels/help%20wanted diff --git a/examples/main.rs b/examples/main.rs new file mode 100644 index 0000000..e5aae0a --- /dev/null +++ b/examples/main.rs @@ -0,0 +1,14 @@ +use kv_log_macro::info; + +fn main() { + femme::start(log::LevelFilter::Info).unwrap(); + info!("hello"); + info!("hello",); + info!("hello {}", "cats"); + info!("hello {}", "cats",); + info!("hello {}", "cats", { + cat_1: "chashu", + cat_2: "nori", + cat_count: 2, + }); +} diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..1d1a15c --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,244 @@ +//! Log macro for log's kv-unstable backend. +//! +//! ## Example +//! +//! ```rust +//! use kv_log_macro::info; +//! +//! femme::start(log::LevelFilter::Info).unwrap(); +//! +//! info!("hello"); +//! info!("hello",); +//! info!("hello {}", "cats"); +//! info!("hello {}", "cats",); +//! info!("hello {}", "cats", { +//! cat_1: "chashu", +//! cat_2: "nori", +//! }); +//! ``` + +#![forbid(unsafe_code, future_incompatible, rust_2018_idioms)] +#![deny(missing_debug_implementations, nonstandard_style)] +#![warn(missing_docs, missing_doc_code_examples, unreachable_pub)] +// #![cfg_attr(test, deny(warnings))] + +use log::{logger, LevelFilter, Record}; + +use std::fmt; + +// publicly exporting so $crate::Level works. +pub use log::Level; + +/// The statically resolved maximum log level. +pub const STATIC_MAX_LEVEL: LevelFilter = log::STATIC_MAX_LEVEL; + +/// Returns the current maximum log level. +#[inline] +pub fn max_level() -> LevelFilter { + log::max_level() +} + +/// The standard logging macro. +/// +/// ``` +/// use kv_log_macro::info; +/// +/// info!("hello"); +/// info!("hello",); +/// info!("hello {}", "cats"); +/// info!("hello {}", "cats",); +/// info!("hello {}", "cats", { +/// cat_1: "chashu", +/// cat_2: "nori", +/// }); +/// ``` +#[macro_export(local_inner_macros)] +macro_rules! log { + // log!(target: "...", "...") + (target: $target:expr, $lvl:expr, $e:expr) => { + $crate::log_impl!(target: $target, $lvl, ($e)); + }; + + // log!(target: "...", "...", args...) + (target: $target:expr, $lvl:expr, $e:expr, $($rest:tt)*) => { + $crate::log_impl!(target: $target, $lvl, ($e) $($rest)*); + }; + + // log!("...", args...) + ($lvl:expr, $($arg:tt)+) => ($crate::log!(target: __log_module_path!(), $lvl, $($arg)+)) +} + +#[macro_export(local_inner_macros)] +#[doc(hidden)] +macro_rules! log_impl { + // End of macro input + (target: $target:expr, $lvl:expr, ($($arg:expr),*)) => {{ + let lvl = $lvl; + if lvl <= $crate::STATIC_MAX_LEVEL && lvl <= $crate::max_level() { + $crate::__private_api_log( + __log_format_args!($($arg),*), + lvl, + &($target, __log_module_path!(), __log_file!(), __log_line!()), + None, + ); + } + }}; + + // // Trailing k-v pairs containing no trailing comma + (target: $target:expr, $lvl:expr, ($($arg:expr),*) { $($key:ident : $value:expr),* }) => {{ + if $lvl <= $crate::STATIC_MAX_LEVEL && $lvl <= $crate::max_level() { + $crate::__private_api_log( + __log_format_args!($($arg),*), + $lvl, + &(__log_module_path!(), __log_module_path!(), __log_file!(), __log_line!()), + Some(&[$((__log_stringify!($key), &$value)),*]) + ); + } + }}; + + // Trailing k-v pairs with trailing comma + (target: $target:expr, $lvl:expr, ($($e:expr),*) { $($key:ident : $value:expr,)* }) => { + $crate::log_impl!(target: $target, $lvl, ($($e),*) { $($key : $value),* }); + }; + + // Last expression arg with no trailing comma + (target: $target:expr, $lvl:expr, ($($e:expr),*) $arg:expr) => { + $crate::log_impl!(target: $target, $lvl, ($($e,)* $arg)); + }; + + // Expression arg + (target: $target:expr, $lvl:expr, ($($e:expr),*) $arg:expr, $($rest:tt)*) => { + $crate::log_impl!(target: $target, $lvl, ($($e,)* $arg) $($rest)*); + }; +} + +/// Logs a message at the trace level. +#[macro_export(local_inner_macros)] +macro_rules! trace { + (target: $target:expr, $($arg:tt)+) => ( + log!(target: $target, $crate::Level::Trace, $($arg)+); + ); + ($($arg:tt)+) => ( + log!($crate::Level::Trace, $($arg)+); + ) +} + +/// Logs a message at the debug level. +#[macro_export(local_inner_macros)] +macro_rules! debug { + (target: $target:expr, $($arg:tt)+) => ( + log!(target: $target, $crate::Level::Debug, $($arg)+); + ); + ($($arg:tt)+) => ( + log!($crate::Level::Debug, $($arg)+); + ) +} + +/// Logs a message at the info level. +#[macro_export(local_inner_macros)] +macro_rules! info { + (target: $target:expr, $($arg:tt)+) => ( + log!(target: $target, $crate::Level::Info, $($arg)+); + ); + ($($arg:tt)+) => ( + log!($crate::Level::Info, $($arg)+); + ) +} + +/// Logs a message at the warn level. +#[macro_export(local_inner_macros)] +macro_rules! warn { + (target: $target:expr, $($arg:tt)+) => ( + log!(target: $target, $crate::Level::Warn, $($arg)+); + ); + ($($arg:tt)+) => ( + log!($crate::Level::Warn, $($arg)+); + ) +} + +/// Logs a message at the error level. +#[macro_export(local_inner_macros)] +macro_rules! error { + (target: $target:expr, $($arg:tt)+) => ( + log!(target: $target, $crate::Level::Error, $($arg)+); + ); + ($($arg:tt)+) => ( + log!($crate::Level::Error, $($arg)+); + ) +} + +/// Determines if a message logged at the specified level in that module will +/// be logged. +#[macro_export(local_inner_macros)] +macro_rules! log_enabled { + (target: $target:expr, $lvl:expr) => {{ + let lvl = $lvl; + lvl <= $crate::STATIC_MAX_LEVEL + && lvl <= $crate::max_level() + && $crate::__private_api_enabled(lvl, $target) + }}; + ($lvl:expr) => { + log_enabled!(target: __log_module_path!(), $lvl) + }; +} + +#[doc(hidden)] +#[macro_export] +macro_rules! __log_format_args { + ($($args:tt)*) => { + format_args!($($args)*) + }; +} + +#[doc(hidden)] +#[macro_export] +macro_rules! __log_module_path { + () => { + module_path!() + }; +} + +#[doc(hidden)] +#[macro_export] +macro_rules! __log_file { + () => { + file!() + }; +} + +#[doc(hidden)] +#[macro_export] +macro_rules! __log_line { + () => { + line!() + }; +} + +#[doc(hidden)] +#[macro_export] +macro_rules! __log_stringify { + ($($args:tt)*) => { + stringify!($($args)*) + }; +} + +// WARNING: this is not part of the crate's public API and is subject to change at any time +#[doc(hidden)] +pub fn __private_api_log( + args: fmt::Arguments<'_>, + level: Level, + &(target, module_path, file, line): &(&str, &'static str, &'static str, u32), + kvs: Option<&[(&str, &dyn log::kv::ToValue)]>, +) { + 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(), + ); +} diff --git a/tests/test.rs b/tests/test.rs new file mode 100644 index 0000000..9aa2400 --- /dev/null +++ b/tests/test.rs @@ -0,0 +1,6 @@ +use std::error::Error; + +#[test] +fn should_work() -> Result<(), Box> { + Ok(()) +} -- 2.34.1