// Back - An extremely simple git issue tracking system. Inspired by tvix's // panettone // // Copyright (C) 2024 Benedikt Peetz // SPDX-License-Identifier: AGPL-3.0-or-later // // This file is part of Back. // // You should have received a copy of the License along with this program. // If not, see . use std::fmt::Display; use gix::{bstr::ByteSlice, Repository}; use serde::Deserialize; use serde_json::Value; use crate::{get, git_bug::format::HtmlString}; use super::entity::Id; #[derive(Debug, Clone)] pub struct Author { pub name: HtmlString, pub email: HtmlString, pub id: Id, } impl Display for Author { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "({}, {})", self.name, self.email) } } impl Author { pub fn construct(repo: &Repository, raw: RawAuthor) -> Self { let commit_obj = repo .find_reference(&format!("refs/identities/{}", raw.id)) .expect("All authors should also have identities") .peel_to_commit() .expect("All identities should be commits"); let tree_obj = repo .find_tree( commit_obj .tree() .expect("The commit should have an tree associated with it") .id, ) .expect("This should be a tree"); let data = repo .find_blob( tree_obj .find_entry("version") .expect("This entry should exist") .object() .expect("This should point to a blob entry") .id, ) .expect("This blob should exist") .data .clone(); let json: Value = serde_json::from_str(data.to_str().expect("This is encoded json")) .expect("This is valid json"); Author { name: get! {json, "name"}, email: get! {json, "email"}, id: raw.id, } } } #[derive(Deserialize)] pub struct RawAuthor { id: Id, }