Rework alias system
This commit is contained in:
50
src/catalog.rs
Normal file
50
src/catalog.rs
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
// (catalog_name, (username, password))
|
||||||
|
pub type CatalogDefinition<'a> = (&'a str, Login<'a>);
|
||||||
|
pub type Login<'a> = Option<(&'a str, &'a str)>;
|
||||||
|
|
||||||
|
pub static ALIASES: &[(&str, CatalogDefinition)] = &[
|
||||||
|
("DS_WS1617", ("16w-diskrete-strukturen", None)),
|
||||||
|
("EIDI_WS1617", ("eidi1-2016", Some(("eidi-2016", "PGdP.16")))),
|
||||||
|
("ERA_WS1617", ("era-2016", None)),
|
||||||
|
|
||||||
|
("GAD_SS17", ("17s-grundlagen-algorithmen-und-datenstrukturen", None)),
|
||||||
|
("LA_SS17", ("17s-lineare-algebra-fuer-informatik", None)),
|
||||||
|
// EIST is on a Nextcloud
|
||||||
|
];
|
||||||
|
|
||||||
|
pub static ALIAS_ALIASES: &[(&str, &str)] = &[
|
||||||
|
("DS", "DS_WS1617"),
|
||||||
|
("EIDI", "EIDI_WS1617"),
|
||||||
|
("ERA", "ERA_WS1617"),
|
||||||
|
|
||||||
|
("GAD", "GAD_SS17"),
|
||||||
|
("LA", "LA_SS17"),
|
||||||
|
];
|
||||||
|
|
||||||
|
pub fn resolve_alias(mut query: &str) -> Option<CatalogDefinition> {
|
||||||
|
for &(alias_alias, alias) in ALIAS_ALIASES {
|
||||||
|
if query == alias_alias {
|
||||||
|
query = alias;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for &(alias_name, def) in ALIASES {
|
||||||
|
if query == alias_name {
|
||||||
|
return Some(def);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
None
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn check_alias_aliases() {
|
||||||
|
for &(alias, _) in ALIAS_ALIASES {
|
||||||
|
assert!(resolve_alias(alias).is_some());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
40
src/main.rs
40
src/main.rs
@@ -7,6 +7,8 @@ extern crate lazy_static;
|
|||||||
extern crate reqwest;
|
extern crate reqwest;
|
||||||
extern crate zip;
|
extern crate zip;
|
||||||
|
|
||||||
|
mod catalog;
|
||||||
|
|
||||||
use std::env;
|
use std::env;
|
||||||
use std::process::Command;
|
use std::process::Command;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
@@ -23,7 +25,7 @@ use reqwest::header::{Cookie, Charset, SetCookie};
|
|||||||
use reqwest::header::{ContentDisposition, DispositionType, DispositionParam};
|
use reqwest::header::{ContentDisposition, DispositionType, DispositionParam};
|
||||||
use zip::ZipArchive;
|
use zip::ZipArchive;
|
||||||
|
|
||||||
use catalogs::*;
|
use catalog::*;
|
||||||
|
|
||||||
// TODO: Old "Publish To Go" packages get sweeped from the server and you have to request a new one;
|
// TODO: Old "Publish To Go" packages get sweeped from the server and you have to request a new one;
|
||||||
// Implement this
|
// Implement this
|
||||||
@@ -31,20 +33,6 @@ use catalogs::*;
|
|||||||
// TODO: Add aliases with semester postfix so other can contribute aliases; move to separate file
|
// TODO: Add aliases with semester postfix so other can contribute aliases; move to separate file
|
||||||
// split into files in general?
|
// split into files in general?
|
||||||
|
|
||||||
mod catalogs {
|
|
||||||
type Login = Option<(&'static str, &'static str)>;
|
|
||||||
type CatalogDef = (&'static str, Login);
|
|
||||||
|
|
||||||
// (catalog_name, (username, password))
|
|
||||||
pub const DS: CatalogDef = ("16w-diskrete-strukturen", None);
|
|
||||||
pub const EIDI: CatalogDef = ("eidi1-2016", Some(("eidi-2016", "PGdP.16")));
|
|
||||||
pub const ERA: CatalogDef = ("era-2016", None);
|
|
||||||
|
|
||||||
pub const GAD: CatalogDef = ("17s-grundlagen-algorithmen-und-datenstrukturen", None);
|
|
||||||
pub const LA: CatalogDef = ("17s-lineare-algebra-fuer-informatik", None);
|
|
||||||
// EIST is on a Nextcloud
|
|
||||||
}
|
|
||||||
|
|
||||||
const MAX_RETRIES: u8 = 10;
|
const MAX_RETRIES: u8 = 10;
|
||||||
|
|
||||||
lazy_static! {
|
lazy_static! {
|
||||||
@@ -266,22 +254,16 @@ fn main() {
|
|||||||
.takes_value(true))
|
.takes_value(true))
|
||||||
.get_matches();
|
.get_matches();
|
||||||
|
|
||||||
let catalog_def = match matches.value_of("CATALOG_NAME").unwrap() {
|
let catalog_name = matches.value_of("CATALOG_NAME").unwrap();
|
||||||
"DS" => DS,
|
let login = if let Some(username) = matches.value_of("username") {
|
||||||
"EIDI" => EIDI,
|
let password = matches.value_of("password").unwrap();
|
||||||
"ERA" => ERA,
|
Some((username, password))
|
||||||
"GAD" => GAD,
|
} else {
|
||||||
"LA" => LA,
|
None
|
||||||
n => {
|
|
||||||
if let Some(username) = matches.value_of("username") {
|
|
||||||
let password = matches.value_of("password").unwrap();
|
|
||||||
(n, Some((username, password)))
|
|
||||||
} else {
|
|
||||||
(n, None)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let catalog_def = resolve_alias(catalog_name).unwrap_or((catalog_name, login));
|
||||||
|
|
||||||
let out_dir = Path::new(matches.value_of("OUTPUT_DIRECTORY").unwrap());
|
let out_dir = Path::new(matches.value_of("OUTPUT_DIRECTORY").unwrap());
|
||||||
if out_dir.exists() {
|
if out_dir.exists() {
|
||||||
assert!(out_dir.is_dir());
|
assert!(out_dir.is_dir());
|
||||||
|
Reference in New Issue
Block a user