1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
//! Session metadata stored alongside persisted conversations.
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
/// Metadata stored as the first line of a session JSONL file.
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct SessionMeta {
/// Unique session identifier.
pub id: String,
/// Human-readable session title.
pub title: String,
/// When the session was created.
pub created_at: DateTime<Utc>,
/// When the session was last updated.
pub updated_at: DateTime<Utc>,
/// Schema version for migration support. Defaults to 1.
#[serde(default = "default_version")]
pub version: u32,
/// Optimistic concurrency sequence number. Incremented on every write.
#[serde(default)]
pub sequence: u64,
}
const fn default_version() -> u32 {
1
}
impl SessionMeta {
/// Creates a new session metadata record with the given identity and timestamps.
///
/// `version` defaults to `1` and `sequence` defaults to `0`; use
/// [`with_version`](Self::with_version) / [`with_sequence`](Self::with_sequence)
/// to override either.
#[must_use]
pub fn new(
id: impl Into<String>,
title: impl Into<String>,
created_at: DateTime<Utc>,
updated_at: DateTime<Utc>,
) -> Self {
Self {
id: id.into(),
title: title.into(),
created_at,
updated_at,
version: default_version(),
sequence: 0,
}
}
/// Overrides the schema version (defaults to 1).
#[must_use]
pub const fn with_version(mut self, version: u32) -> Self {
self.version = version;
self
}
/// Overrides the optimistic-concurrency sequence number (defaults to 0).
#[must_use]
pub const fn with_sequence(mut self, sequence: u64) -> Self {
self.sequence = sequence;
self
}
}
#[cfg(test)]
#[path = "meta_tests.rs"]
mod tests;