use serde::Serialize;
use url::Url;
use crate::error::{Error, Result};
use crate::event::ArtifactId;
use crate::rules::MergePolicy;
pub trait RemoteHost {
fn authenticated_user(&self) -> Result<String>;
fn open_change(&self, req: ChangeSpec) -> Result<ChangeRequest>;
fn find_changes(&self, head: &str, base: &str) -> Result<Vec<ChangeRequest>>;
fn change_checks(&self, cr: &ChangeRequest) -> Result<Vec<Check>>;
fn check_log(&self, cr: &ChangeRequest, check: &Check) -> Result<ArtifactId>;
fn merge(&self, cr: &ChangeRequest, policy: MergePolicy) -> Result<MergeOutcome>;
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
pub struct ChangeSpec {
pub head: String,
pub base: String,
pub title: String,
pub body: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
pub struct ChangeRequest {
pub id: ChangeId,
pub url: Url,
pub head_sha: Sha,
pub base: String,
}
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize)]
#[serde(transparent)]
pub struct ChangeId(pub String);
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize)]
#[serde(transparent)]
pub struct Sha(pub String);
#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
pub struct Check {
pub name: String,
pub status: String,
pub conclusion: Option<String>,
pub required: bool,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
#[serde(rename_all = "kebab-case")]
pub enum MergeOutcome {
Merged(Sha),
Queued,
Open,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
pub struct GitHub;
impl RemoteHost for GitHub {
fn authenticated_user(&self) -> Result<String> {
Err(Error::NotImplemented {
operation: "RemoteHost::authenticated_user",
})
}
fn open_change(&self, _req: ChangeSpec) -> Result<ChangeRequest> {
Err(Error::NotImplemented {
operation: "RemoteHost::open_change",
})
}
fn find_changes(&self, _head: &str, _base: &str) -> Result<Vec<ChangeRequest>> {
Err(Error::NotImplemented {
operation: "RemoteHost::find_changes",
})
}
fn change_checks(&self, _cr: &ChangeRequest) -> Result<Vec<Check>> {
Err(Error::NotImplemented {
operation: "RemoteHost::change_checks",
})
}
fn check_log(&self, _cr: &ChangeRequest, _check: &Check) -> Result<ArtifactId> {
Err(Error::NotImplemented {
operation: "RemoteHost::check_log",
})
}
fn merge(&self, _cr: &ChangeRequest, _policy: MergePolicy) -> Result<MergeOutcome> {
Err(Error::NotImplemented {
operation: "RemoteHost::merge",
})
}
}