mirror of
https://github.com/pchuan98/codex.git
synced 2026-07-01 00:31:56 +08:00
It's actually a very nice property that these are UUID7s, so documenting them so we think twice before changing it away from UUID7s in the future.
107 lines
2.3 KiB
Rust
107 lines
2.3 KiB
Rust
use std::fmt::Display;
|
|
|
|
use schemars::JsonSchema;
|
|
use schemars::r#gen::SchemaGenerator;
|
|
use schemars::schema::Schema;
|
|
use serde::Deserialize;
|
|
use serde::Serialize;
|
|
use ts_rs::TS;
|
|
use uuid::Uuid;
|
|
|
|
#[derive(Debug, Clone, Copy, PartialEq, Eq, TS, Hash)]
|
|
#[ts(type = "string")]
|
|
/// Identifier for a Codex thread.
|
|
///
|
|
/// Codex-generated thread IDs are UUIDv7, and some use cases rely on that.
|
|
pub struct ThreadId {
|
|
pub(crate) uuid: Uuid,
|
|
}
|
|
|
|
impl ThreadId {
|
|
pub fn new() -> Self {
|
|
Self {
|
|
uuid: Uuid::now_v7(),
|
|
}
|
|
}
|
|
|
|
pub fn from_string(s: &str) -> Result<Self, uuid::Error> {
|
|
Ok(Self {
|
|
uuid: Uuid::parse_str(s)?,
|
|
})
|
|
}
|
|
}
|
|
|
|
impl TryFrom<&str> for ThreadId {
|
|
type Error = uuid::Error;
|
|
|
|
fn try_from(value: &str) -> Result<Self, Self::Error> {
|
|
Self::from_string(value)
|
|
}
|
|
}
|
|
|
|
impl TryFrom<String> for ThreadId {
|
|
type Error = uuid::Error;
|
|
|
|
fn try_from(value: String) -> Result<Self, Self::Error> {
|
|
Self::from_string(value.as_str())
|
|
}
|
|
}
|
|
|
|
impl From<ThreadId> for String {
|
|
fn from(value: ThreadId) -> Self {
|
|
value.to_string()
|
|
}
|
|
}
|
|
|
|
impl Default for ThreadId {
|
|
fn default() -> Self {
|
|
Self::new()
|
|
}
|
|
}
|
|
|
|
impl Display for ThreadId {
|
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
Display::fmt(&self.uuid, f)
|
|
}
|
|
}
|
|
|
|
impl Serialize for ThreadId {
|
|
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
|
where
|
|
S: serde::Serializer,
|
|
{
|
|
serializer.collect_str(&self.uuid)
|
|
}
|
|
}
|
|
|
|
impl<'de> Deserialize<'de> for ThreadId {
|
|
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
|
where
|
|
D: serde::Deserializer<'de>,
|
|
{
|
|
let value = String::deserialize(deserializer)?;
|
|
let uuid = Uuid::parse_str(&value).map_err(serde::de::Error::custom)?;
|
|
Ok(Self { uuid })
|
|
}
|
|
}
|
|
|
|
impl JsonSchema for ThreadId {
|
|
fn schema_name() -> String {
|
|
"ThreadId".to_string()
|
|
}
|
|
|
|
fn json_schema(generator: &mut SchemaGenerator) -> Schema {
|
|
<String>::json_schema(generator)
|
|
}
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::*;
|
|
#[test]
|
|
fn test_thread_id_default_is_not_zeroes() {
|
|
let id = ThreadId::default();
|
|
assert_ne!(id.uuid, Uuid::nil());
|
|
}
|
|
}
|