use crate::{
changelog::{self, Changelog},
graph::ProjectGraph,
repository::{PathMatcher, RepoPath, RepoPathBuf},
rewriters::Rewriter,
version::Version,
};
pub type ProjectId = usize;
#[derive(Debug)]
pub struct Project {
ident: ProjectId,
qnames: Vec<String>,
pub user_facing_name: String,
pub version: Version,
pub rewriters: Vec<Box<dyn Rewriter>>,
prefix: RepoPathBuf,
pub repo_paths: PathMatcher,
pub changelog: Box<dyn Changelog>,
pub internal_reqs: Vec<ResolvedRequirement>,
}
impl Project {
pub fn ident(&self) -> ProjectId {
self.ident
}
pub fn qualified_names(&self) -> &Vec<String> {
&self.qnames
}
pub fn prefix(&self) -> &RepoPath {
&self.prefix
}
}
#[derive(Debug)]
pub struct ProjectBuilder<'a> {
owner: &'a mut ProjectGraph,
qnames: Vec<String>,
version: Option<Version>,
prefix: Option<RepoPathBuf>,
}
impl<'a> ProjectBuilder<'a> {
#[doc(hidden)]
pub fn new(owner: &'a mut ProjectGraph) -> Self {
ProjectBuilder {
owner,
qnames: Vec::new(),
version: None,
prefix: None,
}
}
pub fn qnames<T: std::fmt::Display>(
&mut self,
qnames: impl IntoIterator<Item = T>,
) -> &mut Self {
self.qnames = qnames.into_iter().map(|s| s.to_string()).collect();
self
}
pub fn version(&mut self, version: Version) -> &mut Self {
self.version = Some(version);
self
}
pub fn prefix(&mut self, prefix: RepoPathBuf) -> &mut Self {
self.prefix = Some(prefix);
self
}
pub fn finish_init(self) -> ProjectId {
assert!(self.qnames.len() > 0);
let qnames = self.qnames;
let version = self.version.unwrap();
let prefix = self.prefix.unwrap();
self.owner.finalize_project_addition(|ident| Project {
ident,
qnames: qnames,
user_facing_name: String::new(),
version,
rewriters: Vec::new(),
prefix: prefix.clone(),
repo_paths: PathMatcher::new_include(prefix),
changelog: changelog::default(),
internal_reqs: Vec::new(),
})
}
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct ResolvedRequirement {
pub ident: ProjectId,
pub min_version: Version,
}