higher_graphen_core/extension/
common.rs1use crate::text::normalize_required_text;
2use crate::{Id, Result};
3use serde::{Deserialize, Serialize};
4
5#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
7#[serde(deny_unknown_fields)]
8pub struct ObjectRef {
9 #[serde(rename = "ref")]
11 pub reference: Id,
12}
13
14impl ObjectRef {
15 pub fn new(reference: Id) -> Self {
17 Self { reference }
18 }
19}
20
21#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
23#[serde(deny_unknown_fields)]
24pub struct Description {
25 pub description: String,
27}
28
29impl Description {
30 pub fn new(description: impl Into<String>) -> Result<Self> {
32 Ok(Self {
33 description: normalize_required_text("description", description)?,
34 })
35 }
36}
37
38#[derive(Clone, Copy, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]
40#[serde(rename_all = "snake_case")]
41pub enum LifecycleStatus {
42 Candidate,
44 UnderReview,
46 Accepted,
48 Rejected,
50 Superseded,
52}
53
54impl LifecycleStatus {
55 pub fn is_accepted(self) -> bool {
57 matches!(self, Self::Accepted)
58 }
59}
60
61#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
63#[serde(deny_unknown_fields)]
64pub struct ReviewRequirement {
65 pub required: bool,
67 #[serde(skip_serializing_if = "Option::is_none")]
69 pub reviewer: Option<Id>,
70 #[serde(skip_serializing_if = "Option::is_none")]
72 pub decision_reason: Option<String>,
73}
74
75impl ReviewRequirement {
76 pub fn new(required: bool) -> Self {
78 Self {
79 required,
80 reviewer: None,
81 decision_reason: None,
82 }
83 }
84
85 pub fn with_decision_reason(mut self, decision_reason: impl Into<String>) -> Result<Self> {
87 self.decision_reason = Some(normalize_required_text("decision_reason", decision_reason)?);
88 Ok(self)
89 }
90}