#警告 #错误 #结果

警告

struct Warned<T, W> { value: T, warnings: Vec<W> }, 表示带有警告的值

2 个版本

0.1.1 2023 年 1 月 21 日
0.1.0 2023 年 1 月 21 日

#21 in #结果

Download history 51/week @ 2024-03-29 26/week @ 2024-04-05 21/week @ 2024-04-12 39/week @ 2024-04-19 28/week @ 2024-04-26 8/week @ 2024-05-03 7/week @ 2024-05-10 2/week @ 2024-05-17 12/week @ 2024-05-24 16/week @ 2024-05-31 168/week @ 2024-06-07 32/week @ 2024-06-14 16/week @ 2024-06-21 20/week @ 2024-06-28 23/week @ 2024-07-05 8/week @ 2024-07-12

每月 72 次下载
用于 impl-converter-helper

MIT 许可证

20KB
144

Warned<T, W> ... 带有警告的值

Warned<T, W> 类型表示带有警告的值,而 Result<T, E> 类型表示值或错误。

基本

// new
let pi = warned::Warned::new(3.14, vec!["bad precision"]);
assert_eq!(pi.value, 3.14);
assert_eq!(pi.warnings, vec!["bad precision"]);

// dereference
assert_eq!(*pi, 3.14);

// unwrap
let mut warnings = vec!["several", "existing", "warnings"];
assert_eq!(pi.unwrap(&mut warnings), 3.14);
assert_eq!(warnings, vec!["several", "existing", "warnings", "bad precision"]);

// into
let a: warned::Warned<i32, String> = 123.into();
assert_eq!(a.value, 123);
assert!(a.warnings.is_empty());

Warned<T, W>Result<T, W> 之间的转换

  • Warned::into_result 仅当 self 没有警告时返回 Ok。否则返回 Err
  • From<Warned<T, W>> 特性为 Result<T, Vec<W>> 实现 Warned::into_result
  • Warned::from_result_or_else 如果 srcOk,则返回无警告的值。否则返回具有单个警告的 f() 值。
  • Warned::from_result_or 如果 srcOk,则返回无警告的值。否则返回具有单个警告的给定 default 值。
  • Warned::from_result_or_default 如果 srcOk,则返回无警告的值。否则返回具有单个警告的 T::default() 值。
  • Warned::from_result在src为Ok时返回一个没有警告的Some值。否则,返回包含单个警告的None

FromIterator实现

FromIterator<Warned<T, W>>

可以将Warned<T, W>的序列收集为Warned<Vec<T>, W>

let src = vec![
    warned::Warned::new(111, vec![]),
    warned::Warned::new(222, vec!["oops"]),
    warned::Warned::new(333, vec!["foo", "bar"])
];
let dst = src.into_iter().collect::<warned::Warned<Vec<_>, _>>();
assert_eq!(dst.value, vec![111, 222, 333]);
assert_eq!(dst.warnings, vec!["oops", "foo", "bar"]);

FromIterator<结果<T, E>>

可以将Result<T, E>的序列收集为Warned<Vec<T>, E>

let src = vec![Ok(111), Err("oops"), Err("oops2"), Ok(222)];
let dst = src.into_iter().collect::<warned::Warned<Vec<_>, _>>();
assert_eq!(dst.value, vec![111, 222]);
assert_eq!(dst.warnings, vec!["oops", "oops2"]);

ForceFrom特质,ForceInto特质

这两个特质对类似于TryFrom/TryInto特质对。当您实现ForceFrom转换时,ForceInto实现会自动由下面的泛型实现定义。以下泛型实现也得到支持。

pub trait ForceFrom<T>: Sized {
   type Warning;
   fn force_from(src: T) -> Warned<Self, Self::Warning>;
}
pub trait ForceInto<T> {
    type Warning;
    fn force_into(self) -> Warned<T, Self::Warning>;
}

当您实现ForceFrom转换时,ForceInto实现会自动由下面的泛型实现定义

impl<T, U: ForceFrom<T>> ForceInto<U> for T {
   type Warning = U::Warning;
   fn force_into(self) -> Warned<U, Self::Warning> {
       U::force_from(self)
   }
}

以下泛型实现也得到支持。

impl<T: Into<U>, U> ForceFrom<T> for U {
    type Warning = std::convert::Infallible;
    fn force_from(src: T) -> Warned<Self, Self::Warning> {
        src.into().into()
    }
}

依赖

~175KB