use std::time::Duration;
use crate::contract::schema::Adapter;
use crate::protocol::release::{BuildArtifacts, DryRunReport, PlannedCommand, PublishReceipt};
use super::{make_receipt, run_all, AdapterError, AdapterTarget, EffectCtx, ReleaseAdapter};
pub struct GoAdapter {
adapter: Adapter,
}
impl GoAdapter {
#[must_use]
pub fn new(adapter: Adapter) -> Self {
debug_assert!(matches!(adapter, Adapter::Goreleaser));
Self { adapter }
}
}
impl ReleaseAdapter for GoAdapter {
fn adapter(&self) -> Adapter {
self.adapter
}
fn dry_run(
&self,
_ctx: &EffectCtx<'_>,
_t: &AdapterTarget,
) -> Result<DryRunReport, AdapterError> {
Ok(DryRunReport {
adapter: self.adapter,
planned_commands: vec![PlannedCommand::new(
"goreleaser",
&["release", "--snapshot", "--clean", "--skip=publish"],
)],
notes: vec![],
})
}
fn build(
&self,
ctx: &EffectCtx<'_>,
_t: &AdapterTarget,
) -> Result<BuildArtifacts, AdapterError> {
run_all(
ctx,
&[PlannedCommand::new(
"goreleaser",
&["build", "--snapshot", "--clean"],
)],
)?;
Ok(BuildArtifacts {
adapter: self.adapter,
artifacts: vec!["dist/".to_string()],
notes: vec![],
})
}
fn publish(
&self,
ctx: &EffectCtx<'_>,
t: &AdapterTarget,
) -> Result<PublishReceipt, AdapterError> {
run_all(
ctx,
&[PlannedCommand::new("goreleaser", &["release", "--clean"])],
)?;
Ok(make_receipt(ctx, t, None, None))
}
fn timeout(&self) -> Duration {
Duration::from_secs(900)
}
}