notedeck

One damus client to rule them all
git clone git://jb55.com/notedeck
Log | Files | Refs | README | LICENSE

commit a3e975d133de5204307c3879636adcbb092d0b1b
parent 07c6b27493560c81b925172a769be3229bae4b1d
Author: kernelkind <kernelkind@gmail.com>
Date:   Mon,  3 Feb 2025 17:29:36 -0500

implement TextBuffer -> PostBuffer downcasting

Signed-off-by: kernelkind <kernelkind@gmail.com>

Diffstat:
Mcrates/notedeck_columns/src/post.rs | 20++++++++++++++++++++
1 file changed, 20 insertions(+), 0 deletions(-)

diff --git a/crates/notedeck_columns/src/post.rs b/crates/notedeck_columns/src/post.rs @@ -2,7 +2,9 @@ use egui::TextBuffer; use enostr::{FullKeypair, Pubkey}; use nostrdb::{Note, NoteBuilder, NoteReply}; use std::{ + any::TypeId, collections::{BTreeMap, HashMap, HashSet}, + hash::{DefaultHasher, Hash, Hasher}, ops::Range, }; use tracing::error; @@ -351,6 +353,18 @@ impl PostBuffer { } } +pub fn downcast_post_buffer(buffer: &dyn TextBuffer) -> Option<&PostBuffer> { + let mut hasher = DefaultHasher::new(); + TypeId::of::<PostBuffer>().hash(&mut hasher); + let post_id = hasher.finish() as usize; + + if buffer.type_id() == post_id { + unsafe { Some(&*(buffer as *const dyn TextBuffer as *const PostBuffer)) } + } else { + None + } +} + pub struct PostOutput { pub text: String, pub mentions: Vec<Pubkey>, @@ -555,6 +569,12 @@ impl TextBuffer for PostBuffer { } } } + + fn type_id(&self) -> usize { + let mut hasher = DefaultHasher::new(); + TypeId::of::<PostBuffer>().hash(&mut hasher); + hasher.finish() as usize + } } fn first_is_desired_char(text: &str, desired: char) -> bool {