feat(core): Use bincode instead of serializing OsStr
This commit is contained in:
parent
26e31c280b
commit
276a76e957
31
Cargo.lock
generated
31
Cargo.lock
generated
@ -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"
|
||||
|
@ -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"
|
||||
|
37
src/main.rs
37
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<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)
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user