我有一个看起来像这样的 struct :
#[derive(Serialize, Deserialize)]
pub struct TestItem {
pub a: String,
pub b: String,
}
#[derive(Serialize, Deserialize)]
pub struct Test {
pub items: Vec<TestItem>,
}
我想使用InlineTable
来序列化它,因为它的可读性更强,但toml
crate 默认为常规表.例如我想要:
items = [
{ a = "testa1", b = "testb1" },
# etc
]
但toml::to_string(...)
给
[[items]]
a = "testa1"
b = "testb1"
#etc
这似乎是一个相当常见的请求,例如请参阅toml#592,并且有一个example in the toml_edit
crate在这种情况下似乎不起作用,因为items
是ArrayOfTables
.
我try 过以下访客
impl VisitMut for TestVisitor {
fn visit_table_mut(&mut self, node: &mut Table) {
visit_table_mut(self, node);
node.set_implicit(true);
}
fn visit_table_like_kv_mut(&mut self, mut key: KeyMut<'_>, node: &mut Item) {
println!("This is hit: {:?} -> {node:?}", key.get());
if let Item::Table(table) = node {
println!("This is never hit, as its an ArrayOfTables");
let table = std::mem::replace(table, Table::new());
let inline_table = table.into_inline_table();
key.fmt();
*node = Item::Value(Value::InlineTable(inline_table));
}
// Recurse further into the document tree.
visit_table_like_kv_mut(self, key, node);
}
fn visit_array_mut(&mut self, node: &mut Array) {
node.fmt();
}
}
但这似乎跳过了ArrayOfTables
中的Table
,所以if
永远不会被击中.输出是:
This is hit: "items" -> ArrayOfTables(...)
This is hit: "a" -> Value(String(...)
// etc - the tables are never visited
我该如何构建一个可以将items
内的任何表转换为InlineTable
的访问者?似乎VisitMut
中的所有其他方法都采用Table
,所以我无法按照示例要求将它们Mutations 为InlineTable
.