Skip to content

Commit 25233ce

Browse files
authored
Merge pull request #2374 from GitoxideLabs/gix-error
Turn `Exn::into_box()` to `Exn::into_inner()`.
2 parents 4c6a7a7 + 939b8fc commit 25233ce

8 files changed

Lines changed: 37 additions & 27 deletions

File tree

gix-error/src/exn/impls.rs

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -140,17 +140,26 @@ impl<E: Error + Send + Sync + 'static> Exn<E> {
140140
.expect("the owned frame always matches the compile-time error type")
141141
}
142142

143-
/// Discard all error context and return the underlying error.
143+
/// Discard all error context and return the underlying error in a Box.
144144
///
145-
/// This may be needed to obtain something that once again implements `Error`.
145+
/// This is useful to retain the allocation, as internally it's also stored in a box,
146+
/// when comparing it to [`Self::into_inner()`].
146147
pub fn into_box(self) -> Box<E> {
147148
match self.frame.error.downcast() {
148149
Ok(err) => err,
149150
Err(_) => unreachable!("The type in the frame is always the type of this instance"),
150151
}
151152
}
152153

153-
/// Turn ourselves into a type that implements [`Error`].
154+
/// Discard all error context and return the underlying error.
155+
///
156+
/// This may be needed to obtain something that once again implements `Error`.
157+
/// Note that this destroys the internal Box and moves the value back onto the stack.
158+
pub fn into_inner(self) -> E {
159+
*self.into_box()
160+
}
161+
162+
/// Turn ourselves into a top-level [Error] that implements [`std::error::Error`].
154163
pub fn into_error(self) -> crate::Error {
155164
self.into()
156165
}

gix-refspec/src/parse.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ pub enum Error {
2525
#[error(transparent)]
2626
ReferenceName(#[from] gix_validate::reference::name::Error),
2727
#[error(transparent)]
28-
RevSpec(#[from] Box<gix_revision::spec::parse::Error>),
28+
RevSpec(#[from] gix_revision::spec::parse::Error),
2929
}
3030

3131
/// Define how the parsed refspec should be used.
@@ -181,7 +181,7 @@ pub(crate) mod function {
181181
.map_err(Error::from)
182182
.or_else(|err| {
183183
if allow_revspecs {
184-
gix_revision::spec::parse(spec, &mut super::revparse::Noop).map_err(Exn::into_box)?;
184+
gix_revision::spec::parse(spec, &mut super::revparse::Noop).map_err(Exn::into_inner)?;
185185
Ok(spec)
186186
} else {
187187
Err(err)

gix-revision/tests/revision/spec/parse/kind.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use crate::spec::parse::{try_parse, try_parse_opts, Options};
33
#[test]
44
fn cannot_declare_ranges_multiple_times() {
55
for invalid_spec in ["^HEAD..", "^HEAD..."] {
6-
let err = try_parse(invalid_spec).unwrap_err().into_box();
6+
let err = try_parse(invalid_spec).unwrap_err().into_inner();
77
assert!(err.message.contains("cannot set spec kind more than once"));
88
}
99
}
@@ -18,7 +18,7 @@ fn delegate_can_refuse_spec_kinds() {
1818
},
1919
)
2020
.unwrap_err()
21-
.into_box();
21+
.into_inner();
2222
// Delegates can refuse spec kind changes to abort parsing early in case they want single-specs only
2323
insta::assert_snapshot!(err, @"delegate.kind(ExcludeReachable) failed");
2424
}
@@ -53,7 +53,7 @@ mod include_parents {
5353

5454
#[test]
5555
fn trailing_caret_exclamation_mark_must_end_the_input() {
56-
let err = try_parse("r1^@~1").unwrap_err().into_box();
56+
let err = try_parse("r1^@~1").unwrap_err().into_inner();
5757
assert!(err.message.contains("unconsumed input"));
5858
}
5959
}
@@ -98,7 +98,7 @@ mod exclude_parents {
9898

9999
#[test]
100100
fn trailing_caret_exclamation_mark_must_end_the_input() {
101-
let err = try_parse("r1^!~1").unwrap_err().into_box();
101+
let err = try_parse("r1^!~1").unwrap_err().into_inner();
102102
assert!(err.message.contains("unconsumed input"));
103103
}
104104
}
@@ -227,25 +227,25 @@ mod range {
227227

228228
#[test]
229229
fn minus_with_n_omitted_has_to_end_there() {
230-
let err = try_parse("r1^-^").unwrap_err().into_box();
230+
let err = try_parse("r1^-^").unwrap_err().into_inner();
231231
assert!(err.message.contains("unconsumed input"));
232232
}
233233

234234
#[test]
235235
fn minus_with_n_has_to_end_there() {
236-
let err = try_parse("r1^-42^").unwrap_err().into_box();
236+
let err = try_parse("r1^-42^").unwrap_err().into_inner();
237237
assert!(err.message.contains("unconsumed input"));
238238
}
239239

240240
#[test]
241241
fn minus_with_n_has_to_end_there_and_handle_range_suffix() {
242-
let err = try_parse("r1^-42..").unwrap_err().into_box();
242+
let err = try_parse("r1^-42..").unwrap_err().into_inner();
243243
assert!(err.message.contains("unconsumed input"));
244244
}
245245

246246
#[test]
247247
fn minus_with_n_omitted_has_to_end_there_and_handle_range_suffix() {
248-
let err = try_parse("r1^-..").unwrap_err().into_box();
248+
let err = try_parse("r1^-..").unwrap_err().into_inner();
249249
assert!(err.message.contains("unconsumed input"));
250250
}
251251

gix-revision/tests/revision/spec/parse/navigate/caret_symbol.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ fn followed_by_zero_is_peeling_to_commit() {
5757

5858
#[test]
5959
fn explicitly_positive_numbers_are_invalid() {
60-
let err = try_parse("@^+1").unwrap_err().into_box();
60+
let err = try_parse("@^+1").unwrap_err().into_inner();
6161
assert_eq!(err.input.as_ref().map(AsRef::as_ref), Some(b"+1".as_ref()));
6262
assert!(err.message.contains("positive numbers are invalid"));
6363
}
@@ -181,11 +181,11 @@ fn empty_braces_deref_a_tag() {
181181

182182
#[test]
183183
fn invalid_object_type() {
184-
let err = try_parse("@^{invalid}").unwrap_err().into_box();
184+
let err = try_parse("@^{invalid}").unwrap_err().into_inner();
185185
assert_eq!(err.input.as_ref().map(AsRef::as_ref), Some(b"invalid".as_ref()));
186186
assert!(err.message.contains("cannot peel"));
187187

188-
let err = try_parse("@^{Commit}").unwrap_err().into_box();
188+
let err = try_parse("@^{Commit}").unwrap_err().into_inner();
189189
assert!(
190190
err.input.as_ref().map(AsRef::as_ref) == Some(b"Commit".as_ref()) && err.message.contains("cannot peel"),
191191
"these types are case sensitive"
@@ -204,37 +204,37 @@ fn invalid_caret_without_previous_refname() {
204204
);
205205

206206
for revspec in ["^^^HEAD", "^^HEAD"] {
207-
let err = try_parse(revspec).unwrap_err().into_box();
207+
let err = try_parse(revspec).unwrap_err().into_inner();
208208
assert_eq!(err.input.as_ref().map(AsRef::as_ref), Some(b"HEAD".as_ref()));
209209
assert!(err.message.contains("unconsumed input"));
210210
}
211211
}
212212

213213
#[test]
214214
fn incomplete_escaped_braces_in_regex_are_invalid() {
215-
let err = try_parse(r"@^{/a\{1}}").unwrap_err().into_box();
215+
let err = try_parse(r"@^{/a\{1}}").unwrap_err().into_inner();
216216
assert_eq!(err.input.as_ref().map(AsRef::as_ref), Some(b"}".as_ref()));
217217
assert!(err.message.contains("unconsumed input"));
218218

219-
let err = try_parse(r"@^{/a{1\}}").unwrap_err().into_box();
219+
let err = try_parse(r"@^{/a{1\}}").unwrap_err().into_inner();
220220
assert!(
221221
err.input.as_ref().map(AsRef::as_ref) == Some(br"{/a{1\}}".as_ref()) && err.message.contains("unclosed brace")
222222
);
223223
}
224224

225225
#[test]
226226
fn regex_with_empty_exclamation_mark_prefix_is_invalid() {
227-
let err = try_parse(r#"@^{/!hello}"#).unwrap_err().into_box();
227+
let err = try_parse(r#"@^{/!hello}"#).unwrap_err().into_inner();
228228
assert_eq!(err.input.as_ref().map(AsRef::as_ref), Some(b"!hello".as_ref()));
229229
assert!(err.message.contains("need one character after"));
230230
}
231231

232232
#[test]
233233
fn bad_escapes_can_cause_brace_mismatch() {
234-
let err = try_parse(r"@^{\}").unwrap_err().into_box();
234+
let err = try_parse(r"@^{\}").unwrap_err().into_inner();
235235
assert!(err.input.as_ref().map(AsRef::as_ref) == Some(br"{\}".as_ref()) && err.message.contains("unclosed brace"));
236236

237-
let err = try_parse(r"@^{{\}}").unwrap_err().into_box();
237+
let err = try_parse(r"@^{{\}}").unwrap_err().into_inner();
238238
// The raw string r"{{\}}" contains actual backslashes, so the input would be r"{{\}}"
239239
assert!(
240240
err.input.as_ref().map(AsRef::as_ref) == Some(br"{{\}}".as_ref()) && err.message.contains("unclosed brace")

gix-revision/tests/revision/spec/parse/navigate/tilde_symbol.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use crate::spec::parse::{parse, try_parse};
44

55
#[test]
66
fn without_anchor_is_invalid() {
7-
let err = try_parse("~").unwrap_err().into_box();
7+
let err = try_parse("~").unwrap_err().into_inner();
88
assert!(err.message.contains("tilde needs to follow an anchor"));
99
}
1010

gix/src/commit.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ pub mod describe {
8484
#[error(transparent)]
8585
OpenCache(#[from] crate::repository::commit_graph_if_enabled::Error),
8686
#[error(transparent)]
87-
Describe(#[from] Box<gix_revision::describe::Error>),
87+
Describe(#[from] gix_revision::describe::Error),
8888
#[error("Could not produce an unambiguous shortened id for formatting.")]
8989
ShortId(#[from] crate::id::shorten::Error),
9090
#[error(transparent)]
@@ -245,7 +245,7 @@ pub mod describe {
245245
max_candidates: self.max_candidates,
246246
},
247247
)
248-
.map_err(Exn::into_box)?;
248+
.map_err(Exn::into_inner)?;
249249

250250
Ok(outcome.map(|outcome| Resolution {
251251
outcome,

gix/src/config/tree/keys.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -527,7 +527,8 @@ pub mod validate {
527527

528528
impl Validate for Time {
529529
fn validate(&self, value: &BStr) -> Result<(), Box<dyn Error + Send + Sync + 'static>> {
530-
gix_date::parse(value.to_str()?, std::time::SystemTime::now().into()).map_err(gix_error::Exn::into_box)?;
530+
gix_date::parse(value.to_str()?, std::time::SystemTime::now().into())
531+
.map_err(gix_error::Exn::into_inner)?;
531532
Ok(())
532533
}
533534
}

src/shared.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -391,7 +391,7 @@ mod clap {
391391

392392
fn parse_ref(&self, cmd: &Command, arg: Option<&Arg>, value: &OsStr) -> Result<Self::Value, Error> {
393393
StringValueParser::new()
394-
.try_map(|arg| gix::date::parse(&arg, Some(std::time::SystemTime::now())).map_err(gix::Exn::into_box))
394+
.try_map(|arg| gix::date::parse(&arg, Some(std::time::SystemTime::now())).map_err(gix::Exn::into_inner))
395395
.parse_ref(cmd, arg, value)
396396
}
397397
}

0 commit comments

Comments
 (0)