From 276a76e9574007a3102c5817ea97dc7eee016e9e Mon Sep 17 00:00:00 2001 From: Patrick Auernig Date: Sat, 23 Nov 2024 14:23:18 +0100 Subject: [PATCH] feat(core): Use bincode instead of serializing OsStr --- Cargo.lock | 31 +++++++++++++++++++++++++++++++ Cargo.toml | 5 +++++ src/main.rs | 37 +++++++------------------------------ 3 files changed, 43 insertions(+), 30 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7981f42..0251732 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -57,6 +57,15 @@ version = "1.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c95c10ba0b00a02636238b814946408b1322d5ac4760326e6fb8ec956d85775" +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + [[package]] name = "clap" version = "4.5.21" @@ -129,7 +138,9 @@ name = "proj" version = "0.1.0" dependencies = [ "anyhow", + "bincode", "clap", + "serde", ] [[package]] @@ -141,6 +152,26 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "serde" +version = "1.0.215" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.215" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "strsim" version = "0.11.1" diff --git a/Cargo.toml b/Cargo.toml index fb16fe3..406c5e7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,6 +7,11 @@ publish = false [dependencies] anyhow = "1.0" +bincode = "1.3" + +[dependencies.serde] +version = "1.0" +features = ["derive"] [dependencies.clap] version = "4.5" diff --git a/src/main.rs b/src/main.rs index f21fce4..255bee7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,12 +1,10 @@ mod dirs; -use std::ffi::OsStr; use std::fs; -use std::io::{Read, Write}; use std::path::PathBuf; -use anyhow::{bail, ensure, Result}; +use anyhow::{ensure, Result}; use clap::{Parser, Subcommand}; @@ -26,7 +24,7 @@ enum Command { } -#[derive(Debug, Default)] +#[derive(Debug, Default, serde::Serialize, serde::Deserialize)] struct Projects { list: Vec, } @@ -81,18 +79,13 @@ fn list_projects(projects: &Projects) -> Result<()> { fn write_projects_file(projects: &Projects) -> Result<()> { let projects_file = dirs::data_path().join("projects"); - let mut file = fs::OpenOptions::new() + let file = fs::OpenOptions::new() .write(true) .create(true) .truncate(true) .open(projects_file)?; - for project_path in &projects.list { - let os_str = project_path.as_os_str(); - let bytes = os_str.as_encoded_bytes(); - file.write_all(bytes)?; - file.write_all(b"\n")?; - } + bincode::serialize_into(file, projects)?; Ok(()) } @@ -105,24 +98,8 @@ fn read_projects_file() -> Result { return Ok(Projects::default()); } - let mut file = std::fs::File::open(projects_file)?; + let file = std::fs::File::open(projects_file)?; + let projects = bincode::deserialize_from(file)?; - let mut buf = Vec::new(); - file.read_to_end(&mut buf)?; - - - let list = buf - .split(|&x| x == b'\n') - .filter_map(|chunk| { - // FIXME: not a good idea to store the OsStr - let os_str = unsafe { OsStr::from_encoded_bytes_unchecked(chunk) }; - if os_str.is_empty() { - None - } else { - Some(PathBuf::from(os_str)) - } - }) - .collect(); - - Ok(Projects { list }) + Ok(projects) }