7个版本
0.1.16 | 2022年1月23日 |
---|---|
0.1.14 | 2021年4月25日 |
0.1.1 | 2020年12月26日 |
520 在 编码
每月下载量 184
在 zero4rs 中使用
170KB
4.5K SLoC
serde_json_lodash
根据serde_json::Value和lodash.js规范,简化了生活。
用法
Cargo.toml
[dependencies]
serde_json_lodash = "0.1"
main.rs
#[macro_use] extern crate serde_json_lodash;
use serde_json::json;
fn main() {
// macro style, optional parameters
assert_eq!(
merge!(json!({'a':1}), json!({'b':2}), json!({'c':3})),
json!({'a': 1, 'b': 2, 'c': 3})
);
// fn style, fixed parameters
use serde_json_lodash::merge;
assert_eq!(
merge(json!({'a':1}), json!({'b':2})),
json!({'a': 1, 'b': 2})
);
// `x_`, `_x` helpers for simple types
assert_eq!(capitalize!(json!("FRED")), json!("Fred"));
assert_eq!(x_capitalize!("FRED"), json!("Fred"));
assert_eq!(capitalize_x!(json!("FRED")), "Fred".to_owned());
assert_eq!(x_capitalize_x!("FRED"), "Fred".to_owned());
}
概念
所有实现都应尽可能与lodash相同
如何实现?
- lodash.js中的每个函数都应该以
fn
和macro
的形式实现- 宏用于可选参数的使用
- 主要输入和返回值应该是
serde_json::Value
,除了- 输入
- 如果输入参数是选项而非数据,则始终使用原始类型而不是Value
- 例如
_.chunk(array, [size=1])
=>::chunk(json!([1,2,3]), 2)
,size应该是usize
,而不是Value::Number
- 例如
- 在某些情况下,我们使用
std::ops::Fn
作为输入参数- 例如
_.findIndex, array, predicate, ...)
=>::find_index, predicate: fn(&Value) -> bool, ...)
- 例如
- 如果输入参数是选项而非数据,则始终使用原始类型而不是Value
- 调整值
- 如果返回值是统计值,则使用 原始类型 代替 Value
- 例如
_.findIndex, ...)
=>::find_index, -> isize
,返回值应该是isize
,而不是Value::Number
- 例如
- 因为 serde_json 中没有
undefined
类型,所以如果原始函数返回undefined
,则转换版本应返回 Value::Null
- 如果返回值是统计值,则使用 原始类型 代替 Value
- 输入
- 如果原始函数允许可选参数
- 已知数量,则转换函数应 必须是所需的
- 例如
_.get, object, path, [defaultValue])
=>::get, object, path, defaultValue)
- 例如
- 无限数量,转换函数应 仅保留一个,不再有可选参数
- 例如
_.merge, object, [...sources])
=>::merge, object, source)
,但宏可以::merge!(object, source1, source2, ...)
- 例如
- 已知数量,则转换函数应 必须是所需的
- 可能实现辅助函数,用于不同的输入和输出类型
- 带有
x_
前缀:输入不是 Value,将降级类型- 例如
x_capitalize, &str) -> Value
- 例如
- 带有
_x
后缀:输出不是 Value,将降级类型- 例如
capitalize_x, Value) -> String
- 例如
- 同时带有
x_
和_x
- 例如:
x_capitalize_x(&str) -> &str
,x_add_x(n: Number, n2: Number) -> Number
- 例如:
- 如果函数接受多种类型,辅助函数将仅选择一种类型来实现
- 例如:
_.toString([1,2])
,_.toString(123)
=>::x_to_string(v: &str) -> Value
- 例如:
- 带有
- 关于测试用例
示例:
部分应与lodash文档中的示例完全相同。- 更多的测试用例应全部放入
更多示例
部分,我们依赖强大的Rust文档测试
开发备忘录
# Up
./dev.sh
# Watch and test single file
./dev.sh --doc set
# Lint
./lint.sh
# Preview doc
cargo doc --open
# Bump patch version and push
./bump_push.sh
检查lodash.js API
$ npm i
$ node
Welcome to Node.js v15.14.0.
Type ".help" for more information.
> const l = require('lodash')
undefined
> l.toString()
''
>
依赖关系
~355–760KB
~17K SLoC