diff --git a/.idea/dictionaries/drewshort.xml b/.idea/dictionaries/drewshort.xml new file mode 100644 index 0000000..f97c0a0 --- /dev/null +++ b/.idea/dictionaries/drewshort.xml @@ -0,0 +1,8 @@ + + + + anime + animeboxes + + + \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 9ef8679..678a066 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6,6 +6,7 @@ version = "0.1.0" dependencies = [ "chrono", "clap", + "lazy_static", "serde", "serde_json", ] @@ -84,6 +85,12 @@ version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8b7a7c0c47db5545ed3fef7468ee7bb5b74691498139e4b3f6a20685dc6dd8e" +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + [[package]] name = "libc" version = "0.2.70" diff --git a/Cargo.toml b/Cargo.toml index 128de4b..fe7ed0c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,5 +14,6 @@ incremental = false [dependencies] chrono = { version = "0.4.11", features = ["serde"] } clap = "2.33.1" +lazy_static = "1.4.0" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index b9c2c41..89f141a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,23 +1,51 @@ use clap::{App, Arg}; +use lazy_static::lazy_static; use serde_json::from_reader; use std::error::Error; use std::fs::File; use std::io::BufReader; use std::path::Path; +use std::process::exit; const VERSION: Option<&'static str> = option_env!("CARGO_PKG_VERSION"); +lazy_static! { + static ref COMMANDS: Vec<&'static str> = vec!["print", "searches", "favorites"]; +} mod model; fn read_animeboxes_backup>( path: P, -) -> Result> { +) -> Result> { let file = File::open(path)?; let reader = BufReader::new(file); - let result: model::AnimeBoxesBackup = from_reader(reader)?; + let result: model::anime_boxes::Backup = from_reader(reader)?; Ok(result) } +fn searches_command(backup: model::anime_boxes::Backup) { + let mut searches: Vec = backup + .search_history + .iter() + .map(|s| String::from(&s.search_text)) + .collect(); + searches.sort(); + for search in searches { + println!("{}", search); + } +} + +fn favorites_command(backup: model::anime_boxes::Backup) { + let mut favorites: Vec = backup + .favorites + .iter() + .map(|f| String::from(&f.file.url)) + .collect(); + for favorite in favorites { + println!("{}", favorite); + } +} + fn main() { let matches = App::new("AnimeBoxes Sync") .version(VERSION.unwrap_or("UNKNOWN")) @@ -36,12 +64,31 @@ fn main() { .required(true) .index(1), ) + .arg( + Arg::with_name("COMMAND") + .help("The command to run on the backup") + .required(true) + .index(2) + .possible_values(&COMMANDS), + ) .get_matches(); let config = matches.value_of("config").unwrap_or("abs-default.conf"); let path = matches.value_of("INPUT").unwrap(); + let result = read_animeboxes_backup(path).unwrap(); - let result = read_animeboxes_backup(path); - - println!("{:#?}", result.unwrap()) + let command = matches.value_of("COMMAND").unwrap(); + match command { + "favorites" => { + favorites_command(result); + } + "print" => println!("{:#?}", result), + "searches" => { + searches_command(result); + } + _ => { + println!("{} is unrecognized", command); + exit(1) + } + } } diff --git a/src/model.rs b/src/model.rs index 51f5c4b..415021e 100644 --- a/src/model.rs +++ b/src/model.rs @@ -1,117 +1,119 @@ -use chrono::DateTime; -use serde::{Deserialize, Serialize}; +pub mod anime_boxes { + use chrono::DateTime; + use serde::{Deserialize, Serialize}; -#[derive(Serialize, Deserialize, Debug)] -#[serde(deny_unknown_fields)] -pub struct AnimeBoxesBackup { - #[serde(rename(serialize = "backupTime", deserialize = "backupTime"))] - backup_time: DateTime, - #[serde(rename(serialize = "backupVersion", deserialize = "backupVersion"))] - backup_version: String, - #[serde(rename(serialize = "bannedTags", deserialize = "bannedTags"))] - banned_tags: Vec, - #[serde(rename(serialize = "creatorName", deserialize = "creatorName"))] - creator_name: String, - #[serde(rename(serialize = "creatorVersion", deserialize = "creatorVersion"))] - creator_version: String, - favorites: Vec, - #[serde(rename(serialize = "searchHistory", deserialize = "searchHistory"))] - search_history: Vec, - servers: Vec, -} + #[derive(Serialize, Deserialize, Debug)] + #[serde(deny_unknown_fields)] + pub struct Backup { + #[serde(rename(serialize = "backupTime", deserialize = "backupTime"))] + pub backup_time: DateTime, + #[serde(rename(serialize = "backupVersion", deserialize = "backupVersion"))] + pub backup_version: String, + #[serde(rename(serialize = "bannedTags", deserialize = "bannedTags"))] + pub banned_tags: Vec, + #[serde(rename(serialize = "creatorName", deserialize = "creatorName"))] + pub creator_name: String, + #[serde(rename(serialize = "creatorVersion", deserialize = "creatorVersion"))] + pub creator_version: String, + pub favorites: Vec, + #[serde(rename(serialize = "searchHistory", deserialize = "searchHistory"))] + pub search_history: Vec, + pub servers: Vec, + } -#[derive(Serialize, Deserialize, Debug)] -#[serde(deny_unknown_fields)] -struct AnimeBoxesFavorite { - #[serde(rename(serialize = "dateAdded", deserialize = "dateAdded"))] - date_added: DateTime, - #[serde(rename(serialize = "disableStorage", deserialize = "disableStorage"))] - disable_storage: bool, - #[serde(rename( - serialize = "enforceOriginalImage", - deserialize = "enforceOriginalImage" - ))] - enforce_original_image: bool, - file: AnimeBoxesRemoteResource, - has_children: bool, - has_comments: bool, - has_notes: bool, - #[serde(rename(serialize = "imageIsVisible", deserialize = "imageIsVisible"))] - image_is_visible: bool, - #[serde(rename(serialize = "isFavorite", deserialize = "isFavorite"))] - is_favorite: bool, - #[serde(rename(serialize = "isVisible", deserialize = "isVisible"))] - is_visible: bool, - jpeg: AnimeBoxesRemoteResource, - md5: String, - parent_id: String, - #[serde(rename(serialize = "ppostId", deserialize = "ppostId"))] - ppost_id: String, - #[serde(rename(serialize = "ppostUrl", deserialize = "ppostUrl"))] - ppost_url: String, - preview: AnimeBoxesRemoteResource, - rating: String, - sample: AnimeBoxesRemoteResource, - score: i16, - source: String, - tag_artist: String, - tag_character: String, - tag_copyright: String, - tag_general: String, - tags: String, -} + #[derive(Serialize, Deserialize, Debug)] + #[serde(deny_unknown_fields)] + pub struct Favorite { + #[serde(rename(serialize = "dateAdded", deserialize = "dateAdded"))] + pub date_added: DateTime, + #[serde(rename(serialize = "disableStorage", deserialize = "disableStorage"))] + pub disable_storage: bool, + #[serde(rename( + serialize = "enforceOriginalImage", + deserialize = "enforceOriginalImage" + ))] + pub enforce_original_image: bool, + pub file: RemoteResource, + pub has_children: bool, + pub has_comments: bool, + pub has_notes: bool, + #[serde(rename(serialize = "imageIsVisible", deserialize = "imageIsVisible"))] + pub image_is_visible: bool, + #[serde(rename(serialize = "isFavorite", deserialize = "isFavorite"))] + pub is_favorite: bool, + #[serde(rename(serialize = "isVisible", deserialize = "isVisible"))] + pub is_visible: bool, + pub jpeg: RemoteResource, + pub md5: String, + pub parent_id: String, + #[serde(rename(serialize = "ppostId", deserialize = "ppostId"))] + pub ppost_id: String, + #[serde(rename(serialize = "ppostUrl", deserialize = "ppostUrl"))] + pub ppost_url: String, + pub preview: RemoteResource, + pub rating: String, + pub sample: RemoteResource, + pub score: i16, + pub source: String, + pub tag_artist: String, + pub tag_character: String, + pub tag_copyright: String, + pub tag_general: String, + pub tags: String, + } -#[derive(Serialize, Deserialize, Debug)] -#[serde(deny_unknown_fields)] -struct AnimeBoxesRemoteResource { - #[serde(rename(serialize = "contentType", deserialize = "contentType"))] - content_type: i8, - ext: String, - height: i16, - url: String, - width: i16, -} + #[derive(Serialize, Deserialize, Debug)] + #[serde(deny_unknown_fields)] + pub struct RemoteResource { + #[serde(rename(serialize = "contentType", deserialize = "contentType"))] + pub content_type: i8, + pub ext: String, + pub height: i16, + pub url: String, + pub width: i16, + } -#[derive(Serialize, Deserialize, Debug)] -#[serde(deny_unknown_fields)] -struct AnimeBoxesSearch { - #[serde(rename(serialize = "itemId", deserialize = "itemId"))] - item_id: i32, - #[serde(rename(serialize = "searchDate", deserialize = "searchDate"))] - search_date: DateTime, - #[serde(rename(serialize = "searchText", deserialize = "searchText"))] - search_text: String, - starred: bool, -} + #[derive(Serialize, Deserialize, Debug)] + #[serde(deny_unknown_fields)] + pub struct Search { + #[serde(rename(serialize = "itemId", deserialize = "itemId"))] + pub item_id: i32, + #[serde(rename(serialize = "searchDate", deserialize = "searchDate"))] + pub search_date: DateTime, + #[serde(rename(serialize = "searchText", deserialize = "searchText"))] + pub search_text: String, + pub starred: bool, + } -#[derive(Serialize, Deserialize, Debug)] -#[serde(deny_unknown_fields)] -struct AnimeBoxesServer { - #[serde(rename(serialize = "apikey", deserialize = "apikey"))] - api_key: String, - #[serde(rename(serialize = "isDefault", deserialize = "isDefault"))] - is_default: bool, - #[serde(rename(serialize = "isSelected", deserialize = "isSelected"))] - is_selected: bool, - password: String, - #[serde(rename(serialize = "passwordKey", deserialize = "passwordKey"))] - password_key: String, - #[serde(rename(serialize = "ratingFilterEnabled", deserialize = "ratingFilterEnabled"))] - rating_filter_enabled: bool, - #[serde(rename(serialize = "realURL", deserialize = "realURL"))] - real_url: String, - #[serde(rename(serialize = "serverId", deserialize = "serverId"))] - server_id: i16, - #[serde(rename(serialize = "serverName", deserialize = "serverName"))] - server_name: String, - #[serde(rename(serialize = "type", deserialize = "type"))] - type_: i16, - url: String, - #[serde(rename( - serialize = "useNativeAutocomplete", - deserialize = "useNativeAutocomplete" - ))] - use_native_autocomplete: bool, - #[serde(rename(serialize = "userName", deserialize = "userName"))] - user_name: String, + #[derive(Serialize, Deserialize, Debug)] + #[serde(deny_unknown_fields)] + pub struct Server { + #[serde(rename(serialize = "apikey", deserialize = "apikey"))] + pub api_key: String, + #[serde(rename(serialize = "isDefault", deserialize = "isDefault"))] + pub is_default: bool, + #[serde(rename(serialize = "isSelected", deserialize = "isSelected"))] + pub is_selected: bool, + pub password: String, + #[serde(rename(serialize = "passwordKey", deserialize = "passwordKey"))] + pub password_key: String, + #[serde(rename(serialize = "ratingFilterEnabled", deserialize = "ratingFilterEnabled"))] + pub rating_filter_enabled: bool, + #[serde(rename(serialize = "realURL", deserialize = "realURL"))] + pub real_url: String, + #[serde(rename(serialize = "serverId", deserialize = "serverId"))] + pub server_id: i16, + #[serde(rename(serialize = "serverName", deserialize = "serverName"))] + pub server_name: String, + #[serde(rename(serialize = "type", deserialize = "type"))] + pub server_type: i16, + pub url: String, + #[serde(rename( + serialize = "useNativeAutocomplete", + deserialize = "useNativeAutocomplete" + ))] + pub use_native_autocomplete: bool, + #[serde(rename(serialize = "userName", deserialize = "userName"))] + pub user_name: String, + } }