rust – 在函数中返回由serde_json创建的结构

我坚持看似简单的问题.我明白为什么我看到错误但似乎无法解决它.显然我缺少一些基本的东西.

fn terraform_deploy_info<'a>(app: &'a MyApp) -> std::result::Result<&MyAppDeployInfo, Error> {
    let terraform = process::Command::new("terraform")
          // We are querying output values.
          .arg("output")
          // We want it in json format for easy processing.
          .arg("-json")
          .output()
          .expect("failed to execute terraform");

    let output = String::from_utf8_lossy(&terraform.stdout);
    let data: TerraformOutputs = serde_json::from_str(&output).unwrap();

    let m = data.deploy_info.value.iter().filter(|&x| x.app == "myapp").collect::<Vec<_>>();

    if m.len() > 1 {
        return Err(Error::MultipleDeployInfo);
    }

    match m.get(0) {
        Some(&x) => Ok(x),
        None => Err(Error::NoDeployInfo),
    }
}

我得到的错误是:

borrowed value must be valid for the lifetime 'a as defined on the body at

这对我来说很有意义,因为我在函数中创建了struct并返回了一个借来的引用,当函数完成时它当然会消失.

但是,当我更改返回类型时,请将std :: result :: Result< MyAppDeployInfo,Error> (也就是说,没有返回引用)我似乎无法让Ok(x)工作……我收到一个错误:

expected struct `MyAppDeployInfo`, found reference

同样,这有意义,因为serde_json创建了一个结构,然后我遍历引用,所以当我索引到集合时,我正在查看引用.

所以我尝试了各种各样的东西来获取结构值,如解除引用,Box :: new,clone(),to_owned()等,但仍然无法使其工作.

我在这里搜索了所有的问题,阅读了这本书等等,我仍然不清楚如何解决这个问题……任何指针都会受到赞赏.

最佳答案
如果不了解您的项目(请在下次生成MCVE),我会说您可以将.iter()调用更改为.into_iter().而不是收集到Vec然后使用get,我只是直接使用迭代器:

let m = data.deploy_info.value.into_iter().filter(|&x| x.app == "myapp").fuse();

match (m.next(), m.next()) {
    (None, None) => Err(Error::NoDeployInfo),
    (Some(x), None) => Ok(x),
    (Some(_), Some(_)) => Err(Error::MultipleDeployInfo),
    (None, Some(_)) => panic!("Iterator::fuse broken"),
}

转载注明原文:rust – 在函数中返回由serde_json创建的结构 - 代码日志