Browse Source

Save/load event file on the same place everywhere

master
Julio Biason 4 years ago
parent
commit
c666169720
  1. 95
      Cargo.lock
  2. 1
      Cargo.toml
  3. 35
      src/eventlist.rs
  4. 4
      src/main.rs

95
Cargo.lock generated

@ -18,6 +18,18 @@ dependencies = [
"winapi",
]
[[package]]
name = "arrayref"
version = "0.3.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544"
[[package]]
name = "arrayvec"
version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cff77d8686867eceff3105329d4698d96c2391c176d5d03adc90c7389162b5b8"
[[package]]
name = "atty"
version = "0.2.14"
@ -35,17 +47,34 @@ version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d"
[[package]]
name = "base64"
version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b41b7ea54a0c9d92199de89e20e58d49f02f8e699814ef3fdf266f6f748d15c7"
[[package]]
name = "bitflags"
version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693"
[[package]]
name = "blake2b_simd"
version = "0.5.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d8fb2d74254a3a0b5cac33ac9f8ed0e44aa50378d9dbb2e5d83bd21ed1dc2c8a"
dependencies = [
"arrayref",
"arrayvec",
"constant_time_eq",
]
[[package]]
name = "cfg-if"
version = "0.1.10"
version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
checksum = "b486ce3ccf7ffd79fdeb678eac06a9e6c09fc88d33836340becb8fffe87c5e33"
[[package]]
name = "chrono"
@ -74,6 +103,44 @@ dependencies = [
"vec_map",
]
[[package]]
name = "constant_time_eq"
version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc"
[[package]]
name = "crossbeam-utils"
version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8"
dependencies = [
"autocfg",
"cfg-if",
"lazy_static",
]
[[package]]
name = "dirs"
version = "3.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2fddc3610d8f9552384e06ebc87f714e1d0b2b64a99194d2faf36d7ae5f48549"
dependencies = [
"cfg-if",
"dirs-sys",
]
[[package]]
name = "dirs-sys"
version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8e93d7f5705de3e49895a2b5e0b8855a1c27f080192ae9c32a6432d50741a57a"
dependencies = [
"libc",
"redox_users",
"winapi",
]
[[package]]
name = "env_logger"
version = "0.7.1"
@ -239,6 +306,17 @@ version = "0.1.56"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84"
[[package]]
name = "redox_users"
version = "0.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "09b23093265f8d200fa7b4c2c76297f47e681c655f6f1285a8780d6a022f7431"
dependencies = [
"getrandom",
"redox_syscall",
"rust-argon2",
]
[[package]]
name = "regex"
version = "1.3.7"
@ -257,6 +335,18 @@ version = "0.6.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7fe5bd57d1d7414c6b5ed48563a2c855d995ff777729dcd91c369ec7fea395ae"
[[package]]
name = "rust-argon2"
version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2bc8af4bda8e1ff4932523b94d3dd20ee30a87232323eda55903ffd71d2fb017"
dependencies = [
"base64",
"blake2b_simd",
"constant_time_eq",
"crossbeam-utils",
]
[[package]]
name = "serde"
version = "1.0.104"
@ -344,6 +434,7 @@ version = "0.1.0"
dependencies = [
"chrono",
"clap",
"dirs",
"env_logger",
"log",
"serde",

1
Cargo.toml

@ -8,6 +8,7 @@ edition = "2018"
[dependencies]
chrono = { version = "0.4", features = ["serde"] }
clap = "2.33"
dirs = "3.0"
env_logger = "0.7"
log = "*"
serde = "*"

35
src/eventlist.rs

@ -16,9 +16,12 @@
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
use std::ffi::OsString;
use std::fs::File;
use std::io::{Read, Write};
use std::path::PathBuf;
use dirs::config_dir;
use serde_derive::Deserialize;
use serde_derive::Serialize;
use toml;
@ -47,6 +50,7 @@ pub struct EventListIterator<'a> {
pub enum EventListError {
InvalidDate,
TooOld,
NoStorage,
}
impl From<EventError> for EventListError {
@ -65,15 +69,15 @@ impl EventList {
}
// TODO hide this
pub fn load() -> Self {
if let Ok(mut fp) = File::open(FILENAME) {
pub fn load() -> Result<Self, EventListError> {
if let Ok(mut fp) = File::open(EventList::event_file()?) {
let mut content = String::new();
fp.read_to_string(&mut content)
.expect("Your event file is corrupted");
// TODO remove toml
toml::from_str(&content).unwrap_or(EventList::empty())
Ok(toml::from_str(&content).unwrap_or(EventList::empty()))
} else {
EventList::empty()
Ok(EventList::empty())
}
}
@ -84,22 +88,23 @@ impl EventList {
// TODO turn this into the destructor
// TODO if so, track changes
pub fn save(&self) {
pub fn save(&self) -> Result<(), EventListError> {
// TODO remove toml
let content = toml::to_string(&self).unwrap();
if let Ok(mut fp) = File::create(FILENAME) {
if let Ok(mut fp) = File::create(EventList::event_file()?) {
fp.write_all(content.as_bytes()).unwrap();
}
Ok(())
}
/// Load the event list, add an all day event, and save it back.
/// Returns the ID of the new event.
pub fn add_event_with_date(description: &str, date: &Date) -> Result<String, EventListError> {
let mut list = EventList::load();
let mut list = EventList::load()?;
let event = Event::new_on_date(description, date)?;
let id = String::from(&event.id);
list.push(event);
list.save();
list.save()?;
Ok(id)
}
@ -109,13 +114,23 @@ impl EventList {
description: &str,
datetime: &DateTime,
) -> Result<String, EventListError> {
let mut list = EventList::load();
let mut list = EventList::load()?;
let event = Event::new_on_date_time(description, datetime)?;
let id = String::from(&event.id);
list.push(event);
list.save();
list.save()?;
Ok(id)
}
/// Full path for the event file.
fn event_file() -> Result<OsString, EventListError> {
let base = config_dir().ok_or(EventListError::NoStorage)?;
let mut path = PathBuf::new();
path.push(base);
path.push(FILENAME);
Ok(path.into_os_string())
}
}
impl<'a> IntoIterator for &'a EventList {

4
src/main.rs

@ -52,7 +52,9 @@ fn main() {
}
fn list() {
let event_list = EventList::load(); // TODO hide load from outside
// TODO hide load from outside
// TODO unwrap
let event_list = EventList::load().unwrap();
println!("{:^8} | {:^7} | {}", "ID", "ETA", "Description");
// TODO: EventList::iter()
for event in event_list.into_iter() {

Loading…
Cancel
Save