| // Copyright 2022 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 assembly_file_relative_path::{FileRelativePathBuf, SupportsFileRelativePaths}; |
| use camino::Utf8PathBuf; |
| use schemars::JsonSchema; |
| use serde::{Deserialize, Serialize}; |
| |
| pub fn path_schema(gen: &mut schemars::gen::SchemaGenerator) -> schemars::schema::Schema { |
| let mut schema: schemars::schema::SchemaObject = <String>::json_schema(gen).into(); |
| schema.format = Some("Utf8PathBuf".to_owned()); |
| schema.into() |
| } |
| |
| pub fn vec_path_schema(gen: &mut schemars::gen::SchemaGenerator) -> schemars::schema::Schema { |
| let mut schema: schemars::schema::SchemaObject = <Vec<String>>::json_schema(gen).into(); |
| schema.format = Some("Vec<Utf8PathBuf>".to_owned()); |
| schema.into() |
| } |
| |
| pub fn option_path_schema(gen: &mut schemars::gen::SchemaGenerator) -> schemars::schema::Schema { |
| let mut schema: schemars::schema::SchemaObject = <Option<String>>::json_schema(gen).into(); |
| schema.format = Some("Option<Utf8PathBuf>".to_owned()); |
| schema.into() |
| } |
| |
| /// These are the package sets that a package can belong to. |
| /// |
| /// See RFC-0212 "Package Sets" for more information on these: |
| /// https://fuchsia.dev/fuchsia-src/contribute/governance/rfcs/0212_package_sets |
| /// |
| /// NOTE: Not all of the sets defined in the RFC are currently supported by this |
| /// enum. They are being added as they are needed by assembly. |
| #[derive(Clone, Debug, Deserialize, Serialize, PartialEq, JsonSchema)] |
| #[serde(rename_all = "snake_case")] |
| pub enum PackageSet { |
| /// The packages in this set are stored in the pkg-cache, and are not |
| /// garbage collected. They are always available, and are pinned by merkle |
| /// when the system is assembled. |
| /// |
| /// They cannot be updated without performing an OTA of the system. |
| Base, |
| |
| /// The contents of the cache package set are present on the device in |
| /// nearly all circumstances but the version may be updated in some |
| /// circumstances during local development. This package set is not used |
| /// in production. |
| Cache, |
| |
| /// The packages in this set are placed in one of the other package sets by |
| /// assembly based on the assembly context. |
| Flexible, |
| |
| /// The packages in this set are merged into the "base" package |
| /// (system image) to make them available to the software delivery |
| /// subsystem while the system is booting up. |
| System, |
| |
| /// The packages in this set are stored in the BootFS in the zbi. They are |
| /// always available (via `fuchsia-boot:///<name>` pkg urls), and are pinned |
| /// by merkle when the ZBI is created. |
| /// |
| /// They cannot be updated without performing an OTA of the system. |
| Bootfs, |
| |
| /// The on-demand packages are packages that are known to assembly, but are |
| /// not part of the assembled image itself. These will not be included in |
| /// the product images unless developer overrides push them into the base |
| /// package set. |
| /// |
| /// Note: This was previously the "universe" package set, and RFC-0212 |
| /// refined this as the "on-demand;[anchored|updateable]" package set. No |
| /// anchoring (merkle-pinning) is done at this time. |
| /// see: https://fuchsia.dev/fuchsia-src/contribute/governance/rfcs/0212_package_sets?hl=en#change-7 |
| OnDemand, |
| } |
| |
| impl std::fmt::Display for PackageSet { |
| fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { |
| f.write_str(match self { |
| PackageSet::Base => "base", |
| PackageSet::Cache => "cache", |
| PackageSet::Flexible => "flexible", |
| PackageSet::System => "system", |
| PackageSet::Bootfs => "bootfs", |
| PackageSet::OnDemand => "on_demand", |
| }) |
| } |
| } |
| |
| /// Details about a package that contains drivers. |
| #[derive(Clone, Debug, Default, Deserialize, Serialize, PartialEq, JsonSchema)] |
| #[serde(deny_unknown_fields)] |
| pub struct DriverDetails { |
| /// The package containing the driver. |
| #[schemars(schema_with = "path_schema")] |
| pub package: Utf8PathBuf, |
| |
| /// The driver components within the package, e.g. meta/foo.cm. |
| #[schemars(schema_with = "vec_path_schema")] |
| pub components: Vec<Utf8PathBuf>, |
| } |
| |
| /// This defines one or more drivers in a package, and which package set they |
| /// belong to. |
| #[derive( |
| Clone, Debug, Deserialize, Serialize, PartialEq, SupportsFileRelativePaths, JsonSchema, |
| )] |
| #[serde(deny_unknown_fields)] |
| pub struct PackagedDriverDetails { |
| /// The package containing the driver. |
| pub package: FileRelativePathBuf, |
| |
| /// Which set this package belongs to. |
| pub set: PackageSet, |
| |
| /// The driver components within the package, e.g. meta/foo.cm. |
| #[schemars(schema_with = "vec_path_schema")] |
| pub components: Vec<Utf8PathBuf>, |
| } |
| |
| /// This defines a package, and which package set it belongs to. |
| #[derive( |
| Clone, Debug, Deserialize, Serialize, PartialEq, SupportsFileRelativePaths, JsonSchema, |
| )] |
| #[serde(deny_unknown_fields)] |
| pub struct PackageDetails { |
| /// A package to add. |
| pub package: FileRelativePathBuf, |
| |
| /// Which set this package belongs to. |
| pub set: PackageSet, |
| } |
| |
| /// A typename to clarify intent around what Strings are package names. |
| pub(crate) type PackageName = String; |
| |
| /// Options for features that may either be forced on, forced off, or allowed |
| /// to be either on or off. Features default to disabled. |
| #[derive(Debug, Deserialize, Serialize, PartialEq, JsonSchema)] |
| #[serde(rename_all = "snake_case")] |
| #[serde(deny_unknown_fields)] |
| #[derive(Default)] |
| pub enum FeatureControl { |
| #[default] |
| Disabled, |
| |
| Allowed, |
| |
| Required, |
| } |
| |
| impl PartialEq<FeatureControl> for &FeatureControl { |
| fn eq(&self, other: &FeatureControl) -> bool { |
| self.eq(&other) |
| } |
| } |