From 090cb6631efab167aea4ea4c792c68b270547f0d Mon Sep 17 00:00:00 2001 From: Julia Lange Date: Wed, 7 May 2025 16:29:08 -0700 Subject: [PATCH] Lexicon Module, codegen current lexicons Use esquema (github:fatfingers23/esquema@9ef00b9) to generate rust code for the lexicons that we have. Currently, esquema doesn't seem to support top level integer types. I've opted to temporarily remove `indexProgress` from my.spoor.log.activity while compiling, and then adding it back afterwards. I could compile esquema with the following added to my flake.nix ``` nativeBuildInputs = with pkgs; [ pkg-config openssl openssl.dev ]; PKG_CONFIG_PATH = "${pkgs.openssl.dev}/lib/pkgconfig"; ``` at a later date I will add it as a dependency, but I spent a while trying to package esquema to no results. --- src/lexicons/mod.rs | 3 ++ src/lexicons/my.rs | 3 ++ src/lexicons/my/spoor.rs | 4 ++ src/lexicons/my/spoor/content.rs | 17 ++++++ src/lexicons/my/spoor/content/defs.rs | 19 +++++++ src/lexicons/my/spoor/content/external.rs | 28 ++++++++++ src/lexicons/my/spoor/content/media.rs | 44 +++++++++++++++ src/lexicons/my/spoor/log.rs | 16 ++++++ src/lexicons/my/spoor/log/activity.rs | 26 +++++++++ src/lexicons/my/spoor/log/session.rs | 20 +++++++ src/lexicons/record.rs | 65 +++++++++++++++++++++++ 11 files changed, 245 insertions(+) create mode 100644 src/lexicons/mod.rs create mode 100644 src/lexicons/my.rs create mode 100644 src/lexicons/my/spoor.rs create mode 100644 src/lexicons/my/spoor/content.rs create mode 100644 src/lexicons/my/spoor/content/defs.rs create mode 100644 src/lexicons/my/spoor/content/external.rs create mode 100644 src/lexicons/my/spoor/content/media.rs create mode 100644 src/lexicons/my/spoor/log.rs create mode 100644 src/lexicons/my/spoor/log/activity.rs create mode 100644 src/lexicons/my/spoor/log/session.rs create mode 100644 src/lexicons/record.rs diff --git a/src/lexicons/mod.rs b/src/lexicons/mod.rs new file mode 100644 index 0000000..8107df0 --- /dev/null +++ b/src/lexicons/mod.rs @@ -0,0 +1,3 @@ +// @generated - This file is generated by esquema-codegen (forked from atrium-codegen). DO NOT EDIT. +pub mod record; +pub mod my; diff --git a/src/lexicons/my.rs b/src/lexicons/my.rs new file mode 100644 index 0000000..ac9c6bd --- /dev/null +++ b/src/lexicons/my.rs @@ -0,0 +1,3 @@ +// @generated - This file is generated by esquema-codegen (forked from atrium-codegen). DO NOT EDIT. +//!Definitions for the `my` namespace. +pub mod spoor; diff --git a/src/lexicons/my/spoor.rs b/src/lexicons/my/spoor.rs new file mode 100644 index 0000000..172fa6a --- /dev/null +++ b/src/lexicons/my/spoor.rs @@ -0,0 +1,4 @@ +// @generated - This file is generated by esquema-codegen (forked from atrium-codegen). DO NOT EDIT. +//!Definitions for the `my.spoor` namespace. +pub mod content; +pub mod log; diff --git a/src/lexicons/my/spoor/content.rs b/src/lexicons/my/spoor/content.rs new file mode 100644 index 0000000..5d9b80b --- /dev/null +++ b/src/lexicons/my/spoor/content.rs @@ -0,0 +1,17 @@ +// @generated - This file is generated by esquema-codegen (forked from atrium-codegen). DO NOT EDIT. +//!Definitions for the `my.spoor.content` namespace. +pub mod defs; +pub mod external; +pub mod media; +#[derive(Debug)] +pub struct External; +impl atrium_api::types::Collection for External { + const NSID: &'static str = "my.spoor.content.external"; + type Record = external::Record; +} +#[derive(Debug)] +pub struct Media; +impl atrium_api::types::Collection for Media { + const NSID: &'static str = "my.spoor.content.media"; + type Record = media::Record; +} diff --git a/src/lexicons/my/spoor/content/defs.rs b/src/lexicons/my/spoor/content/defs.rs new file mode 100644 index 0000000..69d3607 --- /dev/null +++ b/src/lexicons/my/spoor/content/defs.rs @@ -0,0 +1,19 @@ +// @generated - This file is generated by esquema-codegen (forked from atrium-codegen). DO NOT EDIT. +//!Definitions for the `my.spoor.content.defs` namespace. +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct TitleData { + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub lang: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub translation_type: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub value: core::option::Option, +} +pub type Title = atrium_api::types::Object; +///A phonetic transcription of the native title such that when read it will sound like the native title. +pub const TITLE_HOMOPHONIC: &str = "my.spoor.content.defs#titleHomophonic"; +///The title in its native script +pub const TITLE_NATIVE: &str = "my.spoor.content.defs#titleNative"; +///A translation of the title +pub const TITLE_TRANSLATION: &str = "my.spoor.content.defs#titleTranslation"; diff --git a/src/lexicons/my/spoor/content/external.rs b/src/lexicons/my/spoor/content/external.rs new file mode 100644 index 0000000..5a916ee --- /dev/null +++ b/src/lexicons/my/spoor/content/external.rs @@ -0,0 +1,28 @@ +// @generated - This file is generated by esquema-codegen (forked from atrium-codegen). DO NOT EDIT. +//!Definitions for the `my.spoor.content.external` namespace. +use atrium_api::types::TryFromUnknown; +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct RecordData { + ///User defined overrides for the returned content + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub overrides: core::option::Option>, + ///All the data needed to query the content from the source + pub queryable: atrium_api::types::Union, + ///An nsid for a specific data source. The domain authority governs how to process the queryable + pub source: atrium_api::types::string::Nsid, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub titles: core::option::Option>, +} +pub type Record = atrium_api::types::Object; +impl From for RecordData { + fn from(value: atrium_api::types::Unknown) -> Self { + Self::try_from_unknown(value).unwrap() + } +} +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(tag = "$type")] +pub enum RecordOverridesRefs {} +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(tag = "$type")] +pub enum RecordQueryableRefs {} diff --git a/src/lexicons/my/spoor/content/media.rs b/src/lexicons/my/spoor/content/media.rs new file mode 100644 index 0000000..aa1cd3b --- /dev/null +++ b/src/lexicons/my/spoor/content/media.rs @@ -0,0 +1,44 @@ +// @generated - This file is generated by esquema-codegen (forked from atrium-codegen). DO NOT EDIT. +//!Definitions for the `my.spoor.content.media` namespace. +use atrium_api::types::TryFromUnknown; +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct RecordData { + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub duration_data: core::option::Option< + atrium_api::types::Union, + >, + ///Client-declared timestamp for when this activity was last updated + pub last_updated: atrium_api::types::string::Datetime, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub poster_image: core::option::Option, + pub titles: Vec, +} +pub type Record = atrium_api::types::Object; +impl From for RecordData { + fn from(value: atrium_api::types::Unknown) -> Self { + Self::try_from_unknown(value).unwrap() + } +} +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct BookData { + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub chapters: core::option::Option, +} +pub type Book = atrium_api::types::Object; +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct TelevisionData { + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub episodes: core::option::Option, +} +pub type Television = atrium_api::types::Object; +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(tag = "$type")] +pub enum RecordDurationDataRefs { + #[serde(rename = "my.spoor.content.media#television")] + MySpoorContentMediaTelevision(Box), + #[serde(rename = "my.spoor.content.media#book")] + MySpoorContentMediaBook(Box), +} diff --git a/src/lexicons/my/spoor/log.rs b/src/lexicons/my/spoor/log.rs new file mode 100644 index 0000000..87f699e --- /dev/null +++ b/src/lexicons/my/spoor/log.rs @@ -0,0 +1,16 @@ +// @generated - This file is generated by esquema-codegen (forked from atrium-codegen). DO NOT EDIT. +//!Definitions for the `my.spoor.log` namespace. +pub mod activity; +pub mod session; +#[derive(Debug)] +pub struct Activity; +impl atrium_api::types::Collection for Activity { + const NSID: &'static str = "my.spoor.log.activity"; + type Record = activity::Record; +} +#[derive(Debug)] +pub struct Session; +impl atrium_api::types::Collection for Session { + const NSID: &'static str = "my.spoor.log.session"; + type Record = session::Record; +} diff --git a/src/lexicons/my/spoor/log/activity.rs b/src/lexicons/my/spoor/log/activity.rs new file mode 100644 index 0000000..cbf8882 --- /dev/null +++ b/src/lexicons/my/spoor/log/activity.rs @@ -0,0 +1,26 @@ +// @generated - This file is generated by esquema-codegen (forked from atrium-codegen). DO NOT EDIT. +//!Definitions for the `my.spoor.log.activity` namespace. +use atrium_api::types::TryFromUnknown; +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct RecordData { + ///Client-declared timestamp for when this activity was created + pub created_at: atrium_api::types::string::Datetime, + ///User-declared timestamp for when they performed the activity. Null implies unknown time. + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub performed_at: core::option::Option, + pub progress: atrium_api::types::Union, + pub session: crate::com::atproto::repo::strong_ref::Main, +} +pub type Record = atrium_api::types::Object; +impl From for RecordData { + fn from(value: atrium_api::types::Unknown) -> Self { + Self::try_from_unknown(value).unwrap() + } +} +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(tag = "$type")] +pub enum RecordProgressRefs { + #[serde(rename = "my.spoor.log.activity#indexProgress")] + MySpoorLogActivityIndexProgress(Box), +} diff --git a/src/lexicons/my/spoor/log/session.rs b/src/lexicons/my/spoor/log/session.rs new file mode 100644 index 0000000..cf5d0d5 --- /dev/null +++ b/src/lexicons/my/spoor/log/session.rs @@ -0,0 +1,20 @@ +// @generated - This file is generated by esquema-codegen (forked from atrium-codegen). DO NOT EDIT. +//!Definitions for the `my.spoor.log.session` namespace. +use atrium_api::types::TryFromUnknown; +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct RecordData { + pub content: crate::com::atproto::repo::strong_ref::Main, + ///Client-declared timestamp for when this activity was created + pub created_at: atrium_api::types::string::Datetime, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub label: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub other_participants: core::option::Option>, +} +pub type Record = atrium_api::types::Object; +impl From for RecordData { + fn from(value: atrium_api::types::Unknown) -> Self { + Self::try_from_unknown(value).unwrap() + } +} diff --git a/src/lexicons/record.rs b/src/lexicons/record.rs new file mode 100644 index 0000000..290d286 --- /dev/null +++ b/src/lexicons/record.rs @@ -0,0 +1,65 @@ +// @generated - This file is generated by esquema-codegen (forked from atrium-codegen). DO NOT EDIT. +//!A collection of known record types. +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(tag = "$type")] +pub enum KnownRecord { + #[serde(rename = "my.spoor.content.external")] + LexiconsMySpoorContentExternal( + Box, + ), + #[serde(rename = "my.spoor.content.media")] + LexiconsMySpoorContentMedia(Box), + #[serde(rename = "my.spoor.log.activity")] + LexiconsMySpoorLogActivity(Box), + #[serde(rename = "my.spoor.log.session")] + LexiconsMySpoorLogSession(Box), +} +impl From for KnownRecord { + fn from(record: crate::lexicons::my::spoor::content::external::Record) -> Self { + KnownRecord::LexiconsMySpoorContentExternal(Box::new(record)) + } +} +impl From for KnownRecord { + fn from( + record_data: crate::lexicons::my::spoor::content::external::RecordData, + ) -> Self { + KnownRecord::LexiconsMySpoorContentExternal(Box::new(record_data.into())) + } +} +impl From for KnownRecord { + fn from(record: crate::lexicons::my::spoor::content::media::Record) -> Self { + KnownRecord::LexiconsMySpoorContentMedia(Box::new(record)) + } +} +impl From for KnownRecord { + fn from( + record_data: crate::lexicons::my::spoor::content::media::RecordData, + ) -> Self { + KnownRecord::LexiconsMySpoorContentMedia(Box::new(record_data.into())) + } +} +impl From for KnownRecord { + fn from(record: crate::lexicons::my::spoor::log::activity::Record) -> Self { + KnownRecord::LexiconsMySpoorLogActivity(Box::new(record)) + } +} +impl From for KnownRecord { + fn from(record_data: crate::lexicons::my::spoor::log::activity::RecordData) -> Self { + KnownRecord::LexiconsMySpoorLogActivity(Box::new(record_data.into())) + } +} +impl From for KnownRecord { + fn from(record: crate::lexicons::my::spoor::log::session::Record) -> Self { + KnownRecord::LexiconsMySpoorLogSession(Box::new(record)) + } +} +impl From for KnownRecord { + fn from(record_data: crate::lexicons::my::spoor::log::session::RecordData) -> Self { + KnownRecord::LexiconsMySpoorLogSession(Box::new(record_data.into())) + } +} +impl Into for KnownRecord { + fn into(self) -> atrium_api::types::Unknown { + atrium_api::types::TryIntoUnknown::try_into_unknown(&self).unwrap() + } +}