// @generated by jacquard-lexicon. DO NOT EDIT. // // Lexicon: org.hyperboards.displayProfile // // This file was automatically generated from Lexicon schemas. // Any manual changes will be overwritten on the next regeneration. #[allow(unused_imports)] use alloc::collections::BTreeMap; #[allow(unused_imports)] use core::marker::PhantomData; use jacquard_common::{BosStr, CowStr, DefaultStr, FromStaticStr}; #[allow(unused_imports)] use jacquard_common::deps::codegen::unicode_segmentation::UnicodeSegmentation; use jacquard_common::deps::smol_str::SmolStr; use jacquard_common::types::collection::{Collection, RecordError}; use jacquard_common::types::string::{AtUri, Cid, Datetime, UriValue}; use jacquard_common::types::uri::{RecordUri, UriError}; use jacquard_common::types::value::Data; use jacquard_common::xrpc::XrpcResp; use jacquard_derive::{IntoStatic, lexicon, open_union}; use jacquard_lexicon::lexicon::LexiconDoc; use jacquard_lexicon::schema::LexiconSchema; use crate::org_hypercerts::SmallImage; use crate::org_hypercerts::SmallVideo; use crate::org_hypercerts::Uri; #[allow(unused_imports)] use jacquard_lexicon::validation::{ConstraintError, ValidationPath}; use serde::{Deserialize, Serialize}; /// User-declared visual presentation defaults for how a contributor appears on hyperboards. Stored in the contributor's own PDS and reusable across multiple boards. #[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, IntoStatic)] #[serde( rename_all = "camelCase", rename = "org.hyperboards.displayProfile", tag = "$type", bound(deserialize = "S: Deserialize<'de> + BosStr") )] pub struct DisplayProfile { /// Client-declared timestamp when this record was originally created. pub created_at: Datetime, /// Display name override for this user on hyperboards. #[serde(skip_serializing_if = "Option::is_none")] pub display_name: Option, /// Default hover iframe URL for this user across boards. #[serde(skip_serializing_if = "Option::is_none")] pub hover_iframe_url: Option>, /// Default hover image for this user across boards, as a URI or image blob. #[serde(skip_serializing_if = "Option::is_none")] pub hover_image: Option>, /// Avatar or face image override for this user on hyperboards, as a URI or image blob. #[serde(skip_serializing_if = "Option::is_none")] pub image: Option>, /// Default click-through link URL for this user across boards. #[serde(skip_serializing_if = "Option::is_none")] pub url: Option>, /// Default video for this user across boards, as a URI (embed/direct link) or uploaded video blob. #[serde(skip_serializing_if = "Option::is_none")] pub video: Option>, #[serde( flatten, default, deserialize_with = "deserialize_display_profile_extra_data", skip_serializing_if = "Option::is_none" )] pub extra_data: Option>>, } #[open_union] #[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, IntoStatic)] #[serde(tag = "$type", bound(deserialize = "S: Deserialize<'de> + BosStr"))] pub enum DisplayProfileHoverImage { #[serde(rename = "org.hypercerts.defs#uri")] Uri(Box>), #[serde(rename = "org.hypercerts.defs#smallImage")] SmallImage(Box>), } #[open_union] #[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, IntoStatic)] #[serde(tag = "$type", bound(deserialize = "S: Deserialize<'de> + BosStr"))] pub enum DisplayProfileImage { #[serde(rename = "org.hypercerts.defs#uri")] Uri(Box>), #[serde(rename = "org.hypercerts.defs#smallImage")] SmallImage(Box>), } #[open_union] #[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, IntoStatic)] #[serde(tag = "$type", bound(deserialize = "S: Deserialize<'de> + BosStr"))] pub enum DisplayProfileVideo { #[serde(rename = "org.hypercerts.defs#uri")] Uri(Box>), #[serde(rename = "org.hypercerts.defs#smallVideo")] SmallVideo(Box>), } /// Typed wrapper for GetRecord response with this collection's record type. #[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, IntoStatic)] #[serde(rename_all = "camelCase")] pub struct DisplayProfileGetRecordOutput { #[serde(skip_serializing_if = "Option::is_none")] pub cid: Option>, pub uri: AtUri, pub value: DisplayProfile, } impl DisplayProfile { pub fn uri(uri: S) -> Result, UriError> { RecordUri::try_from_uri(AtUri::new(uri)?) } } /// Marker type for deserializing records from this collection. #[derive(Debug, Serialize, Deserialize)] pub struct DisplayProfileRecord; impl XrpcResp for DisplayProfileRecord { const NSID: &'static str = "org.hyperboards.displayProfile"; const ENCODING: &'static str = "application/json"; type Output = DisplayProfileGetRecordOutput; type Err = RecordError; } impl From> for DisplayProfile { fn from(output: DisplayProfileGetRecordOutput) -> Self { output.value } } impl Collection for DisplayProfile { const NSID: &'static str = "org.hyperboards.displayProfile"; type Record = DisplayProfileRecord; } impl Collection for DisplayProfileRecord { const NSID: &'static str = "org.hyperboards.displayProfile"; type Record = DisplayProfileRecord; } impl LexiconSchema for DisplayProfile { fn nsid() -> &'static str { "org.hyperboards.displayProfile" } fn def_name() -> &'static str { "main" } fn lexicon_doc() -> LexiconDoc<'static> { lexicon_doc_org_hyperboards_displayProfile() } fn validate(&self) -> Result<(), ConstraintError> { if let Some(ref value) = self.display_name { #[allow(unused_comparisons)] if ::len(value.as_ref()) > 640usize { return Err(ConstraintError::MaxLength { path: ValidationPath::from_field("display_name"), max: 640usize, actual: ::len(value.as_ref()), }); } } if let Some(ref value) = self.display_name { { let count = UnicodeSegmentation::graphemes(value.as_ref(), true).count(); if count > 64usize { return Err(ConstraintError::MaxGraphemes { path: ValidationPath::from_field("display_name"), max: 64usize, actual: count, }); } } } if let Some(ref value) = self.hover_iframe_url { #[allow(unused_comparisons)] if ::len(value.as_ref()) > 2048usize { return Err(ConstraintError::MaxLength { path: ValidationPath::from_field("hover_iframe_url"), max: 2048usize, actual: ::len(value.as_ref()), }); } } if let Some(ref value) = self.url { #[allow(unused_comparisons)] if ::len(value.as_ref()) > 2048usize { return Err(ConstraintError::MaxLength { path: ValidationPath::from_field("url"), max: 2048usize, actual: ::len(value.as_ref()), }); } } Ok(()) } } fn deserialize_display_profile_extra_data<'de, S, D>( deserializer: D, ) -> Result>>, D::Error> where S: BosStr + serde::Deserialize<'de>, D: serde::Deserializer<'de>, { let mut data = >> as serde::Deserialize<'de>>::deserialize(deserializer)?; if let Some(extra_data) = &mut data { extra_data.remove("$type"); if extra_data.is_empty() { data = None; } } Ok(data) } pub mod display_profile_state { pub use crate::builder_types::{IsSet, IsUnset, Set, Unset}; #[allow(unused)] use ::core::marker::PhantomData; mod sealed { pub trait Sealed {} } /// State trait tracking which required fields have been set pub trait State: sealed::Sealed { type CreatedAt; } /// Empty state - all required fields are unset pub struct Empty(()); impl sealed::Sealed for Empty {} impl State for Empty { type CreatedAt = Unset; } ///State transition - sets the `created_at` field to Set pub struct SetCreatedAt(PhantomData St>); impl sealed::Sealed for SetCreatedAt {} impl State for SetCreatedAt { type CreatedAt = Set; } /// Marker types for field names #[allow(non_camel_case_types)] pub mod members { ///Marker type for the `created_at` field pub struct created_at(()); } } /// Builder for constructing an instance of this type. pub struct DisplayProfileBuilder { _state: PhantomData St>, _fields: ( Option, Option, Option>, Option>, Option>, Option>, Option>, ), _type: PhantomData S>, } impl DisplayProfile { /// Create a new builder for this type, using the default string type (DefaultStr = SmolStr) if needed pub fn new() -> DisplayProfileBuilder { DisplayProfileBuilder::new() } } impl DisplayProfile { /// Create a new builder for this type pub fn builder() -> DisplayProfileBuilder { DisplayProfileBuilder::builder() } } impl DisplayProfileBuilder { /// Create a new builder with all fields unset, using the default string type, if needed pub fn new() -> Self { DisplayProfileBuilder { _state: PhantomData, _fields: (None, None, None, None, None, None, None), _type: PhantomData, } } } impl DisplayProfileBuilder { /// Create a new builder with all fields unset pub fn builder() -> Self { DisplayProfileBuilder { _state: PhantomData, _fields: (None, None, None, None, None, None, None), _type: PhantomData, } } } impl DisplayProfileBuilder where St: display_profile_state::State, St::CreatedAt: display_profile_state::IsUnset, { /// Set the `createdAt` field (required) pub fn created_at( mut self, value: impl Into, ) -> DisplayProfileBuilder, S> { self._fields.0 = Option::Some(value.into()); DisplayProfileBuilder { _state: PhantomData, _fields: self._fields, _type: PhantomData, } } } impl DisplayProfileBuilder { /// Set the `displayName` field (optional) pub fn display_name(mut self, value: impl Into>) -> Self { self._fields.1 = value.into(); self } /// Set the `displayName` field to an Option value (optional) pub fn maybe_display_name(mut self, value: Option) -> Self { self._fields.1 = value; self } } impl DisplayProfileBuilder { /// Set the `hoverIframeUrl` field (optional) pub fn hover_iframe_url(mut self, value: impl Into>>) -> Self { self._fields.2 = value.into(); self } /// Set the `hoverIframeUrl` field to an Option value (optional) pub fn maybe_hover_iframe_url(mut self, value: Option>) -> Self { self._fields.2 = value; self } } impl DisplayProfileBuilder { /// Set the `hoverImage` field (optional) pub fn hover_image(mut self, value: impl Into>>) -> Self { self._fields.3 = value.into(); self } /// Set the `hoverImage` field to an Option value (optional) pub fn maybe_hover_image(mut self, value: Option>) -> Self { self._fields.3 = value; self } } impl DisplayProfileBuilder { /// Set the `image` field (optional) pub fn image(mut self, value: impl Into>>) -> Self { self._fields.4 = value.into(); self } /// Set the `image` field to an Option value (optional) pub fn maybe_image(mut self, value: Option>) -> Self { self._fields.4 = value; self } } impl DisplayProfileBuilder { /// Set the `url` field (optional) pub fn url(mut self, value: impl Into>>) -> Self { self._fields.5 = value.into(); self } /// Set the `url` field to an Option value (optional) pub fn maybe_url(mut self, value: Option>) -> Self { self._fields.5 = value; self } } impl DisplayProfileBuilder { /// Set the `video` field (optional) pub fn video(mut self, value: impl Into>>) -> Self { self._fields.6 = value.into(); self } /// Set the `video` field to an Option value (optional) pub fn maybe_video(mut self, value: Option>) -> Self { self._fields.6 = value; self } } impl DisplayProfileBuilder where St: display_profile_state::State, St::CreatedAt: display_profile_state::IsSet, { /// Build the final struct. pub fn build(self) -> DisplayProfile { DisplayProfile { created_at: self._fields.0.unwrap(), display_name: self._fields.1, hover_iframe_url: self._fields.2, hover_image: self._fields.3, image: self._fields.4, url: self._fields.5, video: self._fields.6, extra_data: Default::default(), } } /// Build the final struct with custom extra_data. pub fn build_with_data(self, extra_data: BTreeMap>) -> DisplayProfile { DisplayProfile { created_at: self._fields.0.unwrap(), display_name: self._fields.1, hover_iframe_url: self._fields.2, hover_image: self._fields.3, image: self._fields.4, url: self._fields.5, video: self._fields.6, extra_data: Some(extra_data), } } } fn lexicon_doc_org_hyperboards_displayProfile() -> LexiconDoc<'static> { use alloc::collections::BTreeMap; #[allow(unused_imports)] use jacquard_common::{CowStr, deps::smol_str::SmolStr, types::blob::MimeType}; use jacquard_lexicon::lexicon::*; LexiconDoc { lexicon: Lexicon::Lexicon1, id: CowStr::new_static("org.hyperboards.displayProfile"), defs: { let mut map = BTreeMap::new(); map.insert( SmolStr::new_static("main"), LexUserType::Record(LexRecord { description: Some( CowStr::new_static( "User-declared visual presentation defaults for how a contributor appears on hyperboards. Stored in the contributor's own PDS and reusable across multiple boards.", ), ), key: Some(CowStr::new_static("literal:self")), record: LexRecordRecord::Object(LexObject { required: Some(vec![SmolStr::new_static("createdAt")]), properties: { #[allow(unused_mut)] let mut map = BTreeMap::new(); map.insert( SmolStr::new_static("createdAt"), LexObjectProperty::String(LexString { description: Some( CowStr::new_static( "Client-declared timestamp when this record was originally created.", ), ), format: Some(LexStringFormat::Datetime), ..Default::default() }), ); map.insert( SmolStr::new_static("displayName"), LexObjectProperty::String(LexString { description: Some( CowStr::new_static( "Display name override for this user on hyperboards.", ), ), max_length: Some(640usize), max_graphemes: Some(64usize), ..Default::default() }), ); map.insert( SmolStr::new_static("hoverIframeUrl"), LexObjectProperty::String(LexString { description: Some( CowStr::new_static( "Default hover iframe URL for this user across boards.", ), ), format: Some(LexStringFormat::Uri), max_length: Some(2048usize), ..Default::default() }), ); map.insert( SmolStr::new_static("hoverImage"), LexObjectProperty::Union(LexRefUnion { description: Some( CowStr::new_static( "Default hover image for this user across boards, as a URI or image blob.", ), ), refs: vec![ CowStr::new_static("org.hypercerts.defs#uri"), CowStr::new_static("org.hypercerts.defs#smallImage") ], ..Default::default() }), ); map.insert( SmolStr::new_static("image"), LexObjectProperty::Union(LexRefUnion { description: Some( CowStr::new_static( "Avatar or face image override for this user on hyperboards, as a URI or image blob.", ), ), refs: vec![ CowStr::new_static("org.hypercerts.defs#uri"), CowStr::new_static("org.hypercerts.defs#smallImage") ], ..Default::default() }), ); map.insert( SmolStr::new_static("url"), LexObjectProperty::String(LexString { description: Some( CowStr::new_static( "Default click-through link URL for this user across boards.", ), ), format: Some(LexStringFormat::Uri), max_length: Some(2048usize), ..Default::default() }), ); map.insert( SmolStr::new_static("video"), LexObjectProperty::Union(LexRefUnion { description: Some( CowStr::new_static( "Default video for this user across boards, as a URI (embed/direct link) or uploaded video blob.", ), ), refs: vec![ CowStr::new_static("org.hypercerts.defs#uri"), CowStr::new_static("org.hypercerts.defs#smallVideo") ], ..Default::default() }), ); map }, ..Default::default() }), ..Default::default() }), ); map }, ..Default::default() } }