use std::fmt;
use onemessagebus::{Reserved, Vocabulary};
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use serde_json::{Map, Value};
pub use onemessagebus::{ArtifactRef, Source};
pub const SOURCE_WORD: &str = "vcs";
pub const RESERVED_LABELS: &[Reserved] = &[
Reserved::text("run_id"),
Reserved::integer("round"),
Reserved::text("node"),
Reserved::text("step"),
Reserved::text("member"),
Reserved::text("persona"),
Reserved::text("significance"),
];
pub const DIMENSIONS: &[Reserved] = &[Reserved::word("phase")];
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct VcsEvents;
impl Vocabulary for VcsEvents {
type Source = Source;
type Dimensions = Dimensions;
type Labels = Labels;
type Fields = MatchFields;
const NAME: &'static str = "vcs";
const RESERVED: &'static [Reserved] = RESERVED_LABELS;
const DIMENSIONS: &'static [Reserved] = DIMENSIONS;
const DEFAULT_SOURCE: &'static str = SOURCE_WORD;
fn write_version(_: &Self::Source) -> u32 {
1
}
}
pub type Envelope = onemessagebus::Envelope<VcsEvents>;
pub type EventFilter = onemessagebus::Filter<VcsEvents>;
pub type EventMatcher = onemessagebus::Matcher<VcsEvents>;
pub(crate) type Emitter = onemessagebus::Emitter<VcsEvents>;
pub(crate) type BusReader = onemessagebus::Reader<VcsEvents>;
#[derive(
Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize, JsonSchema,
)]
#[serde(rename_all = "kebab-case")]
pub enum Phase {
Development,
Integrate,
Review,
Release,
}
impl Phase {
#[must_use]
pub const fn as_str(self) -> &'static str {
match self {
Phase::Development => "development",
Phase::Integrate => "integrate",
Phase::Review => "review",
Phase::Release => "release",
}
}
#[must_use]
pub const fn every() -> [Phase; 4] {
[
Phase::Development,
Phase::Integrate,
Phase::Review,
Phase::Release,
]
}
}
impl fmt::Display for Phase {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str(self.as_str())
}
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct Dimensions {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub phase: Option<Phase>,
}
impl Dimensions {
#[must_use]
pub const fn none() -> Self {
Self { phase: None }
}
#[must_use]
pub const fn at(phase: Phase) -> Self {
Self { phase: Some(phase) }
}
}
impl From<Phase> for Dimensions {
fn from(phase: Phase) -> Self {
Self::at(phase)
}
}
impl From<Option<Phase>> for Dimensions {
fn from(phase: Option<Phase>) -> Self {
Self { phase }
}
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct Labels {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub run_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub round: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub node: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub step: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub member: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub persona: Option<String>,
#[serde(flatten)]
pub extra: Map<String, Value>,
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct MatchFields {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub significance: Option<crate::event::Significance>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub phase: Option<Phase>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub run_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub node: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub step: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub member: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub persona: Option<String>,
}