blob: 2d3e7cc895ddf8f53870640ed483c180e4f21d25 [file] [log] [blame]
// Copyright 2025 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
use camino::Utf8PathBuf;
use fuchsia_url::{Hash, UnpinnedAbsolutePackageUrl};
use serde::{Deserialize, Serialize};
use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet};
#[derive(PartialEq, Hash, Eq, Debug, Serialize, Deserialize)]
pub enum Capability {
#[serde(rename = "protocol")]
Protocol(String),
}
impl std::fmt::Display for Capability {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Protocol(s) => write!(f, "{s}"),
}
}
}
#[derive(Debug, Serialize, Deserialize)]
pub struct PackageContents {
/// The URL of this package.
pub url: UnpinnedAbsolutePackageUrl,
/// The named files included in this package.
pub files: Vec<PackageFile>,
/// The named components included in this package.
pub components: HashMap<String, ComponentContents>,
/// The blobs referenced by this package as "blobs/*" files.
pub blobs: Vec<String>,
}
impl PackageContents {
pub fn new(url: UnpinnedAbsolutePackageUrl) -> Self {
Self { url, files: Vec::new(), components: HashMap::new(), blobs: Vec::new() }
}
}
#[derive(Default, Debug, Serialize, Deserialize)]
pub struct PackageFile {
pub name: String,
pub hash: String,
}
#[derive(Default, Debug, Serialize, Deserialize)]
pub struct ComponentContents {
pub used_from_parent: HashSet<Capability>,
pub used_from_child: HashSet<(Capability, String)>,
pub offered_from_self: HashSet<Capability>,
pub exposed_from_self: HashSet<Capability>,
pub exposed_from_child: HashSet<(Capability, String)>,
}
#[derive(Serialize, Deserialize)]
pub struct OutputSummary {
pub packages: BTreeMap<Hash, PackageContents>,
pub contents: BTreeMap<Hash, FileInfo>,
pub files: BTreeMap<u32, FileMetadata>,
pub protocol_to_client: ProtocolToClientMap,
}
pub type ProtocolToClientMap = HashMap<String, HashMap<Hash, HashSet<String>>>;
#[derive(Clone, Serialize, Deserialize)]
pub struct FileMetadata {
pub source_path: String,
}
#[derive(Serialize, Deserialize)]
pub enum FileInfo {
#[serde(rename = "elf")]
Elf(ElfContents),
#[serde(rename = "other")]
Other(OtherContents),
}
#[derive(Serialize, Deserialize)]
pub struct ElfContents {
pub source_path: String,
pub source_file_references: BTreeSet<u32>,
}
impl ElfContents {
pub fn new(source_path: String) -> Self {
Self { source_path, source_file_references: BTreeSet::new() }
}
}
#[derive(Serialize, Deserialize)]
pub struct OtherContents {
pub source_path: Utf8PathBuf,
}