#validation #float #wrapper #utility #default-value

无需std floco

Floco验证浮点数是否符合约束

3个版本

0.1.2 2024年5月19日
0.1.1 2024年3月24日
0.1.0 2024年1月30日

数学 中排名第 251

Download history 171/week @ 2024-05-14 29/week @ 2024-05-21

每月下载量 215

MIT/Apache

21KB
237

floco 🛟   构建状态 Codecov徽章 Apache徽章 MIT徽章

Floco验证浮点数是否符合用户定义的约束。

快速开始

use floco::{Floco, Constrained};

// We want to represent a value as f64, but we don't want to allow:
//      - values below 5.0f64
//      - values above 7.2f64

// We define an empty struct.
// This won't contain data, but will contain validation criteria in its impl.
struct Foo;

// The Constrained trait defines the above constraints, an error type, and a default value.
impl Constrained<f64> for Foo {

    type Error = &'static str;

    fn is_valid(value: f64) -> bool {
        value >= 5.0f64 && value <= 7.2f64
    }

    fn emit_error(_value: f64) -> Self::Error {
        "yikes this is a bad foo"
    }

    // Optionally, you can set a custom default.
    // Floco::<F, YourType>::Default will respect the default value impl for YourType.
    fn get_default() -> f64 {
        5.2f64
     }
}

// Now we can use Foo to constrain a Floco
let this_will_be_ok = Floco::<f64, Foo>::try_new(6.8);
let this_will_be_err = Floco::<f64, Foo>::try_new(4.2);

概述

此crate提供了一个结构体,该结构体封装了一个浮点数和一个PhantomData标记类型。标记类型定义了内部浮点数的任意验证条件。这些验证条件在构造、转换和反序列化过程中被调用。

标记类型还提供了一个Error类型和可选的默认值(默认为零)。

Floco默认与no_std兼容,但可以通过功能标志提供对标准库的可选支持。这不会添加任何功能,只是将数学运算从libm改为std,并将错误从thiserror-core改为thiserror。如果启用了std,Floco应在稳定版上编译,但将需要error_in_core功能来为no_std构建。

Floco与实现num_traits crate中float trait的任何类型兼容。为了方便,实现了从f32和f64到TryFrom的转换。

路线图

  • 在某个时候,我打算在Floco结构体上实现ops traits。
  • 在某个时候,我打算添加一个宏来减少newtype的样板。
  • 我想创建一个类似的包含泛型uom维度的结构体,但可能会将其放入一个单独的crate中。
  • 不确定如何处理Copy trait。需要仔细考虑。
  • prae 使用宏来创建不同的类型,而不是在任意的标记实现中使单一类型泛化。Prae 与 no_std 不兼容。
  • tightness 是 prae 的前身。
  • typed_floats 提供了12种有用的预制作限制浮点类型。参见 TypedFloats 说明书末尾的“类似包”部分。

灵感来源

许可协议

在以下任一许可协议下发布:

任选其一。

贡献

除非你明确说明,否则任何有意提交并由你包含在作品中的贡献,根据 Apache-2.0 许可协议定义,将如上所述双许可,不附加任何额外条款或条件。

依赖

~0.9–1.5MB
~33K SLoC