#![forbid(unsafe_code)]
#![warn(missing_docs)]
#![warn(rust_2018_idioms)]
pub mod workspace;
pub mod version;
pub mod git;
pub mod publish;
pub mod state;
pub mod cli;
pub mod error;
pub use error::{Result, ReleaseError};
pub use workspace::{WorkspaceInfo, DependencyGraph};
pub use version::{VersionBump, VersionManager};
pub use git::{GitManager, GitOperations};
pub use publish::Publisher;
pub use workspace::PublishOrder;
pub use state::{ReleaseState, StateManager};
pub use cli::{Command, Args};
pub struct ReleaseManager {
workspace: WorkspaceInfo,
git: GitManager,
publisher: Publisher,
state: StateManager,
}
impl ReleaseManager {
pub fn new() -> Result<Self> {
let workspace = WorkspaceInfo::analyze(".")?;
let git = GitManager::new(".")?;
let publisher = Publisher::new(&workspace)?;
let state = StateManager::new(".cyrup_release_state.json")?;
Ok(Self {
workspace,
git,
publisher,
state,
})
}
pub async fn release(&mut self, bump: VersionBump, dry_run: bool) -> Result<()> {
if dry_run {
let version_manager = VersionManager::new(self.workspace.clone());
let _preview = version_manager.preview_bump(bump)?;
Ok(())
} else {
Err(ReleaseError::Cli(crate::error::CliError::InvalidArguments {
reason: "Full release operations should use the CLI interface for proper state management".to_string(),
}))
}
}
pub async fn rollback(&mut self) -> Result<()> {
if !self.state.state_exists() {
return Err(ReleaseError::State(crate::error::StateError::NotFound));
}
Err(ReleaseError::Cli(crate::error::CliError::InvalidArguments {
reason: "Rollback operations should use the CLI interface for proper state management".to_string(),
}))
}
pub async fn resume(&mut self) -> Result<()> {
if !self.state.state_exists() {
return Err(ReleaseError::State(crate::error::StateError::NotFound));
}
let load_result = self.state.load_state()?;
let release_state = load_result.state;
if !release_state.is_resumable() {
return Err(ReleaseError::State(crate::error::StateError::Corrupted {
reason: "Release is not in a resumable state".to_string(),
}));
}
Err(ReleaseError::Cli(crate::error::CliError::InvalidArguments {
reason: "Resume operations should use the CLI interface for proper state management".to_string(),
}))
}
pub fn workspace(&self) -> &WorkspaceInfo {
&self.workspace
}
pub fn git(&mut self) -> &mut GitManager {
&mut self.git
}
pub fn publisher(&mut self) -> &mut Publisher {
&mut self.publisher
}
pub fn state(&mut self) -> &mut StateManager {
&mut self.state
}
}