use std::path::{Path, PathBuf};
use serde::{Deserialize, Serialize};
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum SourceScope {
User,
Project,
#[default]
Temporary,
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub enum SourceOrigin {
Package,
#[default]
TopLevel,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct PathMetadata {
pub source: String,
pub scope: SourceScope,
pub origin: SourceOrigin,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub base_dir: Option<PathBuf>,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SourceInfo {
pub path: PathBuf,
pub source: String,
pub scope: SourceScope,
pub origin: SourceOrigin,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub base_dir: Option<PathBuf>,
}
impl SourceInfo {
#[must_use]
pub fn from_metadata(path: &Path, metadata: &PathMetadata) -> Self {
Self {
path: path.to_path_buf(),
source: metadata.source.clone(),
scope: metadata.scope,
origin: metadata.origin,
base_dir: metadata.base_dir.clone(),
}
}
#[must_use]
pub fn synthetic(
path: &Path,
source: &str,
scope: Option<SourceScope>,
base_dir: Option<PathBuf>,
) -> Self {
Self {
path: path.to_path_buf(),
source: source.to_owned(),
scope: scope.unwrap_or_default(),
origin: SourceOrigin::TopLevel,
base_dir,
}
}
}