gpt4 book ai didi

serialization - 如何在Rust中使用动态属性更新Yaml文件?

转载 作者:行者123 更新时间:2023-12-03 11:29:05 27 4
gpt4 key购买 nike

考虑具有当前内容的yaml文件:

namespaces:
production:

helmRepos:
stable: "https://kubernetes-charts.storage.googleapis.com"

context: monitoring

apps:
datadog:
enabled: true
namespace: production
chart: stable/datadog
version: "1.38.7"
valuesFile: "values.yaml"

我想以编程方式更新此文件中属性 version的值。
这样做的最佳方法是什么?

更难的是,我认为我无法使用结构来反序列化/序列化此文件,因为例如 helmRepos下的键可以是任何东西。

我已经看过 serde_yaml箱子,但无法弄清楚如何在具有不可预测键的文件中更改值,然后将其序列化。我还是Rust的初学者,因此可能会因此而丢失一些明显的东西。

最佳答案

如果要使用serde修改文件,则基本方法是反序列化,修改和重新序列化。这将从yaml文件中删除所有注释和自定义格式(如空行),因此我不确定这是否是您想要的方法。

使用serde_yaml,可以使用多种选项来实现此目标。我认为最简单的方法是使用Value类型,它可以表示任意yaml值:

const DOC: &str = r#"namespaces:
production:

helmRepos:
stable: "https://kubernetes-charts.storage.googleapis.com"

context: monitoring

apps:
datadog:
enabled: true
namespace: production
chart: stable/datadog
version: "1.38.7"
valuesFile: "values.yaml"
"#;

fn main() {
let mut value: serde_yaml::Value = serde_yaml::from_str(DOC).unwrap();
*value
.get_mut("apps")
.unwrap()
.get_mut("datadog")
.unwrap()
.get_mut("version")
.unwrap() = "1.38.8".into();
serde_yaml::to_writer(std::io::stdout(), &value).unwrap();
}

Playground

您可能需要适当的错误处理,而不是在各处使用 unwrap()。如果您适合使用 unwrap(),可以将上述代码简化为
let mut value: serde_yaml::Value = serde_yaml::from_str(DOC).unwrap();
value["apps"]["datadog"]["version"] = "1.38.8".into();
serde_yaml::to_writer(std::io::stdout(), &value).unwrap();

如果您不想丢失注释和空白行,事情会变得更加棘手。该目标的正确解决方案是使用 yaml_rust条板箱来分析文件并确定要更改的行。但是,如果不需要强大的代码,您可能可以采用一些临时方法来找到正确的行。

关于serialization - 如何在Rust中使用动态属性更新Yaml文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60184588/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com