summaryrefslogtreecommitdiffstats
path: root/src/actions/new.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/actions/new.rs')
-rw-r--r--src/actions/new.rs358
1 files changed, 0 insertions, 358 deletions
diff --git a/src/actions/new.rs b/src/actions/new.rs
deleted file mode 100644
index e75dd34..0000000
--- a/src/actions/new.rs
+++ /dev/null
@@ -1,358 +0,0 @@
-use crate::calendars;
-use crate::cursorfile;
-use crate::defaults;
-use crate::icalwrap::{IcalTime, IcalVCalendar};
-use crate::khline::KhLine;
-use crate::utils::{fileutil, misc};
-use crate::KhResult;
-use std::path::PathBuf;
-use structopt::StructOpt;
-
-#[derive(Debug, StructOpt)]
-pub struct NewArgs {
- /// the calendar
- #[structopt(name = "calendar")]
- pub calendar: String,
- /// from
- #[structopt(name = "from")]
- pub from: String,
- /// to
- #[structopt(name = "to")]
- pub to: String,
- /// summary
- #[structopt(name = "summary")]
- pub summary: String,
- /// location
- #[structopt(name = "location")]
- pub location: String,
-}
-
-struct EventProperties {
- calendar: String,
- from: IcalTime,
- to: IcalTime,
- summary: String,
- location: String,
-}
-
-impl EventProperties {
- fn parse_from_args(args: &NewArgs) -> KhResult<EventProperties> {
- let calendar = EventProperties::parse_calendar(&args.calendar)?;
- let from = EventProperties::parse_from(&args.from)?;
- let to = EventProperties::parse_to(&args.to)?;
- let summary = EventProperties::parse_summary(&args.summary)?;
- let location = EventProperties::parse_location(&args.location)?;
- Ok(EventProperties {
- calendar,
- from,
- to,
- summary,
- location,
- })
- }
-
- fn parse_from(arg: &str) -> KhResult<IcalTime> {
- if arg.is_empty() {
- Err("no start date/time given")?
- };
- let time = arg.parse::<IcalTime>()?;
- Ok(time)
- }
-
- fn parse_to(arg: &str) -> KhResult<IcalTime> {
- if arg.is_empty() {
- Err("no end date/time given")?
- };
- let time = arg.parse::<IcalTime>()?;
- Ok(time)
- }
-
- fn parse_location(arg: &str) -> KhResult<String> {
- if arg.is_empty() {
- Err("no location given")?
- };
- Ok(arg.to_string())
- }
-
- fn parse_summary(arg: &str) -> KhResult<String> {
- if arg.is_empty() {
- Err("no summary given")?
- };
- Ok(arg.to_string())
- }
-
- fn parse_calendar(arg: &str) -> KhResult<String> {
- if arg.is_empty() {
- Err("no calendar given")?
- };
- let cal = arg.to_string();
- if !calendars::calendar_list().contains(&cal) {
- Err("calendar does not exist")?
- }
- Ok(cal)
- }
-}
-
-pub fn do_new(args: &NewArgs) -> KhResult<()> {
- let uid = misc::make_new_uid();
- let ep = EventProperties::parse_from_args(args)?;
-
- let path = assemble_file_path(&ep.calendar, &uid);
-
- let new_cal = IcalVCalendar::from_str(TEMPLATE_EVENT, Some(&path))?
- .with_uid(&uid)?
- .with_dtstamp_now()
- .with_last_modified_now()
- .with_eventprops(&ep);
-
- let khline = KhLine::from(&new_cal);
-
- fileutil::write_cal(&new_cal)?;
-
- cursorfile::write_cursorfile(&khline.to_string())?;
- khprintln!("{}", khline);
-
- Ok(())
-}
-
-fn assemble_file_path(cal_name: &String, uid: &String ) -> PathBuf {
- let mut path = defaults::get_caldir();
- path.push(cal_name);
- path.push(uid);
- path.set_extension("ics");
- path
-}
-
-impl IcalVCalendar {
- fn with_eventprops(self, ep: &EventProperties) -> Self {
- self
- .with_dtstart(&ep.from)
- .with_dtend(&ep.to)
- .with_summary(&ep.summary)
- .with_location(&ep.location)
- }
-}
-
-static TEMPLATE_EVENT: &str = indoc!(
- "
- BEGIN:VCALENDAR
- VERSION:2.0
- PRODID:-//khaleesi //EN
- BEGIN:VTIMEZONE
- TZID:Europe/Berlin
- BEGIN:STANDARD
- DTSTART:19711025T030000
- TZOFFSETFROM:+0200
- TZOFFSETTO:+0100
- RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
- END:STANDARD
- BEGIN:DAYLIGHT
- DTSTART:19710329T020000
- TZOFFSETFROM:+0100
- TZOFFSETTO:+0200
- RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3
- END:DAYLIGHT
- END:VTIMEZONE
- BEGIN:VEVENT
- SUMMARY:<<EDIT ME>>
- LOCATION:<<EDIT ME>>
- DTSTART;TZID=Europe/Berlin;VALUE=DATE-TIME:20181026T133000
- DTEND;TZID=Europe/Berlin;VALUE=DATE-TIME:20181026T160000
- DTSTAMP;VALUE=DATE-TIME:20181022T145405Z
- UID:foo
- END:VEVENT
- END:VCALENDAR
-"
-);
-
-#[cfg(test)]
-mod integration {
- use assert_fs::prelude::*;
- use predicates::prelude::*;
-
- use super::*;
- use crate::testdata;
- use crate::testutils;
-
- #[test]
- fn test_parse_calendar() {
- let _testdir = testutils::prepare_testdir("testdir_two_cals");
- let calendar = EventProperties::parse_calendar("first").unwrap();
- assert_eq!("first", calendar);
- }
-
- #[test]
- fn test_parse_calendar_neg() {
- let _testdir = testutils::prepare_testdir("testdir_two_cals");
- let calendar = EventProperties::parse_calendar("");
- assert!(calendar.is_err());
- let calendar = EventProperties::parse_calendar("foo");
- assert!(calendar.is_err());
- }
-
- #[test]
- fn test_parse_location() {
- let location = EventProperties::parse_location("room 101").unwrap();
- assert_eq!("room 101", location);
- }
-
- #[test]
- fn test_parse_location_neg() {
- let location = EventProperties::parse_location("");
- assert!(location.is_err());
- }
-
- #[test]
- fn test_parse_summary() {
- let summary = EventProperties::parse_summary("first").unwrap();
- assert_eq!("first", summary);
- }
-
- #[test]
- fn test_parse_summary_neg() {
- let summary = EventProperties::parse_summary("");
- assert!(summary.is_err());
- }
-
- #[test]
- fn test_parse_from() {
- testdata::setup();
- let from = EventProperties::parse_from("2017-07-14T17:45:00").unwrap();
- let expected = IcalTime::floating_ymd(2017, 7, 14).and_hms(17, 45, 0);
- assert_eq!(expected, from);
- }
-
- #[test]
- fn test_parse_from_neg() {
- let from = EventProperties::parse_from("blödsinn");
- assert!(from.is_err());
- let from = EventProperties::parse_from("");
- assert!(from.is_err());
- }
-
- #[test]
- fn test_parse_to() {
- testdata::setup();
- let to = EventProperties::parse_to("2017-07-14T17:45:00").unwrap();
- let expected = IcalTime::floating_ymd(2017, 7, 14).and_hms(17, 45, 0);
- assert_eq!(expected, to);
- }
-
- #[test]
- fn test_parse_to_neg() {
- let to = EventProperties::parse_to("quatsch");
- assert!(to.is_err());
- let to = EventProperties::parse_to("");
- assert!(to.is_err());
- }
-
- #[test]
- fn test_parse_from_args() {
- let _testdir = testutils::prepare_testdir("testdir_two_cals");
- let args = NewArgs {
- calendar: "second".to_string(),
- from: "2017-11-03T12:30:00".to_string(),
- to: "2017-11-07T11:11:00".to_string(),
- summary: "summary text".to_string(),
- location: "location text".to_string(),
- };
- let ep = EventProperties::parse_from_args(&args).unwrap();
- assert_eq!("second".to_string(), ep.calendar);
- assert_eq!("summary text".to_string(), ep.summary);
- assert_eq!("location text".to_string(), ep.location);
- }
-
- //#[test]
- //fn test_parse_from_args_neg() {
- // let args = &["1", "2", "3", "4"];
- // let ep = EventProperties::parse_from_args(args);
- // assert!(ep.is_err());
- //}
-
- #[test]
- fn test_with_eventprops() {
- testdata::setup();
-
- let calendar = "foo".to_string();
- let from = IcalTime::floating_ymd(2015, 04, 17).and_hms(8, 17, 3);
- let to = IcalTime::floating_ymd(2015, 05, 17).and_hms(8, 17, 3);
- let summary = "summary";
- let location = "home";
- let ep = EventProperties {
- calendar,
- from: from.clone(),
- to: to.clone(),
- summary: summary.to_string(),
- location: location.to_string(),
- };
-
- let _testdir = testutils::prepare_testdir("testdir");
- let khline = "twodaysacrossbuckets.ics".parse::<KhLine>().unwrap();
-
- let cal = khline.to_cal().unwrap().with_eventprops(&ep);
-
- let event = cal.get_principal_khevent();
- assert_eq!(Some(from), event.get_start());
- assert_eq!(Some(to), event.get_end());
- assert_eq!(summary, event.get_summary().unwrap());
- assert_eq!(location, event.get_location().unwrap());
- }
-
- #[test]
- fn test_do_new() {
- testdata::setup();
- let testdir = testutils::prepare_testdir("testdir_two_cals");
-
- let args = NewArgs {
- calendar: "second".to_string(),
- from: "2017-11-03T12:30:00".to_string(),
- to: "2017-11-07T11:11:00".to_string(),
- summary: "summary text".to_string(),
- location: "location text".to_string(),
- };
-
- let result = do_new(&args);
- assert!(result.is_ok());
-
- let expected = indoc!(
- "
- BEGIN:VCALENDAR
- VERSION:2.0
- PRODID:-//khaleesi //EN
- BEGIN:VTIMEZONE
- TZID:Europe/Berlin
- BEGIN:STANDARD
- DTSTART:19711025T030000
- TZOFFSETFROM:+0200
- TZOFFSETTO:+0100
- RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
- END:STANDARD
- BEGIN:DAYLIGHT
- DTSTART:19710329T020000
- TZOFFSETFROM:+0100
- TZOFFSETTO:+0200
- RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3
- END:DAYLIGHT
- END:VTIMEZONE
- BEGIN:VEVENT
- SUMMARY:summary text
- LOCATION:location text
- DTSTART;TZID=Europe/Berlin:20171103T123000
- DTEND;TZID=Europe/Berlin:20171107T111100
- DTSTAMP:20130101T010203Z
- UID:11111111-2222-3333-4444-444444444444@khaleesi
- LAST-MODIFIED:20130101T010203Z
- END:VEVENT
- END:VCALENDAR
- "
- )
- .replace("\n", "\r\n");
- let predicate = predicate::str::similar(expected);
- testdir
- .child(".khaleesi/cal/second/11111111-2222-3333-4444-444444444444@khaleesi.ics")
- .assert(predicate);
-
- let cursor_expected = "1509708600 second/11111111-2222-3333-4444-444444444444@khaleesi.ics";
- testdir.child(".khaleesi/cursor").assert(cursor_expected);
- }
-}