macro_rules! gerr {
($message:literal $(,)?) => { ... };
($fmt:literal, $($arg:expr),+ $(,)?) => { ... };
($message:expr $(,)?) => { ... };
(
$message:literal ;
$($rest:tt)*
) => { ... };
(
$fmt:literal, $($arg:expr),+ ;
$($rest:tt)*
) => { ... };
(
$message:expr ;
$($rest:tt)*
) => { ... };
(@build $err:ident) => { ... };
(@build $err:ident,) => { ... };
(
@build $err:ident,
config
$(, $($rest:tt)*)?
) => { ... };
(
@build $err:ident,
config = $config:ty
$(, $($rest:tt)*)?
) => { ... };
(
@build $err:ident,
id = $id:expr
$(, $($rest:tt)*)?
) => { ... };
(
@build $err:ident,
code = $code:expr
$(, $($rest:tt)*)?
) => { ... };
(
@build $err:ident,
data_type
$(, $($rest:tt)*)?
) => { ... };
(
@build $err:ident,
data_type = $data_type:ty
$(, $($rest:tt)*)?
) => { ... };
(
@build $err:ident,
data = $data:expr
$(, $($rest:tt)*)?
) => { ... };
(
@build $err:ident,
source = $source:expr
$(, $($rest:tt)*)?
) => { ... };
(
@build $err:ident,
gerr = $source:expr
$(, $($rest:tt)*)?
) => { ... };
(
@build $err:ident,
tag = $tag:expr
$(, $($rest:tt)*)?
) => { ... };
(
@build $err:ident,
tags = $tags:expr
$(, $($rest:tt)*)?
) => { ... };
(
@build $err:ident,
help = $help:expr
$(, $($rest:tt)*)?
) => { ... };
}Expand description
GErr macro.
Creates GErr easily with formatting support and rich data.
Without metadatas, the default config is DefaultConfig and default data is NoData.
§Format
- Without formatting and without metadata:
gerr!("error message goes here");. - Without formatting and with metadata:
gerr!("error message goes here"; <metadata>), metadata are separated by;. - With formatting and with metadata:
gerr!("error message goes here {}", 123; <metadata>), formatting args are separated by,and metadata by;.
Error message and its metadata are separated by ;.
Metadata’s items are separated by ,.
§Supported metadata
config: infer auto-generating config type from return type.config=$type: set auto-generating config type.id=$expr: set id manually with id type as set byconfig=$type.code=$expr: set code string.data_type: infer error data type from return type.data_type=$type: define error data type.data=$expr: set data, along with its type.source=$expr: set non-GErr error source.gerr=$expr: set GErr error source, or any error convertible to GErrSource.tag=$expr: add tag.tags=$expr: add multiple tags, e.g:["tag1", "tag2",...].help=$expr: set help message.
You can override the metadatas, and latest ones will be used.
§NOTE
The order of config param matters because it calls .with_config method which will regenerate values from new config type.
§Example
use g_err::{gerr, Config};
struct U32;
impl Config for U32 {
type Id = u32;
}
let inner = gerr!("parsing integer");
let external_error = "anu".parse::<i32>().unwrap_err();
let err = gerr!(
"failed {}",
500;
config=U32,
id = 999, // set id
code = "HTTP", // set code
tag = "server", // set a tag
tags = ["api", "v1"], // set tags
data = "payload", // set error data
code = "E-HTTP", // update code
source = external_error, // set general error as source
gerr = inner, // set `Into<GErrSource>` error as source
help = "Try parsing valid signed integer 32", // set help hint
);
assert_eq!(err.message(), "failed 500");
assert_eq!(err.id().unwrap(), &999);
assert_eq!(err.code(), Some("E-HTTP"));
assert_eq!(err.data(), Some(&"payload"));
let tags = err.tags().unwrap();
assert_eq!(tags.len(), 3);
let sources = err.sources().unwrap();
assert_eq!(sources.len(), 2);