cusku/src/hooks/forgejo.rs
pep caa92227b2 fmt update?
Signed-off-by: pep <pep@bouah.net>
2025-12-27 14:31:32 +01:00

110 lines
2.8 KiB
Rust

// Copyright (C) 2024-2099 The crate authors.
//
// This program is free software: you can redistribute it and/or modify it
// under the terms of the GNU Affero General Public License as published by the
// Free Software Foundation, either version 3 of the License, or (at your
// option) any later version.
//
// This program is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
// for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
use crate::Error;
use crate::hooks::types::{
Commit, Hook, Issue, IssueAction, IssueAttrs, Note, Push, Repository, User,
};
pub use ::forgejo_hooks::{Hook as ForgejoHook, Issue as FjIssue, IssueAction as FjIssueAction};
impl From<FjIssueAction> for IssueAction {
fn from(other: FjIssueAction) -> IssueAction {
match other {
FjIssueAction::Created | FjIssueAction::Opened => IssueAction::Open,
FjIssueAction::Edited => IssueAction::Update,
FjIssueAction::Closed => IssueAction::Close,
}
}
}
impl From<FjIssue> for Issue {
fn from(other: FjIssue) -> Issue {
Issue {
id: other.issue.number as u64,
action: Some(other.action.into()),
title: other.issue.title,
author: User {
name: other.issue.user.login,
},
repository: Repository {
name: other.repository.name,
},
url: Some(other.issue.html_url),
}
}
}
impl From<FjIssue> for Note {
fn from(other: FjIssue) -> Note {
Note {
issue: Some(IssueAttrs {
id: other.issue.number as u64,
title: other.issue.title,
}),
commit: None,
merge_request: None,
snippet: false,
author: User {
name: other.issue.user.login,
},
repository: Repository {
name: other.repository.name,
},
url: other
.comment
.map(|c| c.html_url)
.unwrap_or(other.issue.html_url),
}
}
}
impl TryFrom<ForgejoHook> for Hook {
type Error = Error;
fn try_from(hook: ForgejoHook) -> Result<Hook, Error> {
Ok(match hook {
ForgejoHook::Push(push) => Hook::Push(Push {
ref_: push.ref_,
object_kind: String::from("push"),
commits: push
.commits
.into_iter()
.map(|commit| Commit {
ref_: commit.id,
message: commit.message,
url: commit.url,
})
.collect(),
repository: Repository {
name: push.repository.name,
},
pusher: User {
name: push.pusher.username,
},
}),
ForgejoHook::Issue(issue) => {
log::debug!("FOO: issue: {:?}", issue);
// TODO: Handle is_pull
if issue.comment.is_none() {
Hook::Issue(issue.into())
} else {
Hook::Note(issue.into())
}
}
_ => return Err(Error::UnsupportedHookConversion),
})
}
}