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"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "4c95c10ba0b00a02636238b814946408b1322d5ac4760326e6fb8ec956d85775"
|
checksum = "4c95c10ba0b00a02636238b814946408b1322d5ac4760326e6fb8ec956d85775"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "bincode"
|
||||||
|
version = "1.3.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad"
|
||||||
|
dependencies = [
|
||||||
|
"serde",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "clap"
|
name = "clap"
|
||||||
version = "4.5.21"
|
version = "4.5.21"
|
||||||
@ -129,7 +138,9 @@ name = "proj"
|
|||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
|
"bincode",
|
||||||
"clap",
|
"clap",
|
||||||
|
"serde",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -141,6 +152,26 @@ dependencies = [
|
|||||||
"proc-macro2",
|
"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]]
|
[[package]]
|
||||||
name = "strsim"
|
name = "strsim"
|
||||||
version = "0.11.1"
|
version = "0.11.1"
|
||||||
|
@ -7,6 +7,11 @@ publish = false
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
anyhow = "1.0"
|
anyhow = "1.0"
|
||||||
|
bincode = "1.3"
|
||||||
|
|
||||||
|
[dependencies.serde]
|
||||||
|
version = "1.0"
|
||||||
|
features = ["derive"]
|
||||||
|
|
||||||
[dependencies.clap]
|
[dependencies.clap]
|
||||||
version = "4.5"
|
version = "4.5"
|
||||||
|
37
src/main.rs
37
src/main.rs
@ -1,12 +1,10 @@
|
|||||||
mod dirs;
|
mod dirs;
|
||||||
|
|
||||||
|
|
||||||
use std::ffi::OsStr;
|
|
||||||
use std::fs;
|
use std::fs;
|
||||||
use std::io::{Read, Write};
|
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
|
|
||||||
use anyhow::{bail, ensure, Result};
|
use anyhow::{ensure, Result};
|
||||||
use clap::{Parser, Subcommand};
|
use clap::{Parser, Subcommand};
|
||||||
|
|
||||||
|
|
||||||
@ -26,7 +24,7 @@ enum Command {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#[derive(Debug, Default)]
|
#[derive(Debug, Default, serde::Serialize, serde::Deserialize)]
|
||||||
struct Projects {
|
struct Projects {
|
||||||
list: Vec<PathBuf>,
|
list: Vec<PathBuf>,
|
||||||
}
|
}
|
||||||
@ -81,18 +79,13 @@ fn list_projects(projects: &Projects) -> Result<()> {
|
|||||||
fn write_projects_file(projects: &Projects) -> Result<()> {
|
fn write_projects_file(projects: &Projects) -> Result<()> {
|
||||||
let projects_file = dirs::data_path().join("projects");
|
let projects_file = dirs::data_path().join("projects");
|
||||||
|
|
||||||
let mut file = fs::OpenOptions::new()
|
let file = fs::OpenOptions::new()
|
||||||
.write(true)
|
.write(true)
|
||||||
.create(true)
|
.create(true)
|
||||||
.truncate(true)
|
.truncate(true)
|
||||||
.open(projects_file)?;
|
.open(projects_file)?;
|
||||||
|
|
||||||
for project_path in &projects.list {
|
bincode::serialize_into(file, projects)?;
|
||||||
let os_str = project_path.as_os_str();
|
|
||||||
let bytes = os_str.as_encoded_bytes();
|
|
||||||
file.write_all(bytes)?;
|
|
||||||
file.write_all(b"\n")?;
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
@ -105,24 +98,8 @@ fn read_projects_file() -> Result<Projects> {
|
|||||||
return Ok(Projects::default());
|
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();
|
Ok(projects)
|
||||||
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 })
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user