推荐一款我写的动态配置语言: Faml

7 天前
 fawdlstty

GitHub 仓库地址:https://github.com/fawdlstty/faml

什么是 FAML ?

FAML 是一种扩展自 TOML 的动态配置语言,专为需要运行时配置计算和更新的场景设计。它保留了 TOML 的简洁语法,同时增加了动态表达式、条件配置和运行时可变性等高级特性。

核心特性对比

特性 TOML KCL PKL FAML
语法风格 TOML 风格 JSON 风格 结构体风格 TOML 风格
动态表达式
条件配置
运行时修改
特殊数据类型

快速示例

基本语法

[server]
port = 8080
host = "localhost"

动态表达式

[database]
host = "localhost"
port = 5432
connection_string = $"postgresql://{host}:{port}/mydb"

条件配置

[app]
env = "production"

@if env == "development"
log_level = "debug"

@if env == "production"
log_level = "error"

特殊数据类型

[cache]
ttl = 5 minutes
max_size = 100 MB

[network]
timeout = 30 seconds
buffer_size = 4 KB

复杂表达式

[user]
age = 25
is_adult = age >= 18
welcome_message = is_adult ? $"Welcome, adult user!" : $"Welcome, young user!"

运行时动态修改

let mut config = FamlExpr::from_str(config_str)?;
config["server"]["port"].set_int(9000);  // 动态修改端口
let connection_string = config["database"]["connection_string"].evaluate()?.as_str();  // 自动更新连接字符串
731 次点击
所在节点    Rust
11 条回复
CEBBCAT
7 天前
之前只了解过 jsonnet ,也许楼主可以在自己的介绍页添加和它的对比?这样我想对于新朋友了解它,或者迁移到它会有所帮助
pingdog
7 天前
运行时修改,项目概念不错,但鲁棒性如何
吾… 破坏了格式也照样载入新内容并赋值么?例如错手删除”未发觉就保存
lisxour
6 天前
不想打击你,但你这唯一的优点不觉得很危险嘛?
fawdlstty
6 天前
@pingdog 不带保存功能噢。只加载一次,后续就在读取的示例上进行修改。因此不存在破坏数据的问题
fawdlstty
6 天前
@lisxour 为什么危险?如果你指的是 faml 里带恶意代码,那设计上是安全的,faml 里只能计算,不能执行恶意指令(比如加载文件、写文件或联网啥的);如果你指的是 faml 源码里很多 unsafe ,那只能说抱歉了,我设想的需求不用 unsafe 写不出来,不过这个点不一定说明它危险,得利用 unsafe 造成的漏洞才算;再者如果你指的是一个数据修改导致其他数据发生非预期变化,这个点上危险,那我就不知道说啥了,毕竟这是用户自己写的代码,写了啥那就执行了啥
fawdlstty
6 天前
@CEBBCAT 感谢建议,我研究研究
lisxour
6 天前
@fawdlstty #5 运行中直接热重载配置,万一配置不小心写错了什么东西,是不是意味着只要一按 ctrl+s ,线上立马报错
fawdlstty
6 天前
@lisxour 没有热重载这回事呀。程序生命周期只加载一次配置。关于“万一配置不小心写错了什么东西”,这个问题有点像编程里“万一写错了一行代码”,或者 yaml 配置里“万一配错了值”。用户写的逻辑,该怎样就怎样呗,有啥语言能自动处理这种问题嘛?
lisxour
6 天前
@fawdlstty #8 好吧,我理解错你说的“运行时动态修改”特性了
if
5 天前
突然被 @ 到……
nebkad
5 天前
提一个关于能展示 FAML 设计意图示例的建议。
譬如说,
如果不使用 动态表达式,或者不使用条件配置,只用 TOML 能不能解决,相比之下 FAML 的优势是什么;
另外就是 “运行时动态修改” 这个概念,需要好好解释是相对什么的运行时?别的语言也能利用这个特性?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/1171582

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX