// 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::Repository; use serde::Deserialize; use serde_json::Value; use super::{ identity::{Author, RawAuthor}, operation::Operation, }; #[derive(Deserialize, Debug, PartialEq, Eq, Clone)] #[serde(from = "Value")] pub struct Id { value: String, } impl From for Id { fn from(value: Value) -> Self { Self::from(&value) } } impl From<&Value> for Id { fn from(value: &Value) -> Self { Self { value: value.as_str().expect("This should be a string").to_owned(), } } } impl From> for Id { fn from(value: gix::Id<'_>) -> Self { Self { value: value.shorten().expect("This should work?").to_string(), } } } impl Display for Id { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { self.value.fmt(f) // let shortend = self.value.shorten().expect("This should work."); // f.write_str(shortend.to_string().as_str()) } } #[derive(Debug)] pub struct Entity { pub id: Id, pub author: Author, pub operations: Vec, } impl Entity { pub fn from_raw<'a>(repo: &'a Repository, raw: RawEntity, id: gix::Id<'a>) -> Self { Self { id: Id::from(id), author: Author::construct(repo, raw.author), operations: raw.operations, } } } #[derive(Deserialize)] pub struct RawEntity { pub author: RawAuthor, #[serde(alias = "ops")] pub operations: Vec, }