在反序列化时,使用 serde 将外部字符串引用 ( IDs / "foreign keys" ) 解析为同一文档中其他地方存在的结构

Resolving external string references ( IDs / "foreign keys" ) to structs present elsewhere in the same document, at deserialization time, with serde

我有 Context 个对象 - 本质上是 ClusterUser 之间的连接记录 - 在 kubernetes 配置 yaml ( ~/.kube/config ) i'我想解析成一个看起来像这样的结构:

struct Context {
  name: String,
  cluster: Cluster,
  user: User
}

struct Cluster {
  server: String
  // ..
}

struct User {
  name: String,
  // ..
}

yaml 本身将这些编码为单独的数组,例如:

contexts:
- name: some_context
  context:
    cluster: some_cluster
    user: some_user
clusters:
- name: some_cluster
  cluster:
    // many other, important fields ..
users:
- name: some_user
  user:
    // many other, important fields ..

我什至不知道从哪里开始 - 似乎我需要先访问文档的临时表示,然后才能“向前看”以解析其他部分的一些复杂结构Context

外部的这些结构中的文档

我发现首选的 kubernetes 客户端 crate 正在解析这个确切的文件,但它回避这样做,只提供“原始”字符串键

https://github.com/clux/kube-rs/blob/8c42f78ef86950baa17440fab992e39a12c5811b/kube/src/config/file_config.rs#L128

#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct Context {
    pub cluster: String, // ideally cluster: Cluster
    pub user: String, // ideally user: User
    pub namespace: Option<String>,
    pub extensions: Option<Vec<NamedExtension>>,
}

(我在上面的片段中发表评论)

是否有关于如何执行此 serde 的示例?

我想了很久,这可能不在 serde 的范围内。我目前确实找不到办法。

相反,我在具有字符串 id 引用的低级类型(直接来自 serde)和我的高级类型之间实现了一个 TryFrom,这些引用已解析。