#serde-json #json #lodash #serde

serde_json_lodash

lodash.js的移植版本,与serde_json::Value一起工作

7个版本

0.1.16 2022年1月23日
0.1.14 2021年4月25日
0.1.1 2020年12月26日

520编码

Download history 115/week @ 2024-03-11 89/week @ 2024-03-18 96/week @ 2024-03-25 136/week @ 2024-04-01 83/week @ 2024-04-08 38/week @ 2024-04-15 41/week @ 2024-04-22 56/week @ 2024-04-29 39/week @ 2024-05-06 41/week @ 2024-05-13 50/week @ 2024-05-20 50/week @ 2024-05-27 47/week @ 2024-06-03 49/week @ 2024-06-10 40/week @ 2024-06-17 40/week @ 2024-06-24

每月下载量 184
zero4rs 中使用

自定义许可

170KB
4.5K SLoC

serde_json_lodash

Documentation build status Downloads

根据serde_json::Valuelodash.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中的每个函数都应该以fnmacro的形式实现
    • 宏用于可选参数的使用
  • 主要输入和返回值应该是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
        • 例如 _.findIndex, ...) => ::find_index, -> isize,返回值应该是 isize,而不是 Value::Number
      • 因为 serde_json 中没有 undefined 类型,所以如果原始函数返回 undefined,则转换版本应返回 Value::Null
  • 如果原始函数允许可选参数
    • 已知数量,则转换函数应 必须是所需的
      • 例如 _.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) -> &strx_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