3个版本
0.1.2 | 2024年5月19日 |
---|---|
0.1.1 | 2024年3月24日 |
0.1.0 | 2024年1月30日 |
在 数学 中排名第 251
每月下载量 215
21KB
237 行
floco 🛟
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。需要仔细考虑。
替代/相关Crates
- prae 使用宏来创建不同的类型,而不是在任意的标记实现中使单一类型泛化。Prae 与 no_std 不兼容。
- tightness 是 prae 的前身。
- typed_floats 提供了12种有用的预制作限制浮点类型。参见 TypedFloats 说明书末尾的“类似包”部分。
灵感来源
许可协议
在以下任一许可协议下发布:
- Apache 许可协议 2.0 版,(LICENSE-APACHE 或 http://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可协议 (LICENSE-MIT 或 https://opensource.org/licenses/MIT)
任选其一。
贡献
除非你明确说明,否则任何有意提交并由你包含在作品中的贡献,根据 Apache-2.0 许可协议定义,将如上所述双许可,不附加任何额外条款或条件。
依赖
~0.9–1.5MB
~33K SLoC