1 个不稳定版本
0.2.0 | 2021 年 5 月 24 日 |
---|
#6 在 #libraries
80KB
1.5K SLoC
Json 生成器
根据提供的示例组成 JSON 主体和定义生成新项逻辑的一组函数的简单控制台工具。
该工具允许将生成的 JSON 传输到不同的来源,如 HTTP 服务器、文件夹、文件或控制台
总体而言
给定模板
{
"description": "the example how to create a json template to generate new jsons",
"note": "the prefix | in a field name signals that the field carries a function to generate data.",
"record": {
"|type": "str_from_list(business,technical,analytical)",
"technical":{
"|id": "uuid()",
"|index": "seq()",
"|updated_tm": "dt()",
"|created_tm": "dt(%Y-%m-%d %H:%M:%S)"
},
"|is_active": "bool()",
"|name": "str(10,customer)",
"|email": "str(5,,@gmail.com)",
"|code": "str(5,,'(code)')",
"|dsc": "str(20)",
"geo": {
"|country": "str_from_file(jsons/countries,,)",
"|city": "str_from_file(jsons/cities,'\n')",
"|street": "str(10,,-street)",
"|house": "int(1,1000)"
},
"|id_parent": "int_from_list(1,2,3,4,5,6,7)",
"|related_records": "int(1,1000) -> array(5)"
}
}
生成的 json
{
"description": "the example how to create a json template to generate new jsons",
"note": "the prefix | in a field name signals that the field carries a function to generate data.",
"record": {
"code": "Upaz2(code)",
"dsc": "gLgvDinPZg1aMu9LpPyp",
"email": "[email protected]",
"geo": {
"city": "Rome",
"country": "Australia",
"house": 770,
"street": "7Ke4CAHWpk-street"
},
"id_parent": 7,
"is_active": false,
"name": "customerXgKChm5t2b",
"related_records": [
263,
489,
390,
226,
361
],
"technical": {
"created_tm": "2021-05-23 13:09:27",
"id": "339b0ca7-0e00-4d6e-8073-d270d7d56e2e",
"index": 1,
"updated_tm": "2021-05-23 13:09:27"
},
"type": "analytical"
}
}
生成的规则
总体而言,如果字段没有特定的前缀,表示该字段包含生成器函数,则取该字段的值并将其作为结果返回。否则,如果字段名称中包含前缀,则期望值是一个字符串,描述生成值的函数。默认前缀是 |
,如示例所示
{
"|dynamic_field_with_generator": "seq()",
"static_field": "constant"
}
*注意:如果前缀符号与现有字段冲突,则可以将其更改为任何其他字符。
生成器
每个生成器都有以下语法: generator name ( arg1, arg2, ..)
如果生成器包含另一个生成器,则语法将获得额外的元素: internal generator (arg1, arg2, .. ) -> encompassing generator (arg1, arg2, ..)
生成器可以有空的参数: str(10,,postfix)
字符串字面量可以直接放置为参数,也可以用单引号括起来: str(10,literal,'with quotes')
生成器列表
生成器 | 参数=默认值 | 描述 | 示例 |
---|---|---|---|
seq | 起始点=0,步长=1 | 顺序增加的数字行(1,2,3,4 ...) | seq() / seq(10,2) / seq(,2) |
bool | 生成的布尔值 | bool() | |
str | 行大小=0,前缀='',后缀='' | 由随机字母和数字组成的行,具有前缀和后缀的预定义长度 | str() / str(10) / str(,prefix,) / str(,,'suffix') / str(10,abc,cde) |
int | 下限=0,上限=1000 | 位于预定义范围内的随机数 | int() / int(1,100) / int(1) / int(,10) |
str_from_list | 值列表 | 字符串列表 | str_from_list(a,'b',c,d) |
int_from_list | 值列表 | 数字列表 | int_from_list(1,2,3,4,5) |
str_from_file | 文件路径,分隔符=',' | 从预定义文件中提取的字符串列表:注意,分隔符可以省略,默认分隔符(,)将被使用 | str_from_file(\home\user\json) str_from_file(\home\user\json,;) str_from_file(\home\user\json,\n) |
int_from_file | 文件路径,分隔符=',' | 从预定义文件中提取的数字列表:注意,分隔符可以省略,默认分隔符(,)将被使用 | int_from_file(c:\user\json) |
uuid | 生成的uuid | uuid() | |
dt | 格式=%Y-%m-%d %H:%M:%S | 当前日期和时间。 | dt(%Y-%m-%d)/dt() |
array | func_to_generate -> array(number=1) | 用于获取填充数组的生成器。 | int(1) -> array() |
如何使用
从控制台
命令行示例
json-generator -f "file path" -r 10 --pretty --logs --to-folder folder --to-curl '-X POST ip'
命令行参数
短 | 长 | 描述 | 示例 |
---|---|---|---|
b | body | 文本表示json模板 | --body | -b '{"k":"v"}' |
f | file | 包含json模板的文件路径 | --file | -f c:\folder\json.json |
r | repeat | 重复次数 | --repeat | -r 10 |
i | indicator | 指示字段包含生成函数的指示器。 | --indicator | -i > |
pretty | 插入格式化符号以使json可读 | --pretty | |
logs | 打印日志 | --logs | |
to-console | 在控制台显示json(默认情况下,如果输出数组为空) | --to-console | |
to-file | 将生成的json追加到文件中。如果文件不存在,则创建一个新的文件。文件夹应该存在。 | --to-file c:\folder\jsons.json | |
to-folder | 在所选文件夹中创建新文件。如果不存在,则创建文件夹。 | --to-file c:\folder | |
to-curl | 使用curl将json发送到服务器。实际上,将添加-d。 | --to-curl "-H Content-Type:application/json -X POST 127.0.0.1:7878" | |
h | help | 有关命令的信息 | -h | --help |
V | version | version | -V | --version |
注意:使用--to-curl参数的系统需要安装curl实用程序。
从依赖项
json-generator="0.2.0"
use json_generator::json_template::JsonTemplate;
use json_generator::generate;
use serde_json::Value;
fn main() {
let json_template:&str = "{\"|id\":\"seq()\"}";
let mut json_template = JsonTemplate::from_str(json_template, "|").unwrap();
let generated_value:Vec<Value> = generate(&mut json_template,10,true,&mut vec![]);
}
发送者
函数generate获取最后一个参数,它是一个发送者数组。本质上,发送者是实现sender trait的结构体。
pub trait Sender {
fn send(&mut self, json: &Value, pretty: bool) -> Result<String, GenError>;
}
简单实现示例
use json_generator::sender::{Sender, ConsoleSender, string_from};
use serde_json::Value;
impl Sender for ConsoleSender {
fn send(&mut self, json: &Value, pretty: bool) -> Result<String, GenError> {
println!("{}", string_from(json, pretty)?);
Ok("the item has been sent to the console".to_string())
}
}
GenError
默认情况下,所有内容都包裹在Gen(erator)Error中,这是处理错误的一般结构。
通常,它具有以下内容
#[derive(Debug)]
pub struct GenError {
reason: String,
tpe: GenErrorType,
}
#[derive(Debug)]
pub enum GenErrorType {
Parser,
Sender,
Generator,
Common,
}
并提供以下方法来操作
impl GenError {
pub fn new_with(reason: &str) -> Self {..}
pub fn new_with_in_parser(reason: &str) -> Self {..}
pub fn new_with_in_sender(reason: &str) -> Self {..}
pub fn new_with_in_generator(reason: &str) -> Self {..}
}
依赖关系
~13–22MB
~336K SLoC