image base64 + json write

This commit is contained in:
2026-03-06 15:47:29 +01:00
parent 51f6b5bfab
commit 0b9daf395d
4 changed files with 203 additions and 3 deletions

74
Cargo.lock generated
View File

@ -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"

74
rklipd/Cargo.lock generated
View File

@ -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"

View File

@ -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"

View File

@ -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<u8>), // png storage
#[serde(with = "base64_vec")]
Image(Vec<u8>),
}
mod base64_vec {
use serde::{Deserialize, Deserializer, Serializer};
pub fn serialize<S: Serializer>(v: &Vec<u8>, serializer: S) -> Result<S::Ok, S::Error> {
let base64_str = base64::encode(v);
serializer.serialize_str(&base64_str)
}
pub fn deserialize<'de, D: Deserializer<'de>>(deserializer: D) -> Result<Vec<u8>, 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<dyn Error>> {
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<dyn Error>> {
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<Self, Box<dyn Error>> {
let data = fs::read_to_string(path)?;
let entry: ClipboardEntry = serde_json::from_str(&data)?;
Ok(entry)
}
}