in tough/src/lib.rs [310:386]
fn load<R: Read>(loader: RepositoryLoader<R>) -> Result<Self> {
let datastore = Datastore::new(loader.datastore)?;
let transport = loader
.transport
.unwrap_or_else(|| Box::new(DefaultTransport::new()));
let limits = loader.limits.unwrap_or_default();
let expiration_enforcement = loader.expiration_enforcement.unwrap_or_default();
let metadata_base_url = parse_url(loader.metadata_base_url)?;
let targets_base_url = parse_url(loader.targets_base_url)?;
// 0. Load the trusted root metadata file + 1. Update the root metadata file
let root = load_root(
transport.as_ref(),
loader.root,
&datastore,
limits.max_root_size,
limits.max_root_updates,
&metadata_base_url,
expiration_enforcement,
)?;
// 2. Download the timestamp metadata file
let timestamp = load_timestamp(
transport.as_ref(),
&root,
&datastore,
limits.max_timestamp_size,
&metadata_base_url,
expiration_enforcement,
)?;
// 3. Download the snapshot metadata file
let snapshot = load_snapshot(
transport.as_ref(),
&root,
×tamp,
&datastore,
&metadata_base_url,
expiration_enforcement,
)?;
// 4. Download the targets metadata file
let targets = load_targets(
transport.as_ref(),
&root,
&snapshot,
&datastore,
limits.max_targets_size,
&metadata_base_url,
expiration_enforcement,
)?;
let expires_iter = [
(root.signed.expires, RoleType::Root),
(timestamp.signed.expires, RoleType::Timestamp),
(snapshot.signed.expires, RoleType::Snapshot),
(targets.signed.expires, RoleType::Targets),
];
let (earliest_expiration, earliest_expiration_role) =
expires_iter.iter().min_by_key(|tup| tup.0).unwrap();
Ok(Self {
transport,
consistent_snapshot: root.signed.consistent_snapshot,
datastore,
earliest_expiration: *earliest_expiration,
earliest_expiration_role: *earliest_expiration_role,
root,
snapshot,
timestamp,
targets,
limits,
metadata_base_url,
targets_base_url,
expiration_enforcement,
})
}