use std::path::{Path, PathBuf};
use crate::CanonicalLanguageIdentifierError;
use crate::fluent::FluentIdentifierError;
use crate::namespace::NamespacePathError;
use super::{LocaleRelativeFtlPathError, ResourceKeyError};
#[derive(Clone, Debug, Eq, thiserror::Error, PartialEq)]
pub enum ResourcePlanError {
#[error("invalid Fluent domain '{domain}': {details}")]
InvalidDomain {
domain: String,
details: FluentIdentifierError,
},
#[error("invalid domain resource key '{key}': {details}")]
InvalidResourceKey {
key: String,
details: ResourceKeyError,
},
#[error("invalid locale-relative resource path '{path}': {details}")]
InvalidResourcePath {
path: String,
details: LocaleRelativeFtlPathError,
},
#[error("invalid namespace '{namespace}': {details}")]
InvalidNamespace {
namespace: String,
details: NamespacePathError,
},
}
#[derive(Debug, thiserror::Error)]
pub enum SparseAssetResourcePlanError {
#[error("Failed to read i18n directory at {path:?}: {source}")]
ReadAssetsRoot {
path: PathBuf,
source: std::io::Error,
},
#[error("Failed to read directory entry in {path:?}: {source}")]
ReadAssetsRootEntry {
path: PathBuf,
source: std::io::Error,
},
#[error("Failed to read namespace directory {path:?}: {source}")]
ReadNamespaceDirectory {
path: PathBuf,
source: std::io::Error,
},
#[error("Failed to read directory entry in {path:?}: {source}")]
ReadNamespaceDirectoryEntry {
path: PathBuf,
source: std::io::Error,
},
#[error("Locale directory {path:?} contains a non-UTF-8 name")]
NonUtf8LocaleDirectory {
path: PathBuf,
},
#[error("{}", format_locale_directory_error(raw_name, path, details))]
InvalidLocaleDirectory {
raw_name: String,
path: PathBuf,
details: CanonicalLanguageIdentifierError,
},
#[error("Failed to derive namespace for asset {path:?} relative to {root:?}: {source}")]
NamespaceRelativePath {
path: PathBuf,
root: PathBuf,
source: std::path::StripPrefixError,
},
#[error("Namespace path {path:?} contains non-UTF-8 components")]
NonUtf8NamespacePath {
path: PathBuf,
},
#[error("Discovered invalid namespace '{namespace}' in assets for crate '{domain}': {details}")]
InvalidNamespace {
namespace: String,
domain: String,
details: NamespacePathError,
},
}
fn format_locale_directory_error(
raw_name: &str,
path: &Path,
details: &CanonicalLanguageIdentifierError,
) -> String {
match details {
CanonicalLanguageIdentifierError::Invalid { source, .. } => format!(
"Locale directory '{raw_name}' under \"{}\" is not a valid BCP-47 identifier: {source}",
path.display()
),
CanonicalLanguageIdentifierError::IcuInvalid { details, .. } => format!(
"Locale directory '{raw_name}' under \"{}\" could not be parsed as an ICU locale: {details}",
path.display()
),
CanonicalLanguageIdentifierError::NonCanonical { canonical, .. } => format!(
"Locale directory '{raw_name}' under \"{}\" must use canonical BCP-47 form '{canonical}'",
path.display()
),
}
}