1use coil_storage::{DeliveryMode, StorageExecutionError, StoragePlanningError, StoragePolicy};
2use thiserror::Error;
3
4#[derive(Debug, Error, PartialEq, Eq)]
5pub enum AssetModelError {
6 #[error(transparent)]
7 Storage(#[from] StoragePlanningError),
8 #[error(transparent)]
9 Execution(#[from] StorageExecutionError),
10 #[error("`{field}` cannot be empty")]
11 EmptyField { field: &'static str },
12 #[error(
13 "deployment artifact `{logical_path}` must be content-addressed and include fingerprint `{fingerprint}` in `{hashed_path}`"
14 )]
15 UnhashedDeploymentArtifact {
16 logical_path: String,
17 hashed_path: String,
18 fingerprint: String,
19 },
20 #[error("deployment release `{release_id}` contains duplicate logical path `{logical_path}`")]
21 DuplicateDeploymentArtifact {
22 release_id: String,
23 logical_path: String,
24 },
25 #[error(
26 "deployment artifact `{logical_path}` resolved to policy {policy:?}; deployment artifacts must remain public object-store assets"
27 )]
28 InvalidDeploymentPolicy {
29 logical_path: String,
30 policy: StoragePolicy,
31 },
32 #[error("asset `{asset_id}` has no live published revision")]
33 MissingLiveRevision { asset_id: String },
34 #[error("asset `{asset_id}` is not in a published state")]
35 NotPublished { asset_id: String },
36 #[error("asset `{asset_id}` cannot be delivered publicly with mode `{delivery_mode}`")]
37 PublicDeliveryRequiresPublicCdn {
38 asset_id: String,
39 delivery_mode: DeliveryMode,
40 },
41 #[error("delivery planning for `{logical_path}` requires an object-store key")]
42 MissingObjectKey { logical_path: String },
43 #[error("delivery planning for `{logical_path}` requires a local path")]
44 MissingLocalPath { logical_path: String },
45 #[error("delivery planning for `{logical_path}` requires a CDN base URL")]
46 MissingCdnBaseUrl { logical_path: String },
47 #[error("delivery planning for `{logical_path}` requires an app proxy base path")]
48 MissingAppProxyBase { logical_path: String },
49 #[error("asset `{asset_id}` has no live revision to unpublish")]
50 CannotUnpublishWithoutLiveRevision { asset_id: String },
51 #[error("theme asset root `{root}` is missing")]
52 MissingThemeAssetRoot { root: String },
53 #[error("theme asset source `{path}` could not be read: {message}")]
54 ThemeAssetReadFailed { path: String, message: String },
55 #[error("theme asset source was not found for logical path `{logical_path}`")]
56 MissingThemeAssetSource { logical_path: String },
57}