// 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 . 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 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 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 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 for Hook { type Error = Error; fn try_from(hook: ForgejoHook) -> Result { 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), }) } }