use crate::github::{error::GitHubError, util::spawn_task};
use crate::runtime::AsyncTask;
use octocrab::{Octocrab, models::repos::FileUpdate as FileUpdateResponse};
use std::sync::Arc;
#[derive(Debug, Clone)]
pub struct CreateOrUpdateFileRequest {
pub owner: String,
pub repo: String,
pub path: String,
pub message: String,
pub content: String,
pub branch: Option<String>,
pub sha: Option<String>,
}
pub(crate) fn create_or_update_file(
inner: Arc<Octocrab>,
request: CreateOrUpdateFileRequest,
) -> AsyncTask<Result<FileUpdateResponse, GitHubError>> {
spawn_task(async move {
let handler = inner.repos(&request.owner, &request.repo);
let mut builder = if let Some(existing_sha) = request.sha {
handler.update_file(
&request.path,
&request.message,
request.content.as_bytes(),
existing_sha,
)
} else {
handler.create_file(&request.path, &request.message, request.content.as_bytes())
};
if let Some(b) = request.branch {
builder = builder.branch(b);
}
builder.send().await.map_err(GitHubError::from)
})
}