use crate::{Manifest, PackageId};
use semver::Version;
use std::fmt;
use std::path::{Path, PathBuf};
#[derive(Clone, PartialEq, Eq, Debug)]
pub struct Package {
manifest: Manifest,
manifest_path: PathBuf,
}
impl Package {
pub fn new(manifest: Manifest, manifest_path: &Path) -> Self {
Self {
manifest,
manifest_path: manifest_path.to_path_buf(),
}
}
pub fn from_file<P: AsRef<Path>>(path: P) -> anyhow::Result<Self> {
let path = path.as_ref();
let manifest = Manifest::from_file(path)?;
Ok(Self::new(manifest, path))
}
pub fn manifest(&self) -> &Manifest {
&self.manifest
}
pub fn manifest_path(&self) -> &Path {
&self.manifest_path
}
pub fn name(&self) -> &str {
self.manifest().name()
}
pub fn package_id(&self) -> &PackageId {
self.manifest().package_id()
}
pub fn root(&self) -> &Path {
self.manifest_path().parent().unwrap()
}
pub fn version(&self) -> &Version {
self.package_id().version()
}
pub fn source_directory(&self) -> PathBuf {
self.root().join("src")
}
}
impl fmt::Display for Package {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", self.package_id())
}
}