54 lines
1.4 KiB
Rust
54 lines
1.4 KiB
Rust
|
|
use crate::{
|
|
app::infra::grpc::FluxReleaserGrpcClient,
|
|
grpc::gen::UploadArtifactRequest,
|
|
};
|
|
|
|
use super::{archive::ArchiveFile, release_manager::models::UploadArtifactID};
|
|
|
|
pub struct FluxReleaserUploader {
|
|
flux_client: FluxReleaserGrpcClient,
|
|
}
|
|
|
|
impl FluxReleaserUploader {
|
|
pub fn new(flux_client: FluxReleaserGrpcClient) -> Self {
|
|
Self { flux_client }
|
|
}
|
|
|
|
pub async fn upload_archive(&self, archive: ArchiveFile) -> anyhow::Result<UploadArtifactID> {
|
|
let chunks = archive
|
|
.content
|
|
.chunks(1_000_000) // Slice by about 1MB
|
|
.map(|ch| UploadArtifactRequest {
|
|
content: ch.to_vec(),
|
|
})
|
|
.collect::<Vec<_>>();
|
|
|
|
let iter = tokio_stream::iter(chunks);
|
|
let resp = self
|
|
.flux_client
|
|
.lock()
|
|
.await
|
|
.upload_artifact(tonic::Request::new(iter))
|
|
.await?;
|
|
|
|
resp.into_inner().upload_id.try_into()
|
|
}
|
|
}
|
|
|
|
pub mod extensions {
|
|
use crate::app::SharedLocalApp;
|
|
|
|
use super::FluxReleaserUploader;
|
|
|
|
pub trait FluxReleaserUploaderExt {
|
|
fn flux_releaser_uploader(&self) -> FluxReleaserUploader;
|
|
}
|
|
|
|
impl FluxReleaserUploaderExt for SharedLocalApp {
|
|
fn flux_releaser_uploader(&self) -> FluxReleaserUploader {
|
|
FluxReleaserUploader::new(self.grpc_client.clone())
|
|
}
|
|
}
|
|
}
|