Skip to content

Commit

Permalink
Allow yeeting context selectors to generate errors
Browse files Browse the repository at this point in the history
  • Loading branch information
shepmaster committed Nov 28, 2023
1 parent 796701c commit d826e6a
Show file tree
Hide file tree
Showing 6 changed files with 50 additions and 0 deletions.
4 changes: 4 additions & 0 deletions .cirrus.yml
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,10 @@ nightly_test_task:
- cd compatibility-tests/backtrace-provider-api/
- rustc --version
- cargo test
yeet_selectors_test_script:
- cd compatibility-tests/yeet-selectors/
- rustc --version
- cargo test
before_cache_script: rm -rf $CARGO_HOME/registry/index

unstable_std_backtraces_test_task:
Expand Down
9 changes: 9 additions & 0 deletions compatibility-tests/yeet-selectors/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
[package]
name = "yeet-selectors"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
snafu = { path = "../.." }
1 change: 1 addition & 0 deletions compatibility-tests/yeet-selectors/rust-toolchain
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
nightly
20 changes: 20 additions & 0 deletions compatibility-tests/yeet-selectors/src/lib.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
#![feature(yeet_expr)]
#![cfg(test)]

use snafu::prelude::*;

#[test]
fn can_yeet_context_selector() {
#[derive(Debug, Snafu)]
struct MyError {
name: String,
}

fn usage() -> Result<(), MyError> {
let name = "gronk";
do yeet MySnafu { name };
}

let r = usage();
assert!(r.is_err(), "{r:?} should have been an error");
}
10 changes: 10 additions & 0 deletions snafu-derive/src/shared.rs
Original file line number Diff line number Diff line change
Expand Up @@ -294,6 +294,16 @@ pub mod context_selector {
::core::result::Result::Err(self.build())
}
}

impl<#(#original_generics_without_defaults,)* #(#user_field_generics,)*> ::core::convert::From<#parameterized_selector_name> for #parameterized_error_name
where
#(#extended_where_clauses),*
{
#[track_caller]
fn from(other: #parameterized_selector_name) -> Self {
other.build()
}
}
}
}

Expand Down
6 changes: 6 additions & 0 deletions tests/build-leaf-error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,3 +22,9 @@ fn implements_error() {

map_result().unwrap_err();
}

#[test]
fn build_via_from_and_into() {
let _e = Error::from(MineSnafu);
let _e: Error = MineSnafu.into();
}

0 comments on commit d826e6a

Please sign in to comment.