feat(core): Use bincode instead of serializing OsStr

This commit is contained in:
Patrick Auernig 2024-11-23 14:23:18 +01:00
parent 26e31c280b
commit 276a76e957
3 changed files with 43 additions and 30 deletions

31
Cargo.lock generated
View File

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

View File

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

View File

@ -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<PathBuf>,
}
@ -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<Projects> {
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)
}