aboutsummaryrefslogtreecommitdiffstats
path: root/src/main.rs
blob: 09ac1dd69f0082a5e15b4d5cfd9d5f5bb4c4de37 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
// Copyright © 2018 Teddy Wing
//
// This file is part of Meetup Find Events RSS.
//
// Meetup Find Events RSS is free software: you can redistribute it
// and/or modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation, either version 3 of
// the License, or (at your option) any later version.
//
// Meetup Find Events RSS is distributed in the hope that it will be
// useful, but WITHOUT ANY WARRANTY; without even the implied warranty
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Meetup Find Events RSS. If not, see
// <http://www.gnu.org/licenses/>.

#[macro_use]
extern crate error_chain;
extern crate getopts;

extern crate meetup_find_events_rss;

use getopts::Options;

use std::env;
use std::process::exit;

use meetup_find_events_rss::build_rss;

mod errors {
    error_chain! {}
}

use errors::*;

fn main() {
    if let Err(ref e) = run() {
        use error_chain::ChainedError;

        eprintln!("{}", e.display_chain());
        exit(1);
    }
}

fn print_usage(opts: Options) {
    let brief = "usage: meetup-find-events-rss";
    print!("{}", opts.usage(&brief));
}

fn run() -> Result<()> {
    let args: Vec<String> = env::args().collect();

    let mut opts = Options::new();
    opts.reqopt(
        "",
        "meetup-api-token",
        "Meetup.com API token (required)",
        "TOKEN"
    );
    opts.reqopt(
        "",
        "latitude",
        "Origin latitude (required)",
        "LATITUDE",
    );
    opts.reqopt(
        "",
        "longitude",
        "Origin longitude (required)",
        "LONGITUDE",
    );
    opts.reqopt(
        "",
        "end-date",
        "Search for events from now until DATE (e.g. \"2018-01-31\") (required)",
        "DATE",
    );
    opts.optflag("h", "help", "print this help menu");

    let opt_matches = match opts.parse(&args[1..]) {
        Ok(m) => m,
        Err(f) => {
            if args.contains(&"-h".to_owned()) ||
                    args.contains(&"--help".to_owned()) {
                print_usage(opts);

                return Ok(());
            }

            eprintln!("meetup-find-events-rss: error: {}", f.to_string());
            exit(1);
        },
    };

    if opt_matches.opt_present("h") {
        print_usage(opts);

        return Ok(());
    }

    let meetup_token = opt_matches.opt_str("meetup-api-token").unwrap();
    let latitude = opt_matches.opt_str("latitude").unwrap();
    let longitude = opt_matches.opt_str("longitude").unwrap();
    let end_date = opt_matches.opt_str("end-date").unwrap();

    build_rss::write_feed(
        meetup_token,
        latitude,
        longitude,
        end_date,
        None,
        None,
    ).chain_err(|| "could not write RSS feed.")?;

    Ok(())
}