harmos_domain/model/storage/
identities.rs1use serde::{Deserialize, Serialize};
22use super::{ObjectKey, SchemaKey, StorageCursor};
24use crate::Identifier;
25
26#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
35pub struct IdentitySelection {
36 pub kind: IdentityKind,
37 pub schema: Option<Identifier>,
38}
39
40#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
43#[serde(rename_all = "snake_case")]
44pub enum IdentityKind {
45 Streams,
46 Objects,
47}
48
49#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
50#[serde(tag = "kind", rename_all = "snake_case", deny_unknown_fields)]
51pub enum StoredIdentity {
52 Stream { schema: SchemaKey, scope: Option<Identifier>, item: Identifier, stream: Identifier, first: StorageCursor },
53 Object { schema: SchemaKey, key: ObjectKey, first: StorageCursor },
54}
55
56impl StoredIdentity {
61 pub fn first(&self) -> &StorageCursor {
62 match self {
63 Self::Stream { first, .. } | Self::Object { first, .. } => first,
64 }
65 }
66
67 pub fn schema(&self) -> &SchemaKey {
68 match self {
69 Self::Stream { schema, .. } | Self::Object { schema, .. } => schema,
70 }
71 }
72
73 pub fn kind(&self) -> IdentityKind {
74 match self {
75 Self::Stream { .. } => IdentityKind::Streams,
76 Self::Object { .. } => IdentityKind::Objects,
77 }
78 }
79}
80
81impl IdentitySelection {
82 pub fn matches(&self, identity: &StoredIdentity) -> bool {
83 identity.kind() == self.kind && self.schema.as_ref().is_none_or(|schema| schema == &identity.schema().id)
84 }
85}
86
87