Skip to main content

fakecloud_codeartifact/
state.rs

1//! Account-partitioned, serializable state for AWS CodeArtifact.
2//!
3//! Resources are stored as assembled response-shaped JSON values so a read
4//! returns exactly what was written (round-trip fidelity). Keys are the
5//! natural identifiers: a domain by name, a repository by `domain/repo`, a
6//! package group by `domain\u{1}pattern`, a package by
7//! `domain\u{1}repo\u{1}format\u{1}namespace\u{1}package`, and a package
8//! version by that package key plus `\u{1}version`. Published asset bytes are
9//! kept base64-encoded alongside the version so a later `GetPackageVersionAsset`
10//! streams back exactly what `PublishPackageVersion` stored.
11
12use std::collections::BTreeMap;
13use std::sync::Arc;
14
15use parking_lot::RwLock;
16use serde::{Deserialize, Serialize};
17use serde_json::Value;
18
19use fakecloud_core::multi_account::{AccountState, MultiAccountState};
20
21pub const CODEARTIFACT_SNAPSHOT_SCHEMA_VERSION: u32 = 1;
22
23/// The account-scoped CodeArtifact state for one AWS account.
24#[derive(Debug, Clone, Default, Serialize, Deserialize)]
25pub struct CodeArtifactState {
26    /// Domains keyed by domain name; value is a `DomainDescription` JSON.
27    #[serde(default)]
28    pub domains: BTreeMap<String, Value>,
29    /// Insertion order of domain names (most-recent last).
30    #[serde(default)]
31    pub domain_order: Vec<String>,
32    /// Domain permission policies keyed by domain name; value is a
33    /// `ResourcePolicy`-shaped JSON (`resourceArn`, `revision`, `document`).
34    #[serde(default)]
35    pub domain_policies: BTreeMap<String, Value>,
36    /// Repositories keyed by `domain/repo`; value is a `RepositoryDescription`
37    /// JSON carrying `upstreams` and `externalConnections`.
38    #[serde(default)]
39    pub repositories: BTreeMap<String, Value>,
40    /// Insertion order of `domain/repo` keys (most-recent last).
41    #[serde(default)]
42    pub repository_order: Vec<String>,
43    /// Repository permission policies keyed by `domain/repo`.
44    #[serde(default)]
45    pub repository_policies: BTreeMap<String, Value>,
46    /// Package groups keyed by `domain\u{1}pattern`; value is a
47    /// `PackageGroupDescription` JSON.
48    #[serde(default)]
49    pub package_groups: BTreeMap<String, Value>,
50    /// Insertion order of package-group keys (most-recent last).
51    #[serde(default)]
52    pub package_group_order: Vec<String>,
53    /// Allowed repositories per package group + origin-restriction type, keyed
54    /// by `domain\u{1}pattern\u{1}restrictionType`; value is a list of
55    /// repository-name strings.
56    #[serde(default)]
57    pub package_group_allowed: BTreeMap<String, Vec<String>>,
58    /// Packages keyed by the package key
59    /// (`domain\u{1}repo\u{1}format\u{1}namespace\u{1}package`); value is a
60    /// `PackageSummary`-shaped JSON carrying `originConfiguration`.
61    #[serde(default)]
62    pub packages: BTreeMap<String, Value>,
63    /// Insertion order of package keys (most-recent last).
64    #[serde(default)]
65    pub package_order: Vec<String>,
66    /// Package versions keyed by `<packageKey>\u{1}<version>`; value is a
67    /// `PackageVersionDescription`-shaped JSON.
68    #[serde(default)]
69    pub package_versions: BTreeMap<String, Value>,
70    /// Assets keyed by `<packageKey>\u{1}<version>\u{1}<assetName>`; value is an
71    /// `AssetSummary`-shaped JSON (`name`, `size`, `hashes`).
72    #[serde(default)]
73    pub assets: BTreeMap<String, Value>,
74    /// Base64-encoded asset bytes keyed identically to `assets`.
75    #[serde(default)]
76    pub asset_content: BTreeMap<String, String>,
77    /// Package-version readmes keyed by `<packageKey>\u{1}<version>`.
78    #[serde(default)]
79    pub readmes: BTreeMap<String, String>,
80    /// Resource tags keyed by resource ARN; value is a `TagList` (list of
81    /// `{key,value}` objects).
82    #[serde(default)]
83    pub tags: BTreeMap<String, Vec<Value>>,
84}
85
86impl AccountState for CodeArtifactState {
87    fn new_for_account(_account_id: &str, _region: &str, _endpoint: &str) -> Self {
88        Self::default()
89    }
90}
91
92pub type SharedCodeArtifactState = Arc<RwLock<MultiAccountState<CodeArtifactState>>>;
93
94#[derive(Debug, Serialize, Deserialize)]
95pub struct CodeArtifactSnapshot {
96    pub schema_version: u32,
97    pub accounts: MultiAccountState<CodeArtifactState>,
98}