From 0b9daf395d70c2131ec1aff725b95067f8ecd694 Mon Sep 17 00:00:00 2001 From: zeefaad Date: Fri, 6 Mar 2026 15:47:29 +0100 Subject: [PATCH] image base64 + json write --- Cargo.lock | 74 +++++++++++++++++++++++++++++++++++++++++++++++ rklipd/Cargo.lock | 74 +++++++++++++++++++++++++++++++++++++++++++++++ rklipd/Cargo.toml | 4 +++ rklipd/src/lib.rs | 54 ++++++++++++++++++++++++++++++++-- 4 files changed, 203 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 56f6b41..0b0fc44 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -133,6 +133,12 @@ dependencies = [ "arrayvec", ] +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + [[package]] name = "bit_field" version = "0.10.3" @@ -475,6 +481,12 @@ dependencies = [ "either", ] +[[package]] +name = "itoa" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" + [[package]] name = "jobserver" version = "0.1.34" @@ -977,7 +989,11 @@ name = "rklipd" version = "0.1.0" dependencies = [ "arboard", + "base64", "image", + "serde", + "serde_json", + "serde_millis", ] [[package]] @@ -1005,6 +1021,58 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_millis" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e2dc780ca5ee2c369d1d01d100270203c4ff923d2a4264812d723766434d00" +dependencies = [ + "serde", +] + [[package]] name = "shlex" version = "1.3.0" @@ -1298,6 +1366,12 @@ dependencies = [ "syn", ] +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" + [[package]] name = "zune-core" version = "0.4.12" diff --git a/rklipd/Cargo.lock b/rklipd/Cargo.lock index 58f9d3e..e5d5ec2 100644 --- a/rklipd/Cargo.lock +++ b/rklipd/Cargo.lock @@ -133,6 +133,12 @@ dependencies = [ "arrayvec", ] +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + [[package]] name = "bit_field" version = "0.10.3" @@ -475,6 +481,12 @@ dependencies = [ "either", ] +[[package]] +name = "itoa" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" + [[package]] name = "jobserver" version = "0.1.34" @@ -969,7 +981,11 @@ name = "rklipd" version = "0.1.0" dependencies = [ "arboard", + "base64", "image", + "serde", + "serde_json", + "serde_millis", ] [[package]] @@ -997,6 +1013,58 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_millis" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e2dc780ca5ee2c369d1d01d100270203c4ff923d2a4264812d723766434d00" +dependencies = [ + "serde", +] + [[package]] name = "shlex" version = "1.3.0" @@ -1290,6 +1358,12 @@ dependencies = [ "syn", ] +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" + [[package]] name = "zune-core" version = "0.4.12" diff --git a/rklipd/Cargo.toml b/rklipd/Cargo.toml index 85aa409..a115434 100644 --- a/rklipd/Cargo.toml +++ b/rklipd/Cargo.toml @@ -6,3 +6,7 @@ edition = "2024" [dependencies] arboard = "3.6.1" image = "0.25.9" +serde = {version = "1.0.228", features = ["derive"]} +serde_json = "1.0.149" +serde_millis = "0.1.1" +base64 = "0.22.1" diff --git a/rklipd/src/lib.rs b/rklipd/src/lib.rs index d6f135a..18cfa4b 100644 --- a/rklipd/src/lib.rs +++ b/rklipd/src/lib.rs @@ -1,16 +1,43 @@ use arboard::{Clipboard, ImageData}; -use image::codecs::png::{PngDecoder, PngEncoder}; -use image::{ColorType, DynamicImage, ExtendedColorType, ImageEncoder, RgbaImage}; +use image::codecs::png::PngEncoder; +use image::{ExtendedColorType, ImageEncoder}; +use serde::{Deserialize, Serialize}; +use std::fs::{self, File}; +use std::io::Write; +use std::path::Path; +use std::result::Result; use std::{error::Error, time::SystemTime}; +#[derive(Serialize, Deserialize, Debug)] pub struct ClipboardEntry { pub content: ClipboardData, + #[serde(with = "serde_millis")] pub timestamp: SystemTime, } +#[derive(Serialize, Deserialize, Debug)] pub enum ClipboardData { Text(String), - Image(Vec), // png storage + #[serde(with = "base64_vec")] + Image(Vec), +} + +mod base64_vec { + use serde::{Deserialize, Deserializer, Serializer}; + pub fn serialize(v: &Vec, serializer: S) -> Result { + let base64_str = base64::encode(v); + serializer.serialize_str(&base64_str) + } + pub fn deserialize<'de, D: Deserializer<'de>>(deserializer: D) -> Result, D::Error> { + let base64_str = String::deserialize(deserializer)?; + match base64::decode(base64_str) { + Ok(bytes) => Ok(bytes), + Err(error_base64) => { + let error_serde = serde::de::Error::custom(error_base64); + Err(error_serde) + } + } + } } pub trait ImageDataExt { @@ -61,4 +88,25 @@ impl ClipboardEntry { timestamp: SystemTime::now(), }) } + + pub fn new_json(path: &str) -> Result<(), Box> { + if Path::new(path).exists() { + Err("File already exists.".into()) + } else { + File::create(path)?; + Ok(()) + } + } + pub fn write_entry_json(&self, path: &str) -> Result<(), Box> { + let json = serde_json::to_string_pretty(self)?; + let mut file = File::create(path)?; + file.write_all(json.as_bytes())?; + Ok(()) + } + + pub fn read_entry_json(path: &str) -> Result> { + let data = fs::read_to_string(path)?; + let entry: ClipboardEntry = serde_json::from_str(&data)?; + Ok(entry) + } }