use serde::de::DeserializeOwned;
use crate::error::Error;
use crate::snapshot::Snapshot;
use crate::source::LoadSpec;
use super::aliases_pass::apply_aliases;
pub(crate) fn recover<T: DeserializeOwned>(
spec: &LoadSpec<'_>,
cached: &Snapshot,
) -> Result<(T, Snapshot), Error> {
let mut collected = crate::resolve::Collected::default();
collected.layer(
"cached",
crate::Origin::Runtime("cached configuration"),
cached.values().clone(),
);
super::environment::collect_env_files(&mut collected, spec)?;
super::collect_environment(&mut collected, spec)?;
super::collect_bindings(&mut collected, spec)?;
super::collect_runtime(&mut collected, spec);
let (mut tree, mut provenance) =
crate::resolve::compose(spec.engine(), collected.take_layers())?;
apply_aliases(&mut tree, &mut provenance, &collected, spec)?;
let mut snapshot = Snapshot::new(tree);
snapshot.attach_provenance(provenance);
let config: T = snapshot.extract()?;
Ok((config, snapshot))
}