aboutsummaryrefslogtreecommitdiffstats
path: root/pkgs/by-name/ba/back/src/git_bug/issue/entity
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/by-name/ba/back/src/git_bug/issue/entity')
-rw-r--r--pkgs/by-name/ba/back/src/git_bug/issue/entity/mod.rs78
1 files changed, 78 insertions, 0 deletions
diff --git a/pkgs/by-name/ba/back/src/git_bug/issue/entity/mod.rs b/pkgs/by-name/ba/back/src/git_bug/issue/entity/mod.rs
new file mode 100644
index 0000000..f2e9af0
--- /dev/null
+++ b/pkgs/by-name/ba/back/src/git_bug/issue/entity/mod.rs
@@ -0,0 +1,78 @@
+// Back - An extremely simple git issue tracking system. Inspired by tvix's
+// panettone
+//
+// Copyright (C) 2024 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+// 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 <https://www.gnu.org/licenses/agpl.txt>.
+
+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<Value> 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<gix::Id<'_>> 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<Operation>,
+}
+
+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<Operation>,
+}