😱 Panic messages for humans.

Overview

human-panic

crates.io version build status downloads docs.rs docs

Panic messages for humans. Handles panics by calling std::panic::set_hook to make errors nice for humans.

Why?

When you're building a CLI, polish is super important. Even though Rust is pretty great at safety, it's not unheard of to access the wrong index in a vector or have an assert fail somewhere.

When an error eventually occurs, you probably will want to know about it. So instead of just providing an error message on the command line, we can create a call to action for people to submit a report.

This should empower people to engage in communication, lowering the chances people might get frustrated. And making it easier to figure out what might be causing bugs.

Default Output

thread 'main' panicked at 'oops', examples/main.rs:2:3
note: Run with `RUST_BACKTRACE=1` for a backtrace.

Human-Panic Output

Well, this is embarrassing.

human-panic had a problem and crashed. To help us diagnose the problem you can send us a crash report.

We have generated a report file at "/var/folders/zw/bpfvmq390lv2c6gn_6byyv0w0000gn/T/report-8351cad6-d2b5-4fe8-accd-1fcbf4538792.toml". Submit an issue or email with the subject of "human-panic Crash Report" and include the report as an attachment.

- Homepage: https://github.com/yoshuawuyts/human-panic
- Authors: Yoshua Wuyts <[email protected]>

We take privacy seriously, and do not perform any automated error collection. In order to improve the software, we rely on people to submit reports.

Thank you kindly!

The error dump file generated by human-panic contains the following fields.

name = 'single-panic-test'
operating_system = 'unix:Unknown'
crate_version = '0.1.0'
explanation = '''
Cause: OMG EVERYTHING IS ON FIRE!!!. Panic occurred in file 'tests/single-panic/src/main.rs' at line 8
'''
method = 'Panic'
backtrace = '''
stack backtrace:
   0:     0x55fa0ed4c1b4 - backtrace::backtrace::libunwind::trace::h69e50feca54bfb84
                        at /home/spacekookie/.cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.6/src/backtrace/libunwind.rs:53
                         - backtrace::backtrace::trace::h42967341e0b01ccc
                        at /home/spacekookie/.cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.6/src/backtrace/mod.rs:42
    
    # ...

   8:     0x55fa0ebaac8d - single_panic_test::main::h56a3d326bcecfc36
                        at tests/single-panic/src/main.rs:8
   9:     0x55fa0ebaae91 - std::rt::lang_start::{{closure}}::h09d28d8540038bf8
                        at /checkout/src/libstd/rt.rs:74
  10:     0x55fa0ed732f7 - std::rt::lang_start_internal::{{closure}}::h2e4baf0a27c956a3
                        at libstd/rt.rs:59
                         - std::panicking::try::do_call::h73f98ed0647c7274
                        at libstd/panicking.rs:305
  11:     0x55fa0ed8551e - __rust_maybe_catch_panic
                        at libpanic_unwind/lib.rs:101
  12:     0x55fa0ed6f7f5 - std::panicking::try::h18fbb145180d4cd9
                        at libstd/panicking.rs:284
                         - std::panic::catch_unwind::hc4b6a212a30b4bc5
                        at libstd/panic.rs:361
                         - std::rt::lang_start_internal::h8b001b4244930d51
                        at libstd/rt.rs:58
  13:     0x55fa0ebaae71 - std::rt::lang_start::h1b1de624209f414a
                        at /checkout/src/libstd/rt.rs:74
  14:     0x55fa0ebaacbd - main
  15:     0x7f9946132f29 - __libc_start_main
  16:     0x55fa0eba9b79 - _start
  17:                0x0 - <unknown>'''

Usage

use human_panic::setup_panic;

fn main() {
   setup_panic!();

   println!("A normal log message");
   panic!("OMG EVERYTHING IS ON FIRE!!!")
}

It only displays a human-friendly panic message in release mode:

$ cargo run --release

Installation

$ cargo add human-panic

License

MIT OR Apache-2.0

Comments
  • Optionally display the message in native windows for linux + windows

    Optionally display the message in native windows for linux + windows

    This is a 🙋 feature

    Description

    GUI applications cant display the message on the terminal so I have added a native message box so they can use human-panic. The x11 implementation is based on the SDL ShowSimpleMessageBox source code: https://github.com/spurious/SDL-mirror/blob/master/src/video/x11/SDL_x11messagebox.c Non-ascii characters aren't working on the linux implementation, no idea whats up with that. Mac OS is left unimplemented as I don't have access to such a machine. Enabled by the gui feature

    Scope

    This may not fit it into the scope of this project, due to:

    • Extending the scope to GUI applications.
    • Lots of unsafe code which is especially undesirable in a panic handler.

    This feature is something I need, so if this change doesn't fit into this project I will need to maintain a fork.

    Checklist

    • [x] tests pass
    • [x] documentation is changed or added

    Semver Changes

    Major change

    Screenshots

    Linux (i3 wm)

    linuxmessagebox

    Windows

    windowsmessagebox

    opened by rukai 15
  • Big Meta Merge

    Big Meta Merge

    This pull request attempts to unify the currently ongoing efforts to refactor and clean up this crate. I went a step further with it.

    This PR combines #1 and #4 functionality and cleanliness-wise but also changes the core feature of the crate. Now, instead of having to wrap panics in human_panic::catch_unwind, the functionality is now boiled down to a single macro that the user has to invoke at the beginning of the crate.

    #[macro_use]
    extern crate human_panic;
    
    fn main() {
      setup_panic!();
    
      // ...
    
      panic!("OMG EVERYTHING IS ON FIRE!!!");
    }
    

    I hope I didn't fuck anything up during the merging. Looking back, I should have merged #4 into #1 first, then merge that into my stuff :smirk:

    Comments? @killercup @yoshuawuyts

    opened by spacekookie 10
  • Include cause, whether on nightly or not

    Include cause, whether on nightly or not

    🐛 Set cause, whether we're on nightly or not.

    Previously there were two cases with two sub-cases:

    • if compiled with nightly:
      • if there is a panic message: set it as cause
      • if there is no panic message: set cause to "Unknown"
    • if not compiled with nightly: set cause to "Error cause could not be determined by the application.", and also:
      • if there is a panic message: attach it straight to the expl string as "Cause: ."

    That seems oddly complicated. This PR changes that to:

    • if there is a panic message (no matter if we're on nightly or not): set it as cause
    • if there is no panic message (no matter if we're on nightly or not): set cause to "Unknown"

    Checklist

    • [x] tests pass
    • [ ] tests and/or benchmarks are included
    • [ ] documentation is changed or added

    Context

    Vaguely related to https://github.com/rust-cli/human-panic/issues/55.

    Semver Changes

    This changes the format of the message users see. I think it's a bugfix, but if changing what users see is considered a breaking change, then this is a breaking change.

    opened by curiousleo 9
  • Stable and slim

    Stable and slim

    This is a pretty general refactoring of the code.

    The goal of this PR is to make this a crate that is useful in more general contexts. For this, I've:

    • put the nightly-only external_doc feature behind a feature flag
    • changed how clippy is used on CI by installing cargo-clippy in a new travis builder
    • removed failure and unindent as dependencies
    • replaced console with termcolor which is known to work on Windows

    For more information, see the individual commit messages.

    Semver Changes

    This does not change observable behavior.

    opened by killercup 9
  • Human panic only when it's intended for humans

    Human panic only when it's intended for humans

    Currently the setup_panic! macro sets itself up unconditionally. I think a good default would be to ignore itself if RUST_BACKTRACE is setup up explicitly - that way it's not intended for normal humans, but for an environment that already expects the standard rust backtraces, or for developers who explicitly want to turn this on.

    This also makes it immensely useful by default during debugging, and development, as there's no need to wrap the setup_panic around a condition. I like the one setup, and would like to avoid putting an ugly wrapper around it. Clearly, this is not something intended during the development process.

    Hopefully, most people feel the same, and this can be the default behavior! :)

    opened by prasannavl 7
  • Update to 2018 edition and prune dependencies

    Update to 2018 edition and prune dependencies

    Update the project to 2018 edition in both code and documentation for usage, prunes unused dependencies and removes dependency on failure, preferring the std Error trait.

    There was also a misleading error message about not being able to find a temporary file directory, which would have actually have been caused by a failure to encode a filepath into UTF-8 (https://doc.rust-lang.org/src/std/path.rs.html#1848-1850). However this error should not happen anyway by just using the PathBuf directly to make the full path for the persisted file output.

    Should resolve https://github.com/rust-cli/human-panic/issues/57

    Choose one: is this a 🐛 bug fix, a 🙋 feature, or a 🔦 documentation change? Feature and docs

    Checklist

    • [x] tests pass
    • [x] tests and/or benchmarks are included
    • [x] documentation is changed or added

    Context

    https://github.com/rust-cli/human-panic/issues/57

    Semver Changes

    Should take a minor bump potentially, but no changes to APIs.

    opened by johnchildren 6
  • Make report mod public

    Make report mod public

    Choose one: 🙋 feature

    Checklist

    • [X] tests pass

    Context

    Hi! 👋 I was wondering if you'd be opposed to the idea of exposing the report mod as public. It is pretty useful on its own and I intend to use the Report struct directly instead of printing the result.

    No worries if you don't want to increase the API surface, though. :)

    Semver Changes

    It changes the public interface, but in a backwards-compatible way. So minor bump should be fine.

    opened by passy 4
  • metadata: add repository

    metadata: add repository

    Cargo guidelines are to not set a homepage if it isn't any different than the repository URL. This causes the report to not have any link back to file an issue. If the repository is available, print it as well.


    Note that I've tried to find a reference to the "don't set homepage if it isn't the same" guideline, but haven't found it yet.

    The environment variable is not available yet. See https://github.com/rust-lang/cargo/pull/6096

    Choose one: is this a 🙋 feature?

    Checklist

    • [x] tests pass
    • [x] documentation is changed or added

    Context

    None

    Semver Changes

    Major; the Metadata structure has a new field that isn't specified in existing code.

    opened by mathstuf 4
  • Including original-sin (panic) in report

    Including original-sin (panic) in report

    Choose one: This a 🐛 bug fix

    Including original panic-cause in report

    Okay so this PR is a bit of a dilemma. The API we need to get the original panic message isn't stable and requires a feature flag. We can conditionally enable the feature flag for nightly users but that doesn't quite deal with the problem of what to do when someone is using human-panic on stable.

    As far as I can see there's no other API to get that information? We could always just gate it all away behind the nightly feature and just ommit a static "not supported" or something when running on stable.

    The tests pass (provided you pass --features nightly for now). Wanted to open this PR to discuss how to proceed :)

    • [x] tests pass
    • [x] tests and/or benchmarks are included
    • [ ] documentation is changed or added

    This fixes #40

    This should be a minor bump I believe?

    The Report struct isn't exported so adding a field there isn't gonna make a difference 🤷

    opened by spacekookie 4
  • Only Metadata<'static> works, remove generic

    Only Metadata<'static> works, remove generic

    Choose one: is this a 🐛 bug fix

    Metadata<'a> is wrong, since only a==static will compile. This changes it for clarity.

    Checklist

    • [ ] tests pass (still no tests)
    • [ ] tests and/or benchmarks are included
    • [ ] documentation is changed or added

    Context

    N/A

    Semver Changes

    Changed Metadata is technically pub, though users of this library are unlikely to provide their own.

    opened by remram44 4
  • Rollup!

    Rollup!

    Wow, there's a lot of stuff going on in this repo! This is a rollup of #6 and #9 -- and I'm pretty sure also of #8 of which #9 is pretty much a superset.

    So, to summarize:

    • This fixes the tests
    • This makes clippy and rustfmt happy
    • This uses Path/PathBuf instead of String in a few places

    …and it finally it bumps the version to 0.3 because, even though print_msg now accepts strictly more inputs (you can still pass in a String but now also give it a Path or PathBuf of &str), the output type of handle_dump changed :(

    opened by killercup 4
  • Configure Renovate

    Configure Renovate

    Mend Renovate

    Welcome to Renovate! This is an onboarding PR to help you understand and configure settings before regular Pull Requests begin.

    🚦 To activate Renovate, merge this Pull Request. To disable Renovate, simply close this Pull Request unmerged.


    Detected Package Files

    • Cargo.toml (cargo)

    Configuration Summary

    Based on the default config's presets, Renovate will:

    • Start dependency updates only once this onboarding PR is merged
    • Enable Renovate Dependency Dashboard creation.
    • If Renovate detects semantic commits, it will use semantic commit type fix for dependencies and chore for all others.
    • Ignore node_modules, bower_components, vendor and various test/tests directories.
    • Autodetect whether to pin dependencies or maintain ranges.
    • Rate limit PR creation to a maximum of two per hour.
    • Limit to maximum 10 open PRs at any time.
    • Group known monorepo packages together.
    • Use curated list of recommended non-monorepo package groupings.
    • A collection of workarounds for known problems with packages.

    🔡 Would you like to change the way Renovate is upgrading your dependencies? Simply edit the renovate.json in this branch with your custom config and the list of Pull Requests in the "What to Expect" section below will be updated the next time Renovate runs.


    What to Expect

    With your current configuration, Renovate will create 9 Pull Requests:

    Update Rust crate backtrace to 0.3.66
    • Schedule: ["at any time"]
    • Branch name: renovate/backtrace-0.x
    • Merge into: master
    • Upgrade backtrace to 0.3.66
    Update Rust crate os_info to 2.0.8
    • Schedule: ["at any time"]
    • Branch name: renovate/os_info-2.x
    • Merge into: master
    • Upgrade os_info to 2.0.8
    Update Rust crate serde to 1.0.148
    • Schedule: ["at any time"]
    • Branch name: renovate/serde-1.x
    • Merge into: master
    • Upgrade serde to 1.0.148
    Update Rust crate serde_derive to 1.0.148
    • Schedule: ["at any time"]
    • Branch name: renovate/serde_derive-1.x
    • Merge into: master
    • Upgrade serde_derive to 1.0.148
    Update Rust crate toml to 0.5.9
    • Schedule: ["at any time"]
    • Branch name: renovate/toml-0.x
    • Merge into: master
    • Upgrade toml to 0.5.9
    Update Rust crate uuid to 0.8.2
    • Schedule: ["at any time"]
    • Branch name: renovate/uuid-0.x
    • Merge into: master
    • Upgrade uuid to 0.8.2
    Update Rust crate termcolor to 1.1.3
    • Schedule: ["at any time"]
    • Branch name: renovate/termcolor-1.x
    • Merge into: master
    • Upgrade termcolor to 1.1.3
    Update Rust crate os_info to v3
    • Schedule: ["at any time"]
    • Branch name: renovate/os_info-3.x
    • Merge into: master
    • Upgrade os_info to 3.5.1
    Update Rust crate uuid to v1
    • Schedule: ["at any time"]
    • Branch name: renovate/uuid-1.x
    • Merge into: master
    • Upgrade uuid to 1.2.2

    🚸 Branch creation will be limited to maximum 2 per hour, so it doesn't swamp any CI resources or spam the project. See docs for prhourlylimit for details.


    ❓ Got questions? Check out Renovate's Docs, particularly the Getting Started section. If you need any further assistance then you can also request help here.


    This PR has been generated by Mend Renovate. View repository job log here.

    opened by renovate[bot] 0
  • Determine rustc version and add it to the report

    Determine rustc version and add it to the report

    This is a 🙋 feature.

    Checklist

    • [x] tests pass
    • [ ] tests and/or benchmarks are included - is this necessary/possible for this?
    • [x] documentation is changed or added

    Context

    Fixes #31

    Semver Changes

    Major release - it changes the Report struct. I don't think 2.0 is released yet, so that would fit perfectly!

    I have very little experience contributing to Rust crates, so if I made any mistakes, let me know!

    opened by TheTechRobo 7
  • Minimum Supported Rust Version isn't supported

    Minimum Supported Rust Version isn't supported

    Choose one: this is a 🐛 bug report

    A number of this crate's dependencies no longer compile on Rust 1.36.0, meaning this crate is no longer usable on Rust 1.36.0.

    Expected Behavior

    Running cargo +1.36.0 build should pass.

    Current Behavior

    There are almost certainly more compile errors, but running cargo +1.36.0 build shows that rustc-demangle and memchr no longer work with Rust 1.36.0.

    Possible Solution

    There are two possible solutions:

    1. Update this crate's MSRV (a breaking change)
    2. Pin the offending crates to a supported version

    I don't believe the second solution is feasible because the offending crates are transitive dependencies.

    The best solution would be to bump the MSRV and create a new major release. While we're at it, we could use some newer Rust features so there are less breaking changes in the future or take advantage of recent features.

    • Add the #[non_exhaustive] attribute to Metadata so adding extra metadata to a report isn't a breaking change
      • This would require introducing a builder API so people can initialize Metadata themselves

    Context

    I don't particularly mind because I almost always use nightly or stable Rust, but MSRV is very important to some people and we should try to accommodate them.

    Code Sample

    $ git checkout ffe447a2c66b41b338edb440470c42050bbc0dd5
    $ cargo +1.36.0 test
      ...
    error: cannot find macro `matches!` in this scope
       --> /home/michael/.cargo/registry/src/github.com-1ecc6299db9ec823/rustc-demangle-0.1.21/src/v0.rs:700:20
        |
    700 |                 if matches!((quote, c), ('\'', '"') | ('"', '\'')) {
        |                    ^^^^^^^
    
    error: aborting due to previous error
    
    error: Could not compile `rustc-demangle`.
    warning: build failed, waiting for other jobs to finish...
    error[E0658]: naming constants with `_` is unstable
      --> /home/michael/.cargo/registry/src/github.com-1ecc6299db9ec823/memchr-2.4.1/src/memmem/prefilter/fallback.rs:37:1
       |
    37 | const _: PrefilterFnTy = find;
       | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
       |
       = note: for more information, see https://github.com/rust-lang/rust/issues/54912
    
    error[E0658]: naming constants with `_` is unstable
     --> /home/michael/.cargo/registry/src/github.com-1ecc6299db9ec823/memchr-2.4.1/src/memmem/prefilter/x86/sse.rs:9:1
      |
    9 | const _: PrefilterFnTy = find;
      | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      |
      = note: for more information, see https://github.com/rust-lang/rust/issues/54912
    
    error[E0658]: non exhaustive is an experimental feature
       --> /home/michael/.cargo/registry/src/github.com-1ecc6299db9ec823/memchr-2.4.1/src/memmem/prefilter/mod.rs:152:1
        |
    152 | #[non_exhaustive]
        | ^^^^^^^^^^^^^^^^^
        |
        = note: for more information, see https://github.com/rust-lang/rust/issues/44109
    
    error: aborting due to 3 previous errors
    

    Your Environment

    This was tested against ffe447a2c66b41b338edb440470c42050bbc0dd5 using Rust 1.36.0 on Linux.

    opened by Michael-F-Bryan 0
  • Added a repository field to the Metadata struct (fixes #77)

    Added a repository field to the Metadata struct (fixes #77)

    Choose one: this is a 🙋 feature

    This resolves #77 by adding a repository field to the Metadata struct and a corresponding "Repository: ..." line to the message that gets printed

    Checklist

    • [x] tests pass
    • [x] tests and/or benchmarks are included
    • [x] documentation is changed or added

    Context

    See #77.

    Semver Changes

    This is a breaking change because it adds a field to Metadata, which doesn't have the #[non_exhaustive] attribute.

    opened by Michael-F-Bryan 1
  • Fallback to repository if homepage is absent

    Fallback to repository if homepage is absent

    Choose one: is this a 🙋 feature request

    Expected Behavior

    When the Cargo.toml parameter repository is present and homepage is absent, no URL is included in the message. If one wants to add the github URL, they need to set it in homepage. It's a bad practice since homepage is for a real home page, not a repository.

    Current Behavior

    repository is ignored.

    Possible Solution

    It would be nice to have a fallback to repository if homepage is absent. Or better, print both since they add different useful information.

    Context

    Code Sample

    Your Environment

    | Software | Version(s) | | ---------------- | ---------- | | Package | | Runtime | | Package Manager | | Operating System |

    opened by Yamakaky 0
Owner
Rust CLI WG
The @rustlang commandline application working group
Rust CLI WG
decode a byte stream of varint length-encoded messages into a stream of chunks

length-prefixed-stream decode a byte stream of varint length-encoded messages into a stream of chunks This crate is similar to and compatible with the

James Halliday 4 Feb 26, 2022
Command line tool to make conventional commit messages

Commit This project is a copy of cz-cli with some minor changes. I made this project for my own use, because I don't want to mess with the original cz

Pedro Mendes 80 Dec 26, 2022
dhcpm is a CLI tool for constructing & sending DHCP messages

dhcpm Sponsor Thank you to Bluecat for sponsoring this work! dhcpm leverages dhcproto check that out for the DHCP protocol. About A cli tool (and dhcp

Evan Cameron 12 Mar 28, 2022
Automatically commit all edits to a wip branch with GPT-3 commit messages

gwipt Automatic work-in-progress commits with descriptive commit messages generated by GPT-3 Codex Never again worry about the tension between "commit

Ben Weinstein-Raun 113 Jan 25, 2023
turbocommit is a Rust-based CLI tool that generates high-quality git commit messages in accordance with the Conventional Commits specification, using OpenAI's

turbocommit is a Rust-based CLI tool that generates high-quality git commit messages in accordance with the Conventional Commits specification, using OpenAI's `gpt-3.5-turbo` language model. It is easy to use and a cost-effective way to keep git commit history at a higher quality, helping developers stay on track with their work.

Sett 16 Mar 26, 2023
A CLI tool that uses ChatGPT to automatically generate commit messages.

Auto Git Commit This project is a tool that uses the OpenAI GPT model to automatically generate commit messages for Git commits based on the changes m

XIAO YU 16 Mar 5, 2024
Easy c̵̰͠r̵̛̠ö̴̪s̶̩̒s̵̭̀-t̶̲͝h̶̯̚r̵̺͐e̷̖̽ḁ̴̍d̶̖̔ ȓ̵͙ė̶͎ḟ̴͙e̸̖͛r̶̖͗ë̶̱́ṉ̵̒ĉ̷̥e̷͚̍ s̷̹͌h̷̲̉a̵̭͋r̷̫̊ḭ̵̊n̷̬͂g̵̦̃ f̶̻̊ơ̵̜ṟ̸̈́ R̵̞̋ù̵̺s̷̖̅ţ̸͗!̸̼͋

Rust S̵̓i̸̓n̵̉ I̴n̴f̶e̸r̵n̷a̴l mutability! Howdy, friendly Rust developer! Ever had a value get m̵̯̅ð̶͊v̴̮̾ê̴̼͘d away right under your nose just when

null 294 Dec 23, 2022
const panic with formatting

For panicking with formatting in const contexts. This library exists because the panic macro was stabilized for use in const contexts in Rust 1.57.0,

null 4 Jul 10, 2022
A panic hook for wasm32-unknown-unknown that logs panics with console.error

console_error_panic_hook This crate lets you debug panics on wasm32-unknown-unknown by providing a panic hook that forwards panic messages to console.

Rust and WebAssembly 241 Jan 3, 2023
Playboy is a Nintendo Gameboy emulator for the Panic Playdate written in Rust

Playboy Playboy is a Nintendo Gameboy emulator for the Panic Playdate! Building Playdate isn't exactly a Tier 1 platform for Rust :) As a result, the

Adam Soutar 121 Jan 5, 2023
Benchmark for Rust and humans

bma-benchmark Benchmark for Rust and humans What is this for I like testing different libraries, crates and algorithms. I do benchmarks on prototypes

Altertech 11 Jan 17, 2022
The Operating System built for modern humans!

What is QuantumOS? Quantum OS is a continuation project of my ever loving joy for operating system development. I started with a project called Fluxed

Main Menu 11 Dec 31, 2022
A blazingly fast HTTP client with a magnificent request building syntax, made for humans.

?? glue Make requests, select JSON responses, nest them in other requests: A magnificent syntax for blazingly fast cli HTTP calls, made for humans. Ta

Michele Esposito 4 Dec 7, 2022
ln -s for humans

slink Create symlinks without hassle. Do you know how to use ln -s? Do you really know which comes first the source or the target file? Do you know wh

Djordje Lukic 6 Sep 24, 2022
nats-spy is a terminal tool to help you to monitor NATS messages.

nats-spy nats-spy is a terminal tool to help you to monitor NATS messages. Install Homebrew (macOS) brew install alihanyalcin/nats-spy/nats-spy Usage

Alihan Doğuş Yalçın 23 Oct 23, 2022
A small discord bot to archive the messages in a discord text channel.

discord-channel-archiver A small discord bot to archive the messages in a discord text channel. This is still WIP. The HTML and JSON modes are vaguely

Jamie Quigley 34 Dec 14, 2022
decode a byte stream of varint length-encoded messages into a stream of chunks

length-prefixed-stream decode a byte stream of varint length-encoded messages into a stream of chunks This crate is similar to and compatible with the

James Halliday 4 Feb 26, 2022
Fluent assertion library for Rust with readable messages.

Assertor Assertor makes test assertions and failure messages more human-readable. Assertor is heavily affected by Java Truth in terms of API design an

Google 20 Dec 12, 2022
Better error messages for axum framework.

axum-debug This is a debugging crate that provides better error messages for axum framework. axum is a great framework for developing web applications

Eray Karatay 3 Feb 3, 2022
pam-send-slack-message is a program that publishes messages on slack when a linux server is accessed through ssh.

pam-send-slack-message pam-send-slack-message is a program that publishes messages on slack when the linux server is accessed through ssh. Installatio

Iuri Diniz 2 Aug 17, 2022