generated from PlexSheep/rs-base
a lot more to do
This commit is contained in:
parent
bd04eea9cc
commit
d02830b656
|
@ -27,6 +27,7 @@ clap = { version = "4.4.18", features = ["derive", "help"] }
|
||||||
clap-verbosity-flag = "2.1.2"
|
clap-verbosity-flag = "2.1.2"
|
||||||
git2 = "0.18.1"
|
git2 = "0.18.1"
|
||||||
libpt = { version = "0.3.11", features = ["log"] }
|
libpt = { version = "0.3.11", features = ["log"] }
|
||||||
|
reqwest = "0.11.24"
|
||||||
serde = { version = "1.0.195", features = ["derive"] }
|
serde = { version = "1.0.195", features = ["derive"] }
|
||||||
serde_yaml = "0.9.30"
|
serde_yaml = "0.9.30"
|
||||||
tempfile = "3.9.0"
|
tempfile = "3.9.0"
|
||||||
|
|
|
@ -61,7 +61,7 @@ pub enum Pass {
|
||||||
}
|
}
|
||||||
impl Pass {
|
impl Pass {
|
||||||
/// Get the pass, extracting from the underlying source
|
/// Get the pass, extracting from the underlying source
|
||||||
fn get_pass(&self) -> Result<String> {
|
pub fn get_pass(&self) -> Result<String> {
|
||||||
self.check()?;
|
self.check()?;
|
||||||
Ok(match self {
|
Ok(match self {
|
||||||
Self::Text(pass) => pass.clone(),
|
Self::Text(pass) => pass.clone(),
|
||||||
|
|
12
src/error.rs
12
src/error.rs
|
@ -20,6 +20,18 @@ pub enum Error {
|
||||||
SerdeYaml(#[from] serde_yaml::Error),
|
SerdeYaml(#[from] serde_yaml::Error),
|
||||||
#[error("Could not generate the changelog")]
|
#[error("Could not generate the changelog")]
|
||||||
ChangelogError(#[from] ChangelogError),
|
ChangelogError(#[from] ChangelogError),
|
||||||
|
#[error("Server Api error")]
|
||||||
|
ServerApiError(#[from] ServerApiError)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Error, Debug)]
|
||||||
|
pub enum ServerApiError {
|
||||||
|
#[error(transparent)]
|
||||||
|
ParseUrl(#[from] url::ParseError),
|
||||||
|
#[error(transparent)]
|
||||||
|
InvalidHeaderValue(#[from] reqwest::header::InvalidHeaderValue),
|
||||||
|
#[error(transparent)]
|
||||||
|
ReqwestErr(#[from] reqwest::Error)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Error, Debug)]
|
#[derive(Error, Debug)]
|
||||||
|
|
|
@ -1,11 +1,39 @@
|
||||||
use async_trait::async_trait;
|
|
||||||
|
|
||||||
use super::ServerApi;
|
use super::ServerApi;
|
||||||
use crate::{
|
use crate::{
|
||||||
config::{packages::PackageType, ApiType, Config},
|
config::{packages::PackageType, Api, ApiType, Config},
|
||||||
error::*,
|
error::*,
|
||||||
};
|
};
|
||||||
pub struct Forgejo;
|
use async_trait::async_trait;
|
||||||
|
use reqwest::{
|
||||||
|
header::{HeaderMap, HeaderValue}, Client, Method, Request, RequestBuilder, Url
|
||||||
|
};
|
||||||
|
|
||||||
|
pub struct Forgejo {
|
||||||
|
cfg: Api,
|
||||||
|
client: Client,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Forgejo {
|
||||||
|
pub async fn build(api: &Api) -> Result<Self> {
|
||||||
|
let mut headers: HeaderMap = HeaderMap::new();
|
||||||
|
// may be left empty if we only do reads from publically accessible urls
|
||||||
|
if api.auth.is_some() {
|
||||||
|
let _ = headers.insert(
|
||||||
|
"Authorization",
|
||||||
|
HeaderValue::from_str(api.auth.clone().unwrap().pass.get_pass()?.as_str())
|
||||||
|
.map_err(ServerApiError::from)?,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
let client = super::client_builder()
|
||||||
|
.default_headers(headers)
|
||||||
|
.build()
|
||||||
|
.map_err(ServerApiError::from)?;
|
||||||
|
Ok(Self {
|
||||||
|
cfg: api.clone(),
|
||||||
|
client,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[async_trait]
|
#[async_trait]
|
||||||
impl ServerApi for Forgejo {
|
impl ServerApi for Forgejo {
|
||||||
|
@ -13,7 +41,24 @@ impl ServerApi for Forgejo {
|
||||||
todo!()
|
todo!()
|
||||||
}
|
}
|
||||||
async fn push_release(&mut self) -> Result<()> {
|
async fn push_release(&mut self) -> Result<()> {
|
||||||
todo!()
|
let raw_url = format!(
|
||||||
|
"{}/api/v1/repos/{user}/{repository}/releases",
|
||||||
|
self.cfg.endpoint
|
||||||
|
);
|
||||||
|
let body = format!(r#"
|
||||||
|
{{
|
||||||
|
"body": "{text}",
|
||||||
|
"draft": {draft},
|
||||||
|
"name": "{name}",
|
||||||
|
"prerelease": {prerelease},
|
||||||
|
"tag_name": "{tag}",
|
||||||
|
"target_commitish": "{commit_sig}"
|
||||||
|
}}
|
||||||
|
"#);
|
||||||
|
|
||||||
|
let request = self.client.post().body(body).build()?;
|
||||||
|
let response = self.client.execute(request).await?;
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
async fn push_release_artifact(&mut self) -> Result<()> {
|
async fn push_release_artifact(&mut self) -> Result<()> {
|
||||||
todo!()
|
todo!()
|
||||||
|
@ -21,11 +66,4 @@ impl ServerApi for Forgejo {
|
||||||
async fn push_pkg(&mut self, pkg_type: PackageType) -> Result<()> {
|
async fn push_pkg(&mut self, pkg_type: PackageType) -> Result<()> {
|
||||||
todo!()
|
todo!()
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Forgejo {
|
|
||||||
pub async fn build(cfg: &Config) -> Result<Self> {
|
|
||||||
todo!()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,10 +2,12 @@ use async_trait::async_trait;
|
||||||
|
|
||||||
use super::ServerApi;
|
use super::ServerApi;
|
||||||
use crate::{
|
use crate::{
|
||||||
config::{packages::PackageType, ApiType, Config},
|
config::{packages::PackageType, Api, ApiType, Config},
|
||||||
error::*,
|
error::*,
|
||||||
};
|
};
|
||||||
pub struct Gitea;
|
pub struct Gitea {
|
||||||
|
cfg: Api,
|
||||||
|
}
|
||||||
|
|
||||||
#[async_trait]
|
#[async_trait]
|
||||||
impl ServerApi for Gitea {
|
impl ServerApi for Gitea {
|
||||||
|
@ -24,7 +26,7 @@ impl ServerApi for Gitea {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Gitea {
|
impl Gitea {
|
||||||
pub async fn build(cfg: &Config) -> Result<Self> {
|
pub async fn build(api: &Api) -> Result<Self> {
|
||||||
todo!()
|
Ok(Self { cfg: api.clone() })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,10 +2,12 @@ use async_trait::async_trait;
|
||||||
|
|
||||||
use super::ServerApi;
|
use super::ServerApi;
|
||||||
use crate::{
|
use crate::{
|
||||||
config::{packages::PackageType, ApiType, Config},
|
config::{packages::PackageType, Api, ApiType, Config},
|
||||||
error::*,
|
error::*,
|
||||||
};
|
};
|
||||||
pub struct Github;
|
pub struct Github {
|
||||||
|
cfg: Api,
|
||||||
|
}
|
||||||
|
|
||||||
#[async_trait]
|
#[async_trait]
|
||||||
impl ServerApi for Github {
|
impl ServerApi for Github {
|
||||||
|
@ -24,7 +26,7 @@ impl ServerApi for Github {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Github {
|
impl Github {
|
||||||
pub async fn build(cfg: &Config) -> Result<Self> {
|
pub async fn build(api: &Api) -> Result<Self> {
|
||||||
todo!()
|
Ok(Self { cfg: api.clone() })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,10 +2,12 @@ use async_trait::async_trait;
|
||||||
|
|
||||||
use super::ServerApi;
|
use super::ServerApi;
|
||||||
use crate::{
|
use crate::{
|
||||||
config::{packages::PackageType, ApiType, Config},
|
config::{packages::PackageType, Api, ApiType, Config},
|
||||||
error::*,
|
error::*,
|
||||||
};
|
};
|
||||||
pub struct Gitlab;
|
pub struct Gitlab {
|
||||||
|
cfg: Api,
|
||||||
|
}
|
||||||
|
|
||||||
#[async_trait]
|
#[async_trait]
|
||||||
impl ServerApi for Gitlab {
|
impl ServerApi for Gitlab {
|
||||||
|
@ -24,7 +26,7 @@ impl ServerApi for Gitlab {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Gitlab {
|
impl Gitlab {
|
||||||
pub async fn build(cfg: &Config) -> Result<Self> {
|
pub async fn build(api: &Api) -> Result<Self> {
|
||||||
todo!()
|
Ok(Self { cfg: api.clone() })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
use async_trait::async_trait;
|
use async_trait::async_trait;
|
||||||
|
use reqwest::ClientBuilder;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
config::{packages::PackageType, ApiType, Config},
|
config::{packages::PackageType, ApiType, Config},
|
||||||
|
@ -14,6 +15,7 @@ use gitea::*;
|
||||||
use github::*;
|
use github::*;
|
||||||
use gitlab::*;
|
use gitlab::*;
|
||||||
|
|
||||||
|
pub static USER_AGENT: &str = concat!(env!("CARGO_PKG_NAME"), "/", env!("CARGO_PKG_VERSION"),);
|
||||||
pub type ApiCollection = Vec<Box<dyn ServerApi>>;
|
pub type ApiCollection = Vec<Box<dyn ServerApi>>;
|
||||||
|
|
||||||
// NOTE: in stable rust, traits can normally not contain async methods,
|
// NOTE: in stable rust, traits can normally not contain async methods,
|
||||||
|
@ -27,21 +29,25 @@ pub trait ServerApi {
|
||||||
async fn push_pkg(&mut self, pkg_type: PackageType) -> Result<()>;
|
async fn push_pkg(&mut self, pkg_type: PackageType) -> Result<()>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn client_builder() -> ClientBuilder {
|
||||||
|
ClientBuilder::new().user_agent(USER_AGENT)
|
||||||
|
}
|
||||||
|
|
||||||
pub async fn init_servers(cfg: &Config) -> Result<ApiCollection> {
|
pub async fn init_servers(cfg: &Config) -> Result<ApiCollection> {
|
||||||
let mut collection: ApiCollection = ApiCollection::new();
|
let mut collection: ApiCollection = ApiCollection::new();
|
||||||
for api in &cfg.yaml.api {
|
for api in &cfg.yaml.api {
|
||||||
match api.1.server_type {
|
match api.1.server_type {
|
||||||
ApiType::Gitea => {
|
ApiType::Gitea => {
|
||||||
collection.push(Box::new(Gitea::build(cfg).await?));
|
collection.push(Box::new(Gitea::build(api.1).await?));
|
||||||
}
|
}
|
||||||
ApiType::Gitlab => {
|
ApiType::Gitlab => {
|
||||||
collection.push(Box::new(Gitlab::build(cfg).await?));
|
collection.push(Box::new(Gitlab::build(api.1).await?));
|
||||||
}
|
}
|
||||||
ApiType::Github => {
|
ApiType::Github => {
|
||||||
collection.push(Box::new(Github::build(cfg).await?));
|
collection.push(Box::new(Github::build(api.1).await?));
|
||||||
}
|
}
|
||||||
ApiType::Forgejo => {
|
ApiType::Forgejo => {
|
||||||
collection.push(Box::new(Forgejo::build(cfg).await?));
|
collection.push(Box::new(Forgejo::build(api.1).await?));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue